Fluentlenium

Comment automatiser les tests d'IHM d'une application web ? En utilisant Selenium bien sûr ! Cependant, ce dernier n'est pas toujours simple à prendre en main. Pour faciliter son utilisation, il existe une bibliothèque java (française) : Fluentlenium. Seule contrainte, écrire ses tests en java. Celle-ci s'intègre simplement avec JUnit, TestNG, etc et permet d'utiliser AssertJ entre autre. L'exemple fournit par le site présenté dans ce post intègre JUnit et AssertJ. Il est possible d'utiliser d'autres bibliothèques pour ceux qui le souhaitent.

Configuration

Son utilisation est assez simple, il suffit d'ajouter les bonnes dépendances à votre pom.xml :

	<dependency>
	    <groupId>org.fluentlenium</groupId>
	    <artifactId>fluentlenium-junit</artifactId>
	    <version>3.2.0</version>
	    <scope>test</scope>
	</dependency>
	<dependency>
	    <groupId>org.fluentlenium</groupId>
	    <artifactId>fluentlenium-assertj</artifactId>
	    <version>3.2.0</version>
	    <scope>test</scope>
	</dependency>
	<dependency>
	    <groupId>junit</groupId>
	    <artifactId>junit</artifactId>
	    <version>4.12</version>
	    <scope>test</scope>
	</dependency>
	<dependency>
	    <groupId>org.seleniumhq.selenium</groupId>
	    <artifactId>htmlunit-driver</artifactId>
	    <version>2.25</version>
	    <scope>test</scope>
	</dependency>
	<dependency>
	    <groupId>xml-apis</groupId>
	    <artifactId>xml-apis</artifactId>
	    <version>1.4.01</version>
	    <scope>test</scope>
	</dependency>
dépendances nécessaires à l'intégration de fluentlenium

Toutes ces dépendances sont nécessaires pour le bon fonctionnement de la bibliothèque et évoluent ensemble : les nouvelles versions de Fluentlenium ne sont compatibles qu'avec la version 3 de Selenium.

Par défaut, Fluentlenium utilise un driver distant pour exécuter les tests. Il est cependant possible d'installer un driver local pour voir et suivre l'exécution de ses tests. J'ai pour ma part utilisé le driver de Firefox : geckoDriver.

Si vous choisissez d'utiliser un driver web local, il faudra aussi mettre à jour ce driver en fonction de vos versions de Fluentlenium et Selenium : il y a peu voire pas de rétrocompatibilité entre ces 3 éléments (avec geckoDriver le driver de Firefox au moins). Les contraintes de compatibilité de Selenium avec geckoDriver sont indiquées sur la page Github de geckoDriver. Autre contrainte pour les utilisateurs de Firefox : la version de firefox installée doit aussi être compatible. En effet, une mise à jour de Firefox peut faire que vos tests ne s'exécutent plus correctement : il vous faudra donc mettre à jour le driver voire Selenium aussi.

Une série de versions compatibles : Fluentlenium 3.2 + Selenium 3.4 + Java 8 + GeckoDriver 0.16.1 + Firefox 53

La configuration du driver dans fluentlenium n'est pas évidente pour une raison simple : la documentation n'est pas complète à ce sujet. Pour firefox, il faut utiliser la propriété suivante :

System.setProperty("webdriver.gecko.driver", "path/to/driver");
exemple pour le driver firefox

Utilisation

Maintenant que tous nos éléments sont installés et configurés pour fonctionner ensemble, voyons comment écrire nos tests. Pour commencer, il faut créer une classe de test qui hérite de FluentTest. Puis créer une méthode de test avec l'annotation @Test :

	@Test
    public void monTest() {
        goTo("https://duckduckgo.com");
        $("#search_form_input_homepage").fill().with("FluentLenium");
        $("#search_button_homepage").submit();
        assertThat(window().title()).contains("FluentLenium");
    }
méthode de test

On remarque ici l'utilisation de sélecteurs CSS pour rechercher et atteindre des éléments de la page web. Il est possible d'utiliser les méthodes $() ou find() pour retourner une liste d'éléments de type FluentWebElement ou d'utiliser la méthode el() qui renvoie un unique élément (le premier de la page) de type FluentWebElement. À partir de cet élément, il est possible d’interagir avec votre page : en cliquant dessus, en le remplissant de texte, etc. Il est donc nécessaire d'avoir des éléments sélectionnables facilement en CSS et dont les id sont connus et fixes (et non générés automatiquement par exemple).

Fluentlenium propose aussi toute une série de filtres pour faciliter la sélection des éléments, par exemple :

$(".ma-classe", withName("test"));
$("div", withClass("ma-classe"));
$(".ma-classe", withName().contains(regex("na?me[0-9]*")));
exemples de filtres

Voir la documentation pour d'autres exemples de filtres.

L'écriture des tests se fait donc simplement avec votre bibliothèque préférée (JUnit, TestNG...) et des sélecteurs CSS pour naviguer dans les pages de votre application. Outre une configuration pas évidente, la prise en main est assez simple et il est possible d'écrire ses tests rapidement.

C'est une bibliothèque en constante évolution, qui s'adapte rapidement aux nouvelles versions de Selenium et Firefox (pour ceux qui l'utilisent avec Marionnette/geckoDriver) mais dont la documentation pourrait être plus étoffée.

Laisser un commentaire

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

Captcha *