Selenium est un projet pour l'automatisation des tests au travers d'un browser.
On se place comme un utilisateur qui vient sur le site web.
Il se décline en 2 parties :
Nous allons utiliser la librairie afin d'écrire des tests d'interface.
On crée la branche selenium à partir de la branche master.
$ git checkout master Switched to branch 'master' $ git checkout -b selenium Switched to a new branch 'selenium'
Afin d'utiliser la librairie, il suffit de la rajouter dans le pom.
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.44.0</version> <scope>test</scope> </dependency>
Cependant les tests selenium ne sont pas des tests unitaires classiques.
On parle plutôt de test d'intégration ou d'interface : l'application tourne et est connectée à la base de données
Les test d'interface sont plus long à l'exécution.
Afin que jenkins n'éxécute pas ces tests avec les tests unitaires, nous pouvons :
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <excludes> <exclude>**/selenium/*Test.java</exclude> </excludes> </configuration> </plugin>
Il existe d'autres possibilités mais celle ci suffit pour notre besoin.
Nous créons la classe GoogleTest dans le package fr.todooz.selenium, dans src/test/java
public class GoogleTest { private WebDriver webDriver; @Before public void init() { // création du pilote firefox webDriver = new FirefoxDriver(); } @After public void close() { // fermeture du navigateur webDriver.quit(); } }
Nous pouvons ajouter un test de recherche sur google.fr
@Test public void search() throws InterruptedException { // naviguer vers google.fr webDriver.navigate().to("http://google.fr"); // remplir le champs de recherche WebElement input = webDriver.findElement(By.name("q")); input.sendKeys("selenium"); // post du formulaire contenant l'input input.submit(); // on attends le chargement de la page WebElement link = new WebDriverWait(webDriver, 5).until(new ExpectedCondition<WebElement>() { public WebElement apply(WebDriver input) { // on doit trouver le lien vers le site return webDriver.findElement(By.partialLinkText("Web Browser Automation")); } }); Assert.assertEquals("http://docs.seleniumhq.org/", link.getAttribute("href")); }
Le test est assez simple mais le bloc lié au wait est un peu verbeux.
Les tests selenium reposent sur des assertions lié à l'arbre DOM.
Nous allons maintenant nous tourner vers notre propre site.
Nous créons une classe TodoozTest dans le même package.
Faire un premier test home() qui vérifie que la page d'index répond correctement.
@Test public void home() { // on navigue vers la home // on vérifie le title }
En pratique les pages sont beaucoup plus riches que notre page et il y a beaucoup plus d'éléments que l'on peut tester.
Il faut cependant garder les tests simples : lisibles et résistants au changement.
Ensuite, on test l'ajout d'un billet via l'url http://localhost:8080/add.
Pour réaliser ce test, on implémente le pseudo code suivant.
@Test public void add() { // aller sur le formulaire // remplir le formulaire // le poster // vérifier que le billet a bien été ajouté en home page }
Comme pour les tests unitaires, les tests selenium accompagnent l'évolution du code.
Nos tests fonctionnent mais le code de test est un peu verbeux.
Afin de les rendre plus simple, nous allons utiliser la librairie FluentLenium.
La librairie dans le pom.
<dependency> <groupId>org.fluentlenium</groupId> <artifactId>fluentlenium-core</artifactId> <version>0.10.2</version> <scope>test</scope> </dependency>
L'heritage de la classe FluentTest
public class TodoozTest extends FluentTest { ... }
On peut alors supprimer les méthodes @Before
et @After,
car le driver est géré par la classe mère.
FluentLenium permet d'écrire les tests sous la forme :
goTo("http://mywebpage/"); fill("#firstName").with("toto"); click("#create-button"); assertThat(title()).isEqualTo("Hello toto");
Ou même avec un synthaxe proche de celle de jquery :
goTo("http://mywebpage/"); $("#firstName").text("toto"); $("#create-button").click(); assertThat(title()).isEqualTo("Hello toto");
Fluentlenium utilise des sélecteurs css afin de simplifier les recherches.
Ce qui donne pour notre test home() :
goTo("http://localhost:8080/"); Assert.assertEquals("Todooz", title());
Même en java, on peut écrire du code lisible et synthétique.
Il reste a faire de même pour l'autre test.
Au même titre que le code, il est important de garder des tests lisibles et concis.