TDD - Le développement piloté par les tests
Présentation de TDD
Principes de base
-
La méthode traditionnelle de la rédaction des tests unitaires consiste à rédiger les tests d'une portion d'un programme (appelé unité ou module ) afin de vérifier la validité de l'unité implémentée.
Voici un schéma représentant le principe de la méthode traditionnelle :
Comme on peut le constater, le test découle du code, ce qui est contraire au principe même de TDD.
-
La méthode TDD quand à elle consiste à rédiger les tests unitaires avant de procéder à la phase de codage.
Voici un schéma représentant le principe de la méthode TDD :
Ici, le développeur écrit un peu de code de test et ensuite implémente le métier.
Le code métier est soumis aux tests puis il est corrigé jusqu'a que ses tests soient validés. Le développeur procède éventuellement ensuite à un refractor du code qui est un autre principe de l'Extreme Programing permettant d'améliorer la qualité interne du code en procédant à plusieurs opérations (renommage de méthodes, suppression de codes inutiles,...).
Démarche à suivre
La démarche à suivre pour mettre en place cette méthode est décomposée en trois phases appelé RGR(aussi appelé la Mantra).
Les deux premières phases sont nommées d’après la couleur de la barre de progression dans les outils de test unitaires comme JUnit(Red pour échec et Green pour réussite)
- R (Red): écrire un code de test et les faire échouer
- G (Green) : écrire le code métier qui valide le test
- R (Refractor) : remaniement du code afin d'en améliorer la qualité
Cycle de développement
Le cycle de développement préconisé par TDD comporte cinq étapes :- Ecriture d'un premier test
- Exécuter le test et vérifier qu'il échoue (car le code qu'il teste n'a pas encore été implémenté)
- Ecriture de l'implémentation pour faire passer le test (il existe différentes manières de corriger ce code)
- Exécution des tests afin de contrôler que les tests passent et dans ce présent l'implémentation respectera les règles fonctionnelles des tests unitaires
- Remaniement (Refractor) du code afin d'en améliorer la qualité mais en conservant les mêmes fonctionnalités
Voici un schéma résumant le séquencement du cycle de développement :

On remarque que les tests unitaires sont relancés suite à l'étape de remaniement. Cela est nécessaire afin de s'assurer que l'étape de remaniement n'a pas eu de répercussion sur les fonctionnalités implémentées.
Avantages
La mise en place de la méthode TDD offre de nombreux avantages au sein du développement d'un logiciel.
Voici les avantages apportés par l'emploi de cette méthode
-
Les tests unitaires sont réellement écrits
On remarque généralement que les tests unitaires sont souvent remis à plus tard (par manque de temps ou d'intérêt). Le fait de commencer par rédiger les tests permet de s'assurer que les tests seront écrits. -
La satisfaction du développeur permet d'obtenir un code plus cohérent
En suivant la méthode traditionnelle le développeur écrit une unité et va ensuite procéder aux tests afin de s'assurer que ce qu'il a codé est valide. Cette méthode est peu satisfaisante pour un développeur car il est déjà conscient que le code qu'il a écrit est juste. A l'inverse, en appliquant la méthode TDD, il va commencer par rédiger les tests puis ensuite passer à l'implémentation de l'unité afin de faire passer les tests. Ce procédé est plus satisfaisant et motivant car il s'agit d'une sorte de défis de faire valider les tests, C'est une sensation d'accomplissement. Il est important de ne pas ignorer les aspects psychologiques si on veut s'assurer que le travail réalisé par les développeurs soit propre et efficace. -
Clarification des détails de l'interface et du comportement
En effet, lorsque le développeur écrit du code de test pour tester une implémentation qui n'existe pas encore, il va devoir penser aux détails de la méthode dont il a besoin pour écrire la spécification. Aussi, il va alors s's'interroger sur le nom de la méthode, sa valeur de retour, ses paramètres, comportement,...cela permet de clarifier la conception et d'écrire seulement du code utile.
L'ajout de tests unitaires par le biais de la méthode TDD offre d'autres nombreux avantages :
-
Vérification démontrable, répétable et automatisé
Le fait de disposer d'un grand nombre de test permet de s'assurer de la solidité et garantie du code. -
Non présence de régression
Lorsqu'un développeur modifie une méthode existante, il peut relancer les tests unitaires afin de s'assurer que sa modification n'a pas impacté l'existant et donc cela offre un feedback immédiat.