Quelle méthode pour automatiser les tests unitaires dans une approche BDD ?

Tests-unitaires-bdd

Si en théorie chaque fonctionnalité devrait être testée, dans la pratique l’importance de ces tests unitaires est sous-estimée par un trop grand nombre de développeurs. Les tests ne sont pas systématiquement exécutés ou alors pas exhaustivement. Pourtant, il est moins coûteux de découvrir une erreur lors du développement, que lors de la phase des tests d’intégration ! L’inconvénient reste que tester manuellement une application prend du temps et est sujet aux erreurs… A partir de ces constats et dans un souci d’amélioration de la qualité du produit final, il est naturel de vouloir s’orienter vers une solution d’automatisation des tests unitaires. Nous allons voir ensemble une solution mise en place avec une approche BDD (Behavior Driven Development) dans le cadre d’un projet Agile.

BDD : illustrons un cas réel !

Le projet concerné ne respecte pas à la lettre la philosophie BDD mais il s’en inspire dans le sens où, après la construction du « product backlog » et l’identification des « stories », on définit les critères d’acceptation qui nous serviront pour construire nos tests unitaires automatisés en langage Gherkin. C’est un pseudo langage naturel en anglais qui repose sur des mots clés (« Given »« When »« And »« Then »…) et dont voici un exemple :

@tag1
Scenario : Successfull connection to Facebook
Given that I am a facebook user.
When I enter username as username.
And I enter the password as the password
Then I should be redirected to the home page of facebook

Notre problématique était d’automatiser les tests unitaires d’un site web de prise de commandes développé en Java, en utilisant le langage Gherkin pour définir les critères d’acceptation. Nous avons donc choisi d’utiliser le plugin Cucumber, l’IDE Eclipse et l’API SeleniumSeleniumest une API permettant de programmer des actions sur une interface Web. Cucumber est un framework qui permet de transformer les scénarii d’une « story », écrits en Gherkin, en tests Java automatisés en s’appuyant sur le framework Junit.

Pour cela, chaque étape (appelée « step ») dun scénario est implémentée par une méthode Java. Le point d’entrée des tests avec Cucumber est un fichier .feature. C’est un fichier dans lequel les tests sont définis en langue descriptive (en Gherkin) par « feature ». Dans notre cas, il a suffi, pour chaque « feature », de recopier les critères d’acceptation de toutes les « stories » de la « feature » dans ce fichier.

Il s’agit ensuite de créer une classe de test Junit qui utilise le plugin Cucumber et de l’exécuter. Lors de la première exécution, Cucumber remonte des erreurs qui indiquent qu’il ntrouve pas la définition des méthodes correspondant aux « steps » des scenarii des fichiers .feature. Il faut donc créer une classe Java pour définir les actions. Dans cette classe, on crée les méthodes associées aux messages de warning de la console.

Par exemple pour ce message :

Given("^I am a facebook user$", () -> {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
});

On crée la méthode suivante :

@Given("^that I am a facebook user$")
public void i_am_a_facebook_user() throws Throwable {
// Write code here that turns the phrase above into concrete actions
}

Une fois que toutes les méthodes sont créées (avec du code significatif Sélénium par exemple), on peut relancer le test et voir quelles parties du produit sont incomplètes. Au finalil ne doit plus y avoir de warning dans la console cela garantit que toutes les fonctionnalités prévues pour le produit ont été testées.

Bien orienter le choix de la solution

Dans notre cas, nous avons associé CucumberJunit et Selenium. Ces solutions correspondaient aux contraintes techniques du projet, à savoir un site web développé en Java. Cependant, il n’existe pas de réponse unique pour automatiser les tests unitaires : le choix de la solution est à adapter selon le type de produit, que ce soit un site web ou une application mobile, mais aussi du langage choisi pour son développement.

Concernant les outils pour les autres langages, nous pouvons citer Specflow pour .Net et Behat pour PHP qui ont une philosophie proche de celle de CucumberPour les tests automatiques d’applications mobiles, vous pourrez plutôt vous tourner vers Selendroid qui repose sur Selenium, ou Appium qui est l’outil le plus connu.

Les conditions pour réussir l’automatisation des tests unitaires

La solution n’est qu’un moyen : au-delà d’un outil qui soit adapté à l’environnement technique du projet, il faut encore réussir à rassembler les conditions nécessaires pour garantir la réussite de l’implémentation des tests automatiques unitaires.

Du côté des développeurs :

  • Connaissance des notions de base des tests unitaires (utilisation de JunitPHPunit ou Nunit)
  • Connaissance et compréhension des critères d’acceptation validés par le client pour chaque story
  • Respect du formalisme de Cucumber qui impose les classes et les méthodes à implémenter
  • Implémentation des méthodes avec du code technique ou fonctionnel significatif

Du côté du client :

  • Maturité au niveau de la définition des critères d’acceptation pour chaque story
  • Du temps pour les écrire !

En conclusion, les tests unitaires automatiques ne sont pas encore très étendus alors que cette approche mériterait d’être plus connue : non seulement, elle améliore la qualité des produits finaux mais elle apporte aussi un gain de temps aux chefs de projet ou experts techniques, lors des tests d’intégration. Il faut garder en tête qu’il n’existe pas d’approche unique et qu’elle est à adapter selon les projets !

0 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 !