TDD - Le développement piloté par les tests



Les tests fonctionnels avec TDD

Spécifications exécutables

Dans un projet informatique, il n'est pas impossible que des erreurs d'interprétation de règles fonctionnels d'un cahier des charges surviennent. Dans ce cas présent, le besoin du client aura mal été pris en compte et cela risque de provoquer une perte de temps.

Afin d'éviter ce genre de problème, il est impératif d'impliquer le client dés le début du développement et lui permettre de contrôler et valider lui même les règles fonctionnelles. Pour ce faire, il doit fournir aux développeurs un ensemble de scénarios clients où sont décrits des régles fonctionnelles et ainsi supprimer toutes les ambigüités ou erreurs d'interprétations.
Pour faciliter la rédaction de ces scénarios client par les clients, un Wiki sera mis à leur disposition et ils pourront à leurs aises écrire des scénarios clients avec les moins de difficultés possibles.

Cette approche demande de mettre en place une couche logicielle (appelé Fixture) permettant de faire le pont entre les pages de tests et les services de l'application testée.

Voici un schéma d'un outil de spécifications exécutables qui décrit les différentes entités avec leurs relations de cette nouvelle approche :




Il s'agit ici de l'organisation de l'outil FitNesse, la couche FIT(Fixtures) correspond au pont et permet de court circuiter l'IHM et ainsi de tester uniquement les règles fonctionnelles.

Les outils tels que FitNesse et GreenPepper offrent le moyen de mettre en œuvre cette méthode.

Description des spécifications exécutables avec l'outil FitNess

Fitness est composé d’un wiki qui référence les scénarios de tests, d’un moteur d’exécution pour extraire les données des tests et enfin de codes de liaison pour mettre en corrélation ces données avec le code applicatif (écrit en C#, Java ou C++).
L’édition et l’exécution des scénarios de tests se font via le wiki intégré. L’édition, peut se faire en mode déconnecté avec un éditeur de texte (Excel, Word, Notepad,…). Les scénarios seront ensuite importés dans le wiki. FitNesse met donc l’élaboration, la documentation et l’exécution de ces scénarios à la portée de tous.
La corrélation entre les données de test et le code applicatif se fait par l’intermédiaire d’APIs écrites par le développeur. Pour l’aider dans son développement, FIT intègre lui aussi une API contenant un certain nombre de Fixtures.

Voici certains Fixtures offerts par FitNesse :

Voici un tableau d'un Wiki représentant un ensemble de règle fonctionnelle pour un scénario :




Le tableau est composé de 3 groupes de ligne :


La terminologie et la simplicité du tableau font qu'il est très simple de comprendre les règles fonctionnelles.

BDD - Behavior Driven Developement

Le Behaviour Driven Development (BDD) est une méthode de développement agile visant à se baser sur le comportement de l'utilisateur pour créer son application.
Un test en BDD consiste à décrire une fonctionnalité selon un formalisme « Given / When / Then ».

Chaque mot clé a une signification bien précise :


Il y a également les autres mots clés And et But qui reprennent le mot clé de la ligne précédente et ont donc pour but de clarifier le scénario

Il existe plusieurs outils permettant de mettre en œuvre la méthode BDD. On retrouve Cucumber(utilisation avec de nombreux langages), JBehave(uniquement en Java) ou encore NBehave (.NET).


Application de la méthode BDD avec JBehave

Voici la démarche à suivre pour créer un scénario :


Voici un exemple de fichier scénario :



Chaque phrase suivant les mots clés seront analysés et leurs actions seront traduits en code dans une classe Java.
Le nom de cette classe doit étendre la classe Scenario (propre à JBehave) et doit porter un nom correspondant au nom donné au fichier de scénario (écrit en CamelCase, par exemple user_logs_in_success devient UserLogsInSuccess).

Voici la classe du fichier scénario défini préalablement :



On remarque qu'une action précise est assoçiée à chaque mot clé.
En l'occurrence, une assertion ensureThat(currentPage, containsMessage(message)) est assoçiée pour le mot clé Then qui a pour but de vérifier le résultat attendu.
Les annotations en Java permettent d'apporter de la clarté et il devient simple de comprendre le scénario en lisant les quelques lignes de la classe.