Suis-je en train de faire c'est bien? Si ce n'est pas exactement ce que je dois changer
C'est difficile à dire juste à partir de cette courte description, mais je soupçonne que non, vous ne le faites pas correctement. Remarque: Je ne dis pas que ce que vous faites ne fonctionne pas ou est en quelque sorte mauvais, mais vous ne faites pas TDD. Le milieu "D" signifie "Driven", les tests pilotent tout, le processus de développement, le code, la conception, l'architecture, tout .
Les tests vous disent quoi écrire, quand l'écrire, quoi écrire ensuite, quand arrêter d'écrire. Ils vous disent le design et l'architecture. (La conception et l'architecture émergent du code par le refactoring.) TDD n'est pas une question de test. Il ne s'agit même pas d'écrire des tests d'abord: TDD consiste à laisser les tests vous guider, les écrire d'abord n'est qu'une condition préalable nécessaire pour cela.
Peu importe que vous écriviez réellement le code ou que vous le développiez complètement: vous écrivez (des squelettes de) code dans votre tête, puis écrivez des tests pour ce code. Ce n'est pas TDD.
Abandonner cette habitude est difficile . Vraiment, vraiment dur. Cela semble être particulièrement difficile pour les programmeurs expérimentés.
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 de l'oncle Bob Martin sur le TDD , mais beaucoup plus strictes) que vous devez suivre strictement et qui sont conçues pour vous orienter vers une application plus rigoureuse du TDD. Cela fonctionne mieux avec la programmation en binôme (pour que votre binôme s'assure que vous ne violez pas les règles) et un instructeur.
Les règles sont les suivantes:
- Écrivez exactement un nouveau test, le plus petit test possible qui semble pointer dans la direction d'une solution
- Voyez-le échouer; les échecs de compilation comptent comme des échecs
- Faites passer le test à partir de (1) en écrivant le moins de code d'implémentation possible dans la méthode de test .
- Refactoriser pour supprimer la duplication et, au besoin, pour améliorer la conception. Soyez strict quant à l'utilisation de ces mouvements:
- vous voulez une nouvelle méthode - attendez le temps de refactoring, puis ... créez de nouvelles méthodes (non-test) en faisant l'une de ces méthodes, et en aucune autre manière:
- préféré: faire Extraire la méthode sur le code d'implémentation créé selon (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 le temps de refactoring, puis ... créez des classes non-test pour fournir une destination pour une méthode de déplacement et pour aucune autre raison
- remplir les classes d'implémentation avec des méthodes en effectuant la méthode Move, et pas d'autre moyen
Typiquement, cela conduira à des conceptions très différentes de la "méthode pseudo-TDD" souvent utilisée pour "imaginer dans votre tête ce que devrait être la conception, puis écrire des tests pour forcer cette conception, implémenter la conception que vous aviez déjà envisagée avant d'écrire votre tests ".
Lorsqu'un groupe de personnes implémente quelque chose comme un jeu de tic tac toe utilisant un pseudo-TDD, ils se retrouvent généralement avec des conceptions très similaires impliquant une sorte de Board
classe avec un tableau 3 × 3 de Integer
s. Et au moins une partie des programmeurs auront en fait écrit cette classe sans tests car ils "savent qu'ils en auront besoin" ou "auront besoin de quelque chose pour écrire leurs tests". Cependant, lorsque vous forcez ce même groupe à appliquer TDD comme si vous le vouliez, ils se retrouveront souvent avec une grande diversité de conceptions très différentes, n'utilisant souvent rien de même à distance similaire à a Board
.
Existe-t-il un moyen d'identifier si le test que vous avez écrit est suffisant?
Quand ils couvrent tous les besoins de l'entreprise. Les tests sont un codage des exigences du système.
Est-ce une bonne pratique d'écrire un test pour une fonctionnalité très simple qui pourrait être équivalente à 1 + 1 = 2 ou est-ce juste une surexposition?
Encore une fois, vous l'avez à l'envers: vous n'écrivez pas de tests de fonctionnalité. Vous écrivez des fonctionnalités pour les tests. Si la fonctionnalité permettant de réussir le test s'avère insignifiante, tant mieux! Vous venez de remplir une exigence système et n'avez même pas eu à travailler dur pour cela!
Est-il bon de changer la fonctionnalité et de tester en conséquence si les exigences changent?
Non. L'inverse. Si une exigence change, vous modifiez le test qui correspond à cette exigence, regardez-le échouer, puis changez le code pour le faire passer. Les tests viennent toujours en premier.
C'est difficile à faire. Vous avez besoin de dizaines, peut-être de centaines d'heures de pratique délibérée pour construire une sorte de "mémoire musculaire" pour arriver à un point où, lorsque la date limite approche et que vous êtes sous pression, vous n'avez même pas besoin d'y penser , et cela devient le moyen de travail le plus rapide et le plus naturel.