CasperJS, pour des tests d'intégration propres comme un drap blanc

Problématique

Dans le bon déroulement d’un projet Web, la première peur qui naît – au fur et à mesure que les développements avancent – est que le code que l’on est en train de taper détruise en conséquence, une autre partie de l’application. Pour remédier à cela, l’équipe de développement met en place des tests de non-régression. Comme l’informaticien cherche à optimiser ses efforts, ces tests sont rapidement automatisés et inclus dans l’outil de construction du build (Ant, Maven, etc.).

Dans le cas d’une application multi-tiers, si les tests unitaires du côté du serveur sont souvent bien maîtrisés à l’aide d’outils comme JUnit, Fest Assert ou Mockito, ceux impliquant la couche de présentation le sont souvent beaucoup moins, surtout depuis l’arrivée des frameworks Javascript comme JQuery, AngularJS, EmberJS, etc. qui modifient la page de manière dynamique. On ne peut plus se cantonner à tester le contenu de la page JSP renvoyée par le serveur ou les flux http qui transitent comme c’était encore possible il y a quelques années sur des architectures MVC serveur classiques (String MVC, Struts, JSF).

Il existe bien des applications simulant un utilisateur derrière son écran mais elles ont des limites d’utilisation importantes :

  • monopolisation du poste pendant les tests,
  • difficultés pour tester le contenu de la page,
  • dépendance forte avec la position exacte des éléments à l’écran, etc.

L’idéal serait de pouvoir écrire un programme de test qui puisse manipuler le navigateur internet en s’adressant directement au DOM, modèle d’objets dynamiques de l’application côté client, un outil de test unitaire avec un moteur Webkit intégré permettant d’écrire des ordres de type “cliquer sur le bouton valider” .

Parmi les outils ayant ces fonctionnalités, j’ai testé CasperJS. Il permet de :

  • définir et commander la navigation par étapes,
  • remplir et soumettre des formulaires,
  • cliquer et suivre les liens,
  • faire des captures d’écran d’une page (ou une partie de celle-ci),
  • tester le DOM,
  • tracer des messages de log,
  • télécharger des ressources, y compris des fichiers binaires,
  • écrire des suites de tests fonctionnels, enregistrer les résultats en tant que JUnit XML,
  • tester le contenu de la page Web.

Comment installer CasperJS ?

CasperJS est une surcouche de PhantomJS (proposant des méthodes d’assertion à l’instar de JUnit. Ils se présentent tous les deux sous la forme d’un exécutable. Pour bénéficier des possibilités de l’outil et automatiser ces tests fonctionnels, il faut donc installer ces deux outils sur chaque poste de développement. L’ensemble ne fait pas plus de 10Mo.

Une solution alternative serait d’effectuer ces tests pendant l’intégration continue, limitant ainsi l’installation de ces programmes au seul serveur d’intégration. Cependant, on comprend rapidement que l’on perd une partie des bénéfices des tests en ne détectant les erreurs qu’après le commit (gênant aussi si on veut faire du déploiement continu).

PhantomJS se télécharge sur le site officiel. L’installation est manuelle, il faut :

  • dézipper la dernière version Windows dans un répertoire,
  • ajouter ce répertoire au PATH,
  • télécharger et dézipper CasperJS ,
  • ajouter ensuite casperjs\bin au PATH.

NB : Python n’est pas nécessaire pour la version Windows.

Ceci est l’une des méthodes d’installation, il en existe d’autres décrites sur le site officiel, comme GIT ou NodeJS.

Débuter avec CasperJS

Dans CasperJS, navigation et tests sont distincts. Il est possible d’écrire un script de test unitaire de vos librairies Javascript sans naviguer dans votre application, bien que la force de CasperJS réside dans l’union de la navigation et des tests.

En peu de temps, mon premier fichier de test est prêt, il effectue une dizaine de tests simples sur la page d’identification.

Les méthodes d’assertion sont assez nombreuses pour effectuer des tests parlant sur l’affichage des pages, l’URL, le titre, le contenu, etc. Cependant, il est parfois impossible d’utiliser directement certaines méthodes de CasperJS (par exemple celles des modules clientutils et utils) et il faut contourner le problème en utilisant la fonction evaluate ou assertEval. L’usage indispensable de ces fonctions alourdit le code et le rend plus confus alors qu’on aurait aimé s’en passer.

Comment monter une suite de tests

On comprend très vite que si l’on souhaite effectuer une batterie de tests sur une application, il est indispensable de pouvoir diviser ces tests en plusieurs fichiers, chaque fichier permettant par exemple de tester une story ou un use case. Il suffit pour cela de donner à CasperJS le répertoire contenant l’ensemble des fichiers tests.

Chaque fichier doit être indépendant car il n’est pas possible de donner à CasperJS l’ordre d’exécution, cependant, le langage est si simple et concis que ce n’est pas une contrainte majeure. On peut par exemple tester de manière approfondie l’identification de l’utilisateur dans un script puis ne garder que les lignes indispensables (remplir les champs, cliquer sur les boutons) pour passer la page d’identification dans les autres scripts.

Intégrer CasperJS dans Maven

Il n’existe pas de plugins CasperJS dans le référentiel Maven mais il en existe un dans GitHub développé par un programmeur indépendant. Problème : pour utiliser ce plugin, il faut l’importer, le compiler, créer un référentiel local et déclarer ce référentiel dans le pom. Ce sont des étapes loin d’être anodines pour l’utilisateur lambda de Maven et l’utilisation d’un plugin spécifique n’apporte pas grand chose par rapport à une configuration via le bon vieux plugin mojo passe-partout : “exec-maven-plugin”.

Lorsque l’on crée des tests d’intégration, on voudrait bien que le build s’arrête en cas d’échec. Or, sous Windows, l’exécutable CasperJS.exe renvoie toujours le status 0 que les tests se soient bien passés ou non. Et là, l’intégration dans Maven perd tout son sens.

Conclusion : des qualités… et des défauts

CasperJS est un outil puissant avec une prise en main rapide et permettant rapidement d’effectuer des tests fonctionnels sur une application web simple.

Il bénéficie de la puissance de PhantomJS (ou de SlimeJS) pour réaliser des tests, couvrant ainsi la majorité des navigateurs (Chrome, Firefox, Opéra…) mais il n’existe pas de moyen pour valider ces tests pour Internet Explorer, le principal navigateur grand public.

Le langage est abordable et les possibilités sont larges mais on est rapidement frustré de ne pas avoir d’IDE permettant de déboguer pas à pas et de comprendre ou de voir ce qui se passe quand le script que vous avez écrit ne fonctionne pas correctement. Heureusement, l’option –log-level=debug permet de tracer l’ensemble des actions effectuées dans PhamtomJS et d’avoir plus d’informations sur les erreurs même si ce n’est pas toujours suffisant.

Points négatifs : l’absence d’intégration native dans Maven et l’impossibilité d’utiliser le code de retour sous Windows. De plus, le fait qu’il faille installer les exécutables sur le poste pour qu’il fonctionne limite la portabilité.

En bref, CasperJS peut satisfaire des développeurs web PHP sur des projets de petite envergure mais n’a pas les atouts nécessaires pour séduire les développeurs web Java qui préféreront certainement utiliser des outils comme Sélénium.

2 commentaires

votre commentaire

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Inscription newsletter

Ne manquez plus nos derniers articles !