Au cours des dernières semaines, j'ai réfléchi et recherché comment combler une lacune dans notre méthodologie de test. En termes simplifiés, les tests unitaires sont trop petits et les tests d'intégration traditionnels sont trop grands.
Un scénario fréquent se présente où A
et les B
deux utilisent le composant C
. Cependant A
et B
ont des exigences légèrement différentes pour, et font des hypothèses légèrement différentes sur C
. Si je suis le développeur de A
comment et où dois-je tester mes hypothèses C
?
De toute évidence, les tests unitaires A
avec des hypothèses simulées C
sont corrects pour les tests A
de manière isolée, mais ils ne testent pas les hypothèses elles-mêmes.
Une autre possibilité consiste à ajouter des tests unitaires pour C
. Cependant, ce n'est pas idéal car, A
en cours de développement, la modification des tests C
avec des hypothèses évolutives A
sera excessivement maladroite. En effet, A
le développeur peut ne pas même avoir un accès adéquat aux tests unitaires de C
(par exemple une bibliothèque externe).
Pour encadrer cela avec un exemple plus concret: Supposons qu'il s'agit d'une application de nœud. A
, et B
dépendent C
de la lecture d'un fichier (entre autres) et du stockage du contenu du fichier dans l'objet transmis à C
. Au début, tous les fichiers qui C
sont gérés sont petits et peuvent être lus de manière synchrone sans blocage significatif. Cependant, le développeur de se B
rend compte que ses fichiers deviennent énormes et doit passer C
à une lecture asynchrone. Il en résulte un bogue de synchronisation sporadique A
, qui suppose toujours la C
lecture des fichiers de manière synchrone.
Il s'agit du type de bogue qui est notoirement difficile à détecter à partir des tests d'intégration complets et qui peut ne pas être détecté du tout dans les tests d'intégration. Il n'est pas non plus pris en compte par A
les tests unitaires car les A
hypothèses sont faussées. Cependant, il pourrait facilement être rattrapé par un "mini" test d'intégration qui s'exerce simplement A
et C
.
Je n'ai trouvé que quelques références à ce type de test. Intégration dans les petites , tests d' intégration des composants , Unité de l' intégration de test. Il se rapporte également quelque peu à la direction des tests BDD plutôt qu'aux tests unitaires TDD formels.
Comment puis-je combler cette lacune de test? Plus précisément - où dois-je mettre ces tests? Comment se moquer des entrées de A
et C
pour les "mini" tests d'intégration? Et combien d'efforts devraient être déployés pour séparer les problèmes de test entre ces tests et les tests unitaires? Ou existe-t-il une meilleure façon de combler l'écart de test?