Automatiser ses tests fonctionnels (partie 1/2)

#outil#test#usine logicielle

Il paraît normal de contrôler sur une application que la dernière modification apportée a bien été prise en compte. Par contre, parcourir à nouveau l’ensemble des pages pour vérifier qu’aucun bug n’a été généré par cette dernière mise à jour se révèle particulièrement contraignant. Pour minimiser cette charge de travail, il existe des outils d’automatisation de tests, dont nous allons présenter le mode de fonctionnement et les grands principes.

Afin de faciliter la lecture, le présent article se focalise principalement sur les architectures Web client léger ou riche (applications LAMP, J2EE et .Net avec interfaces HTML, Javascript, JQuery, CSS, Ajax…), même si la plupart des outils adressent d’autres types d’interface, notamment graphiques (Windows, Java, Flash…). Le mode de fonctionnement reste globalement le même, quelle que soit l’interface utilisateur adressée.

Tout site ou plus généralement application Web subit des évolutions au fil du temps. Si la faible volumétrie du contenu facilite considérablement les tests dans un premier temps, les mises à jour successives nécessitent des efforts de plus en plus conséquents lorsque le projet grossit, à la fois en terme de nombre de pages qu’au niveau de la richesse du contenu de chacune de ces pages. La phase la plus fastidieuse consiste alors à vérifier à nouveau sans cesse que les ajouts et modifications apportées n’ont pas engendré des régressions dans les autres parties de l’application. Par exemple, le changement de destination sur clic sur un lien hypertexte, pour accéder à une nouvelle page, peut se traduire par l’impossibilité d’accès à l’ancienne page. Pour effectuer un tel contrôle manuellement, il faut partir de la page d’accueil, et recenser toutes les pages affichées à partir d’une navigation exhaustive sur le site. De plus, les possibilités d’accès d’une page A vers une page B peuvent être multiple, complexifiant considérablement le maillage de l’arborescence du site (accès depuis le menu principal, image dans le site, résultat de recherche, bouton de validation, accès depuis le pied de page…). Cette tâche, particulièrement lourde, peut se révéler insoluble quand on souhaite par exemple valider le bon fonctionnement de son site sur la majorité des navigateurs Web encore opérationnels sur le marché.

Une première réponse aux tests manuels, les outils d’automatisation
Pour ces tâches répétitives, il existe plusieurs solutions, dont l’emploi d’outils d’automatisation de tests fonctionnels. Ceux-ci ne permettent pas de valider le bon fonctionnement d’un site ou d’une application de manière aussi poussée qu’un testeur humain, mais permettent la détection de nombreuses anomalies. Le principe de fonctionnement de ces offres est quasiment toujours le même. Le testeur démarre son outil, et lance le module d’enregistrement. A partir de ce moment, il suffit de naviguer avec la souris sur l’interface de l’application à tester, comme lors d’une navigation classique, et de parcourir l’ensemble des pages que l’on souhaite contrôler. Durant cette phase, l’outil de tests enregistre toutes les opérations effectuées par le testeur, à savoir les mouvements de souris, les clics, les saisies clavier, etc. mais également les informations liées à l’application testée. Une fois la navigation terminée, il suffit d’arrêter l’enregistreur, via généralement un bouton d’arrêt proposé en permanence en fenêtre popup au dessus du navigateur. Le scénario est alors enregistré et peut à volonté être enrichi et rejoué. Le rejeu se traduit par la réexécution du scénario enregistré lors de la création des scripts, le testeur revoyant défiler très rapidement à l’écran, sans avoir à intervenir, l’ensemble des opérations qu’il a pu effectuer initialement. Cette opération de rejeu ressemble à un « screencam », si ce n’est que l’outil de tests opère sur les objets de l’interface et non sur de simples enchaînements d’images statiques. Ceci permet à l’outil de notamment contrôler que les résultats obtenus sur l’interface testée sont les mêmes que ceux attendus. L’intérêt majeur de ce rejeu est de s’affranchir de la présence du testeur, celui-ci pouvant effectuer une pose pendant l’exécution ou bien lancer le test le soir pour analyser les résultats obtenus le lendemain matin.

