J'ai toujours appris que faire une couverture maximale du code avec des tests unitaires est bon . J'entends aussi des développeurs de grandes entreprises comme Microsoft dire qu'ils écrivent plus de lignes de code de test que le code exécutable lui-même.
Maintenant, Est-ce que c'est vraiment génial ? Ne semble-t-il pas parfois perte totale de temps qui n'a d'effet que sur rendre l'entretien plus difficile ?
Par exemple, disons que j'ai une méthode DisplayBooks()
qui alimente une liste de livres à partir d'une base de données. Les exigences du produit indiquent que s'il y a plus de cent livres dans le magasin, seule une centaine doit être affichée .
Donc, avec TDD,
- Je vais commencer par faire un test unitaire
BooksLimit()
ce qui permettra de sauvegarder deux cents livres dans la base de données, appelezDisplayBooks()
et faire unAssert.AreEqual(100, DisplayedBooks.Count)
. - Puis je testerai si ça échoue,
- Alors je vais changer
DisplayBooks()
en fixant la limite des résultats à 100, et - Enfin, je vais réexécuter le test pour voir s'il réussit.
Eh bien, n'est-il pas plus facile de passer directement à la troisième étape, et de ne jamais faire BooksLimit()
de test unitaire ? Et n'est-il pas plus agile, lorsque les exigences passent de 100 à 200 livres, de ne changer qu'un seul caractère, au lieu de changer les tests, de les exécuter pour vérifier s'ils échouent, de changer le code et d'exécuter à nouveau les tests pour vérifier s'ils réussissent ?
Note : supposons que le code est entièrement documenté. Sinon, certains pourraient dire, et ils auraient raison, que faire des tests unitaires complets aidera à comprendre un code qui manque de documentation. En fait, avoir un BooksLimit()
Le test unitaire montrera très clairement qu'il existe un nombre maximum de livres à afficher, et que ce nombre maximum est de 100. Il serait beaucoup plus difficile de pénétrer dans le code qui ne fait pas partie des tests unitaires, car cette limite peut être mise en œuvre par le biais de la méthode suivante for (int bookIndex = 0; bookIndex < 100; ...
o foreach ... if (count >= 100) break;
.