Selenium & Maven : Mise en place

Selenium est une suite d’outils permettant d’automatiser les tests des applications web sur de multiples plateformes.
Dans ce billet, je vais présenter la mise en place de Selenium RC dans un projet géré par Maven.
Nous allons commencer par créer un projet from scratch, en gardant une architecture minimale, puis nous créerons et exécuterons notre propre test.
Dans une seconde partie, nous verrons quelques points de configuration permettant d'automatiser le lancement de nos tests.

Cette suite se décompose principalement en 3 briques :

  • Selenium IDE : plugin firefox permettant d’enregistrer et jouer ses jeux de tests ;
  • Selenium Remote Control (RC) : joue les tests écrits dans un langage de programmation sur différentes plateformes ;
  • Selenium Grid : extension de selenium RC permettant de jouer les tests en parallèle.

Création du projet

Nous déléguons à Maven la création de l'architecture de base du projet :

mvn archetype:create -DgroupId=com.netapsys -DartifactId=MEPSelenium

pom.xml

Nous allons éditer le fichier pom.xml qui a été créé par maven afin d'y ajouter les informations nécessaires.
(Vous pourrez trouver le fichier pom.xml final à la fin de ce billet.)

Les dépendances
JUnit

Maven ajoute automatiquement cette dépendance lors de la création de l’archetype. Si vous créez le projet à la main ou si elle est absente, il vous faudra la rajouter.

<dependencies>
...
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1 </version>
      <scope>test</scope>
    </dependency>
...
</dependencies>
Selenium

Cette dépendance va télécharger la librairie Selenium, qui permettra d’écrire nos propres tests unitaires.

<dependencies>
...
<dependency>
	<groupId>org.seleniumhq.selenium.client-drivers</groupId>
	<artifactId>selenium-java-client-driver</artifactId>
	<version>1.0.1</version>
	<scope>test</scope>
</dependency>
…
</dependencies>

Les plugins

Les plugins sont à rajouter dans la section de build.

compiler

Il faut au minimum la version 1.5 du JDK.

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>2.1</version>
	<configuration>
		<source>1.5</source>
		<target>1.5</target>
	</configuration>
</plugin>
Selenium

Nous ajoutons juste le plugin pour l'instant, nous verrons sa configuration ultérieurement.

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>selenium-maven-plugin</artifactId>
	<version>1.0.1</version>
</plugin>

Le test

Nous allons créer une première classe de test, que nous allons placer dans un package « selenium ».

package com.netapsys.selenium;

import com.thoughtworks.selenium.SeleneseTestCase;

/**
 * Classe de test de la mise en place de Selenium.
 */ 
public class SeleniumTest extends SeleneseTestCase {
	/** {@inheritDoc} */
	@Override
	public void setUp() throws Exception {
		setUp("http://www.netapsys.fr"); // délégation de la configuration à la classe parente
	}

	/** Ouvre la page et vérifie que le texte est bien présent. */
	public void test() {
		selenium.open(“/“); // ouverture de la page
		assertTrue(selenium.isTextPresent("Netapsys"));
	}
}

Ce test très basique permet de vérifier la présence de texte sur une page web.
Il est possible de simuler une navigation un peu plus fournie :

  • Valorisation d'un champ
  • Clic sur un bouton
  • Faire du drag&drop
  • ...

Exécution

Si nous lançons notre test directement :
mvn test
Nous pouvons constater qu'il est en erreur. La raison de cet échec nous est donnée dans les logs :

Could not contact Selenium Server; have you started it on 'localhost:4444' ?

Comme vous l'aurez deviné, il faut démarrer le serveur selenium avant de lancer les tests. Pour cela il va nous falloir 2 terminaux.

Le premier va servir à lancer le serveur selenium (à noter que par défaut le lancement du serveur bloque l’exécution de maven) :
mvn selenium:start-server
Dans le deuxième terminal nous lançons l'exécution des tests (commande mvn test).

Lors de l'exécution du test, deux fenêtres vont s'ouvrir.
La première est la fenêtre de Selenium Remote Control, elle contient, entre autres, les commandes qui sont exécutées.
La deuxième est le navigateur en lui-même. Nous pouvons voir les différents événements se passer : écriture du texte, clic sur le bouton, …