Les outils d’automatisation de tests pour qui ?
Les testeurs sans aucune connaissance de la programmation peuvent utiliser certains outils d’automatisation qui proposent des assistants complets. A partir de l’enregistreur, un premier niveau de contrôle est offert, permettant notamment aux équipes utilisatrices et/ou maîtrise d’ouvrage dans les entreprises d’effectuer une première validation avant tests plus poussés. Ces derniers s’adressent plutôt aux Webmasters et intégrateurs HTML qui possèdent quelques notions de programmation Web, avec des connaissances du HTML, du Javascript, et quelques bases en PHP et en programmation SQL. Ces utilisateurs, souvent propriétaires de leur propre site Web, peuvent aller beaucoup plus loin dans l’utilisation des outils de tests fonctionnels. En effet, ceux-ci, par exemple pour les tests menés sur les applications Web, reposent sur le DOM (Document Object Model) pour les actions à effectuer sur les objets de l’interface ainsi que pour l’analyse des résultats obtenus. Enfin, seuls les informaticiens pourront pleinement exploiter le potentiel de ces outils d’automatisation de tests, notamment via la nécessité de s’interfacer avec les méthodes ou fonctions de l’application testée, par exemple en J2EE ou .Net. Il n’y a néanmoins pas de catégorie de testeur plus ciblée qu’une autre dans l’utilisation d’outils d’automatisation de tests. Les caractéristiques de l’application ou du site testé, l’objectif recherché avec l’emploi d’un outil d’automatisation ou encore le rythme et la forme des évolutions apportées à l’application sont autant de paramètres à prendre en considération avant de se lancer dans ce type de solutions.

Premiers pas avec le produit Selenium
Selenium est un outil d’automatisation de tests fonctionnels libre et gratuit. Celui-ci comprend plusieurs composants, tels Selenium IDE pour l’atelier de développement et Selenium Server pour le moteur d’exécution. Pour effectuer son premier test, le plus simple consiste à télécharger sur le site http://seleniumhq.org le plug-in Selenium IDE pour Firefox. Une fois le composant récupéré et la mise à jour de Firefox effectuée, il suffit de lancer Selenium IDE depuis la barre d’outils de Firefox. A partir cet instant, l’enregistrement démarre automatiquement. On peut naviguer sur internet, en allant par exemple sur la page d’accueil de Google, saisir « programmez » (figure 1), rechercher, puis cliquer sur le premier lien de résultat qui se traduit par l’ouverture de la page d’accueil du site Programmez.


Figure 1 : enregistrement du scénario via navigation sur le site [CLIQUER sur l’image pour l’agrandir]

L’appui sur le bouton d’arrêt d’enregistrement marque alors la création de son premier scénario de tests (figure 2).


Figure 2 : arrêt de l’enregistrement

Il est possible de rejouer celui-ci, plus ou moins rapidement. On s’aperçoit ainsi que le test rejoué lentement fonctionne parfaitement (figure 3), alors que celui rejoué à vitesse maximale génère une erreur, Selenium ne pouvant trouver le résultat de la recherche Google dans le temps d’attente alloué par l’outil (figure 4). Le résultat d’échec sera identique, même à vitesse de rejeu la plus lente, si les sites Google ou Programmez deviennent inaccessibles.


Figure 3 : lancement du rejeu et validation du bon fonctionnement


Figure 4 : erreur détectée lors du rejeu

