Si j'ai déjà un test d'intégration pour mon programme, et qu'ils ont tous réussi, alors j'ai une bonne impression que cela fonctionnera. Alors, quelles sont les raisons d'écrire/ajouter des tests unitaires? Comme je dois déjà écrire des tests d'intégration de toute façon, j'aimerai seulement écrire des tests unitaires pour les pièces qui ne sont pas couvertes par les tests d'intégration.
Ce que je sais des avantages du test unitaire par rapport au test d'intégration sont
Et nous voulons toujours écrire moins de code, mais les tests unitaires d'écriture ont besoin de beaucoup plus de code (principalement des objets fictifs de configuration). La différence entre certains de mes tests unitaires et de mes tests d'intégration est que dans les tests unitaires, j'utilise un objet factice et dans les tests d'intégration, j'utilise un objet réel. Qui ont beaucoup de duplication et je n'aime pas le code dupliqué, même dans les tests, car cela ajoute une surcharge pour changer le comportement du code (l'outil de refactorisation ne peut pas tout faire tout le temps).
Vous avez présenté de bons arguments pour et contre les tests unitaires. Vous devez donc vous demander: " Est-ce que je vois de la valeur dans les arguments positifs qui l'emportent sur les coûts dans les arguments négatifs? " = Je fais certainement:
Dans mon livre, les avantages l'emportent sur les inconvénients.
Je ne vois pas beaucoup de valeur à réimplémenter un test-test d'intégration existant comme un plus simple.
Les tests d'intégration sont souvent beaucoup plus faciles à écrire pour les applications héritées non tdd car généralement les fonctionnalités à tester sont étroitement couplées, de sorte que les unités de test isolées (= non testées) peuvent être difficiles/coûteuses/impossibles.
> Then what are the reasons to write/add unit tests?
À mon avis, le développement piloté par les tests est plus efficace si vous écrivez les tests unitaires avant le code réel. De cette façon, le code qui remplit les tests est clairement séparé avec un minimum de références externes faciles à tester.
Si le code existe déjà sans les tests unitaires, il faut généralement beaucoup de travail supplémentaire pour écrire les tests unitaires par la suite, car le code n'a pas été écrit pour un test facile.
Si vous faites TDD, le code est testable facilement.
Les tests d'intégration doivent uniquement vérifier que plusieurs composants fonctionnent ensemble comme prévu. La précision ou non de la logique des composants individuels doit être vérifiée par des tests unitaires.
La plupart des méthodes ont plusieurs chemins d'exécution possibles; pensez à if-then-else, aux variables d'entrée avec des valeurs inattendues ou tout simplement erronées, etc. Habituellement, les développeurs ont tendance à ne penser qu'au chemin heureux: le chemin normal qui ne va pas mal. Mais en ce qui concerne ces autres chemins, vous avez deux options: vous pouvez laisser votre utilisateur final explorer ces chemins à travers les actions qu'ils entreprennent dans l'interface utilisateur et espérer qu'ils ne plantent pas votre application, ou vous pouvez écrire des tests unitaires qui affirment le comportement de ces autres voies et agir si nécessaire.
Certaines des raisons que vous avez mentionnées dans votre question sont vraiment importantes et pourraient à elles seules plaider en faveur des tests unitaires, mais YMMV. Par exemple, à quelle fréquence exécutez-vous votre suite de tests intégrée? D'après mon expérience avec les tests intégrés, tôt ou tard, ils deviendront si lents que vous ne les exécuterez pas chaque fois que vous apporterez une modification et le temps entre l'insertion et la détection d'un bogue augmentera.
De plus, une grosse erreur que vous pourriez faire est de croire que
Find bug that may not be caught in integration test. e.g. masking/offsetting bugs.
n'est pas important. Vous attendez-vous que vos utilisateurs trouvent les bogues pour vous? Faire confiance à des couvertures obtenues à partir de tests intégrés est dangereux à mon avis, vous pouvez très facilement obtenir un% de couverture élevé mais en réalité vous testez très peu.
Je suppose que la référence canonique contre les tests intégrés sont les messages de JBrains:
http://www.jbrains.ca/permalink/integrated-tests-are-a-scam-part-1
au cas où vous ne les auriez pas déjà lus.
Enfin, l'OMI les commentaires que vous pouvez obtenir des tests unitaires pour votre conception sont inestimables. Juger une conception en se sentant instinctif et en s'appuyant sur des tests intégrés peut également être une erreur.
Si vous vous attendez à devoir modifier ou refactoriser votre code, avoir des tests unitaires est essentiel. Les tests unitaires existent non seulement pour démontrer les bogues au moment où le code est écrit, mais pour montrer quand de nouveaux bogues apparaissent quand plus de code est écrit.
Oui, il est préférable d'écrire d'abord vos tests d'intégration et unitaires, mais il y a beaucoup de valeur à les avoir même s'ils sont écrits plus tard.