Une fois les tests terminés, nous pouvons arrêter notre serveur (dans le deuxième terminal) :
mvn selenium:stop-server

Configuration

Choix du navigateur

Une des options incontournables de Selenium est la possibilité de choisir le navigateur utilisé pour lancer les tests.
Deux moyens sont possibles :

  • Dans le test : rajouter un paramètre lors de l'initialisation :

setUp("http://www.google.fr/", “*firefox“);

  • Dans le pom, configurer le plugin selenium :
<configuration>
	<forcedBrowserMode>*iexplore</forcedBrowserMode>
</configuration>

Comme le nom du paramètre l'indique, le navigateur défini dans le plugin sera tout le temps utilisé, quelle que soit l'initialisation du test.

Parmi les différentes valeurs possibles :

  • *iexplore pour Internet Explorer
  • *firefox pour Mozilla Firefox
  • *custom <chemin> pour utiliser un autre navigateur, en indiquant le chemin vers l'exécutable

Intégration

Un fait qui est rapidement constaté est la lenteur des tests selenium. De plus, ces tests ont plus vocation à être exécutés dans un environnement d’intégration (sur différentes plateformes, avec différents navigateurs, différents profils de connexion, …) que dans un environnement de développement à la suite de tests unitaires joués en isolation.
Nous allons donc configurer le plugin surefire, utilisé pour l’exécution des tests unitaires, afin de ne lancer les tests selenium que lors de la phase « integration-test ».

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<version>2.5</version>
	<configuration>
		<excludes>
			<exclude>**/selenium/*.java</exclude> <!-- Les tests selenium sont exclus de la phase de test -->
		</excludes>
	</configuration>
	<executions>
		<execution>
			<id>surefire-integration-test</id>
			<phase>integration-test</phase>
			<goals>
				<goal>test</goal> <!-- La phase integration-test va lancer les tests... -->
			</goals>
			<configuration>
				<excludes>
					<exclude>none</exclude>
				</excludes>
				<includes>
					<include>**/selenium/*Test.java</include> <!-- ...en incluant les tests selenium -->
				</includes>
			</configuration>
		</execution>
	</executions>
</plugin>

Nous pouvons vérifier son fonctionnement en exécutant tout d’abord la phase de test, qui ne va pas lancer les tests Selenium :
mvn test
Puis nous exécutons la phase de test d’intégration, qui va lancer les tests Selenium de manière séparée :
mvn integration-test

Lancement du serveur

Maintenant que nos tests selenium s’exécutent pendant la phase d’intégration, nous allons profiter de la phase spécifique de préparation des tests d’intégration (pre-integration-test) pour lancer automatiquement le serveur selenium, et ainsi supprimer un des deux terminaux qui nous étaient jusqu’alors nécessaires.
Configurons le plugin selenium :

<executions>
	<execution>
		<id>start-selenium-server</id>
		<phase>pre-integration-test</phase>
		<goals>
			<goal>start-server</goal>
		</goals>
	</execution>
	<execution>
		<id>stop-selenium-server</id>
		<phase>post-integration-test</phase>
		<goals>
			<goal>stop-server</goal>
		</goals>
	</execution>
</executions>

Si vous lancez la phase de test d’intégration directement, vous risquez d’attendre longtemps l’apparition de votre navigateur. Nous avons vu précédemment que le lancement du serveur bloquait l’exécution de maven. Il faut donc configurer le plugin selenium pour lui indiquer de lancer le serveur en fond de tâche :

<configuration>
	<background>true</background>
</configuration>

Nous avons maintenant en place la configuration pour exécuter nos tests en local.

D'autres étapes se profilent déjà : mise en place des tests sous intégration continue, génération de rapports pouvant être transmis et compris par le client, réduction du coût de maintenabilité des tests (penser à une future refonte graphique), ...
Peut-être nous retrouverons-nous pour traiter un de ces sujets !

Liens

Site de Selenium
Plugin Maven Selenium

2 commentaires

  1. We’re numerous volunteers as well as opening the latest program inside our group. Your site made available all of us with beneficial information in order to paintings about. You might have done any solid career and each of our complete party will most likely be glad to you personally.

Laisser un commentaire

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

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.