Des tests plus poussés avec des fonctionnalités étendues
Pour aller plus loin avec Selenium, il faut passer par le composant serveur qui permet de coder directement l’ensemble de ses tests. S’il est possible d’exporter les tests conçus automatiquement depuis Selenium IDE pour par exemple les retravailler en Java sous Eclipse puis les exécuter à partir de Selenium Server, il est néanmoins regrettable que l’on ne puisse ensuite enrichir ses scripts de cette manière, la regénération depuis Selenium IDE écrasant alors les éventuels tests plus poussés qui auraient pu être ajoutés en Java. Ceci se traduit in fine, pour des tests poussés, par la mise à l’écart de Selenium IDE et l’impossibilité de profiter d’assistants pour préparer et mettre à jour plus simplement ses propres tests. S’il est ainsi possible d’utiliser le navigateur Web de son choix pour les tests, cette approche confine l’utilisation de Selenium pour des tests élaborés à une population d’informaticiens. Ces derniers pourront profiter d’un environnement unique, Eclipse par exemple, dans lequel ils pourront à la fois apporter les évolutions à leur application tout en faisant évoluer les scenarii de tests (figure 5).


Figure 5 : exemple d’utilisation de Selenium dans Eclipse, pour une application J2EE

Pour aller plus loin tout en profitant d’un environnement intégré, il est possible de s’orienter vers une offre telle que TestComplete, de l’éditeur AutomatedQA. Non représenté en France, ce qui se traduit notamment par un support exclusivement en anglais, cet outil reste simple d’approche, proposant de nombreux assistants et une notion de fenêtre unique permettant d’aller beaucoup plus loin dans les tests à partir du même outil. Pour effectuer ce test plus approfondi, prenons l’exemple d’un intranet, application transactionnelle PHP-Symfony-MySQL-JQuery au sein de laquelle la validation du contenu des pages est requise. Sur la page de pose des jours de congés, le test va consister à valider qu’à l’ouverture de la page, le bout de code initialisant à la date du jour la période de congés à poser fonctionne bien (figure 6).


Figure 6 : validation de l’interface de l’intranet Osaxis PHP-Symfony

Pour effectuer ce contrôle avec TestComplete, il suffit de lancer l’enregistrement du scénario et de naviguer sur la page de pose des jours de congés. A partir de là, l’outil voit les objets composant la page, et va ainsi permettre la récupération de la date du jour. Une comparaison avec une variable contenant le jour, le mois et l’année permet alors de poser un point de contrôle validant le bon fonctionnement de l’application sur ce point lors du rejeu (figure 7).


Figure 7 : contrôle du champ contenant la date du jour avec TestComplete

Ces tests élémentaires sont assez faciles à implémenter, les évolutions continues de l’application Web rendant cependant la maintenance et la viabilité des scénarii plus compliquées. Par exemple, lorsqu’on lance un enregistrement et que l’on sélectionne le premier lien hypertexte dans une liste, il faut bien s’assurer lors du rejeu que le lien que l’automate va actionner correspond bien à celui que l’on avait initialement sélectionné. Ainsi, dans le cadre d’un blog ou d’une liste triée, il faudra peut-être aller plus loin que de simplement sélectionner l’élément en tête de liste. Pour ce faire, une solution consiste à invoquer une URL construite par programmation, notamment si le lien recherché n’apparaît plus sur le premier bloc de la liste paginée. Autre exemple, sur de la comparaison d’images, la possibilité de définir un taux de comparaison pour estimer si une image résultat est considérée comme identique à l’image d’origine est très intéressante. Sur une photo au format JPG, un taux de ressemblance supérieur à 80% sera souvent suffisant, alors que sur un schéma GIF un taux inférieur à 95% signifiera que les deux images comparées sont différentes. Néanmoins, la problématique principale consiste à bien localiser la position de l’image avant d’effectuer la comparaison d’images, étant donné qu’il n’est pas possible de se baser exclusivement sur les coordonnées en pixels pour être sûr que l’on compare la même chose.

La seconde partie de cet article, prochainement diffusée sur le site Osaxis, présentera les grandes fonctionnalités attendues d’un outil d’automatisation de tests fonctionnels et proposera un rapide panorama des principales offres du marché.

Il est possible de retrouver l’intégralité de cet article dans le numéro 149 du mois de Février 2012 du magazine « Programmez ».