Comment savoir si ma couverture de tests unitaires est suffisante pour supprimer un test d'intégration?

15

Je travaille sur un système hérité (j'entends par là qu'il a été écrit sans tests). Nous avons essayé de tester une partie du système en écrivant des tests d'intégration qui testent la fonctionnalité de l'extérieur.

Cela me donne une certaine confiance pour refactoriser des parties du code sans craindre de le casser. Mais le problème est que ces tests d'intégration nécessitent un déploiement (2+ minutes) et plusieurs minutes pour s'exécuter. De plus, ils sont difficiles à entretenir. Ils couvrent chacun des milliers de lignes de code et lorsque l'un d'eux casse, cela peut prendre des heures pour déboguer pourquoi.

J'ai écrit de nombreux tests unitaires pour ces changements fonctionnels que j'ai effectués récemment, mais avant de m'engager, je fais toujours un nouveau déploiement et exécute tous les tests d'intégration, juste pour m'assurer de ne rien manquer. À ce stade, je sais que mes tests unitaires et certains des tests d'intégration chevauchent ce qu'ils testent.

Comment savoir si mes bons tests unitaires couvrent adéquatement un mauvais test d'intégration afin que je puisse supprimer ce test d'intégration?

Daniel Kaplan
la source

Réponses:

18

La mesure la plus simple consiste à demander: «À quand remonte la dernière fois où ce test d'intégration a légitimement échoué? Si cela fait longtemps (il y a eu beaucoup de changements) depuis que le test d'intégration a échoué, alors les tests unitaires font probablement un assez bon travail. Si le test d'intégration a échoué récemment, il y a eu un défaut qui n'a pas été détecté par les tests unitaires.

Ma préférence serait généralement d'augmenter la robustesse des tests d'intégration, au point qu'ils peuvent être exécutés de manière fiable sans surveillance. S'ils prennent beaucoup de temps à courir, exécutez-les pendant la nuit. Ils sont toujours précieux même s'ils ne sont exécutés qu'occasionnellement. Si ces tests sont trop fragiles ou nécessitent une intervention manuelle, cela peut ne pas valoir le temps passé à les faire fonctionner, et vous pouvez envisager de jeter ceux qui réussissent le plus souvent.

Greg Hewgill
la source
3
+1 pour recommander que les tests soient automatisés car cela conduit à la question évidente de "Pourquoi tuer un test automatisé?"
1
Oui, je suis d'accord avec ça. Bien sûr, même cela vient encore vous mordre si vous n'avez pas une couverture de test unitaire suffisante. Par exemple, nous avons actuellement une suite de tests d'intégration qui prend environ 6 heures pour s'exécuter ... mais je ne pense pas qu'un test ait JAMAIS été supprimé en raison de l'accent mis par mon entreprise sur la compatibilité
Earlz
2
Je devrais peut-être commencer une nouvelle question à ce sujet, mais suggérez-vous que chaque fois qu'un test d'intégration échoue légitimement, je devrais trouver comment écrire un test unitaire qui échoue également et les faire réussir tous les deux?
Daniel Kaplan
2
@tieTYT: Oui, cela semble absolument être une bonne idée. Les tests unitaires sont bons; les tests unitaires pour des choses que vous savez déjà cassées sont encore meilleurs.
Greg Hewgill
7

Les tests unitaires ne sont pas le Saint Graal des tests, ils ne sont qu'un outil parmi tant d'autres qui devraient être utilisés pour tester une base de code. Par conséquent, aucune quantité de tests unitaires ne devrait jamais être considérée comme sûre pour remplacer d'autres tests. Si vous avez un mauvais test d'intégration, vous devez travailler pour en faire un bon test d'intégration, pas le remplacer par autre chose, c'est comme remplacer votre porte d'entrée par une clôture de périmètre et une porte.

Ryathal
la source
Si ce projet partait de zéro, cela aurait plus de sens pour moi. Mais mon premier test d'intégration a été "vérifier que vous pouvez vous connecter" et finalement j'ai fait beaucoup de tests unitaires qui "vérifient que vous pouvez vous connecter". Le test d'intégration se bloque tout le temps si vous modifiez le html. Cet exemple est complètement artificiel, mais n'est-ce pas un bon argument pour supprimer le test d'intégration?
Daniel Kaplan
3
@tieTYT: tester quelque chose via l'interface utilisateur conduit souvent à une solution très instable. Néanmoins, les tests par l'interface utilisateur sont importants, il arrive parfois que les tests manuels produisent moins d'efforts que d'essayer d'automatiser ce test et de le maintenir stable. Donc, lorsque vous pensez que c'est le cas ici, vous pouvez supprimer ce "test d'intégration" de la liste des tests automatisés et l'ajouter à votre plan de test de tests manuels.
Doc Brown
@DanielKaplan serait-il possible de mettre à jour le test d'intégration pour être plus stable? Si cela échoue parce que le html change parfois, alors testez peut-être quelque chose comme "le nom d'utilisateur apparaît sur la page après la connexion" plutôt que quelque chose de plus spécifique comme "le nom d'utilisateur apparaît dans cette div après la connexion"
Jen