Je comprends jusqu’à présent le développement piloté par les tests: vous n’êtes autorisé à écrire du code productif que si vous avez un test unitaire en échec (rouge).
Non. Vous êtes uniquement autorisé à écrire le code le plus simple possible pour modifier le message du test. Cela ne dit rien sur ce type de test.
En fait, vous commencerez probablement par écrire un test d'acceptation ayant échoué (en rouge) pour un critère d'acceptation. Plus précisément, vous écrivez le test d'acceptation le plus simple pouvant éventuellement échouer; Ensuite, vous lancez le test, observez son échec et vérifiez qu'il échoue pour la bonne raison. Ensuite, vous écrivez un test fonctionnel ayant échoué pour une tranche de fonctionnalité de ce critère d'acceptation. Vous écrivez à nouveau le test fonctionnel le plus simple pouvant échouer, l'exécutez, surveillez son échec et vérifiez qu'il échoue pour la bonne raison. Ensuite, vous écrivez un test unitaire échouant, le test unitaire le plus simple pouvant éventuellement échouer, exécutez-le et vérifiez qu'il échoue, vérifiez qu'il échoue pour la bonne raison.
Maintenant , vous écrivez le code de production le plus simple qui pourrait éventuellement changer le message d'erreur. Exécutez le test à nouveau, vérifiez que le message d'erreur a bien changé, qu'il a évolué dans la bonne direction et que le code a modifié le message pour la bonne raison. (Idéalement, le message d'erreur devrait disparaître et le test devrait réussir, mais le plus souvent, il est préférable de prendre de petites étapes pour changer le message plutôt que d'essayer de faire passer le test en une seule fois - c'est la raison pourquoi les développeurs de structures de test consacrent autant d’efforts à leurs messages d’erreur!)
Une fois que le test unitaire est réussi, vous reformulez votre code de production sous la protection de vos tests. (Notez que pour le moment, le test de réception et le test de fonctionnement échouent toujours, mais ce n'est pas grave, car vous ne faites que refactoriser des unités individuelles couvertes par des tests d'unités.)
Maintenant, vous créez le test unitaire suivant et répétez ce qui précède, jusqu'à ce que le test fonctionnel réussisse également. Sous la protection du test fonctionnel, vous pouvez maintenant effectuer des refactorisations sur plusieurs unités.
Ce cycle intermédiaire se répète maintenant jusqu'à ce que le test d'acceptation soit réussi. Vous pouvez alors effectuer des refactorisations sur l'ensemble du système.
Maintenant, vous choisissez le critère d'acceptation suivant et le cycle externe recommence.
Kent Beck, le "découvreur" de TDD (il n'aime pas le terme "inventeur", il dit que les gens le font depuis le début, il lui a juste donné un nom et a écrit un livre à ce sujet) utilise une analogie tirée de la photographie et appelle cela "zoom avant et arrière".
Remarque: vous n'avez pas toujours besoin de trois niveaux de test. Peut-être que parfois vous avez besoin de plus. Plus souvent, vous avez besoin de moins. Si vos fonctionnalités sont petites et vos tests fonctionnels rapides, vous pouvez vous en tirer sans (ou avec moins de tests unitaires). Souvent, vous n'avez besoin que de tests d'acceptation et de tests unitaires. Ou bien, vos critères d'acceptation sont si précis que vos tests d'acceptation sont des tests fonctionnels.
Kent Beck dit que s'il a un test fonctionnel rapide, petit et ciblé, il écrit d'abord les tests unitaires, laisse les tests unitaires conduire le code, puis supprime à nouveau (certains) les tests unitaires qui couvrent le code également. couvert par le test fonctionnel rapide. Rappelez-vous: le code de test est aussi un code qui doit être maintenu et refactorisé, moins il y en a, mieux c'est!
Cependant, je me demande si l'approche fondée sur les tests peut également s'appliquer à d'autres formes de tests.
Vous n'appliquez pas vraiment TDD aux tests. Vous l'appliquez à l'ensemble de votre processus de développement. C'est ce que la partie "conduite" de Test- Driven -Development signifie: tout votre développement est conduit par des tests. Les tests ne contrôlent pas seulement le code que vous écrivez, ils déterminent également quel code écrire et quel code écrire ensuite. Ils conduisent votre conception. Ils vous disent quand vous avez terminé. Ils vous disent sur quoi travailler ensuite. Ils vous renseignent sur les défauts de conception de votre code (lorsque les tests sont difficiles à écrire).
Keith Braithwaite a créé un exercice qu'il appelle TDD comme si vous le vouliez . Il consiste en un ensemble de règles (basées sur les Trois règles du TDD d'oncle Bob Martin , mais beaucoup plus strictes) que vous devez suivre strictement et qui sont conçues pour vous orienter vers une application du TDD plus rigoureuse. Cela fonctionne mieux avec la programmation en binôme (pour que votre binôme puisse s’assurer que vous ne respectez pas les règles) et un instructeur.
Les règles sont:
- Ecrivez exactement un nouveau test, le plus petit test possible qui semble indiquer une solution
- Le voir échouer; les échecs de compilation comptent comme des échecs
- Faites le test de (1) passer en écrivant le moins de code d’implémentation que vous pouvez dans la méthode de test .
- Refactoriser pour supprimer les doublons, et au besoin pour améliorer la conception. Soyez strict sur l'utilisation de ces mouvements:
- vous voulez une nouvelle méthode — attendez l'heure du refactoring, puis… créez de nouvelles méthodes (non-test) en effectuant l'une de ces méthodes, et sans autre moyen:
- préféré: faites Extraire la méthode sur le code d’implémentation créé conformément à (3) pour créer une nouvelle méthode dans la classe de test, ou
- si vous devez: déplacer le code d'implémentation selon (3) dans une méthode d'implémentation existante
- vous voulez une nouvelle classe — attendez l'heure du refactoring, puis… créez des classes non-test pour fournir une destination à une méthode de déplacement et pour aucune autre raison
- remplir les classes d'implémentation avec des méthodes en faisant déplacer la méthode, et sans autre moyen
Ces règles sont destinées à l'exercice du TDD. Ils ne sont pas destinés à la réalisation de TDD en production (même si rien ne vous empêche de l'essayer). Ils peuvent se sentir frustrés parce que parfois, vous aurez l’impression de faire des milliers de minuscules petits progrès sans faire de réels progrès.