C'est une mauvaise pratique d'avoir plus d'une affirmation dans un test unitaire?
C'est une mauvaise pratique d'avoir plus d'une affirmation dans un test unitaire? Est-il question?
- les doublons stackoverflow.com/questions/762192/...
- Je ne pense pas que c'est un dupe, @mek. Votre lien est de plus d'une case dans un test, ce qui semble être pour d'autres choses que l'affirme.
- Voir aussi stackoverflow.com/questions/5025435/...
Vous devez vous connecter pour publier un commentaire.
Parfois, j'ai exactement un
assert
par cas de test, mais je pense que le plus souvent j'ai plusieursassert
consolidés.J'ai vu le cas que @Arkain échappe, où un très grand morceau de code a une seule unité de la suite de tests avec juste un peu de cas de test, et ils sont tous étiquetés
testCase1
,testCase2
, etc, et chaque cas de test a des centaines de affirme. Et encore mieux, chaque état dépend habituellement de la les effets secondaires de l'exécution précédente. Chaque fois que l'échec de la construction, toujours dans un test unitaire, il faut un certain temps pour déterminer où était le problème.Mais l'autre extrême, est ce que votre question suggère: un autre cas de test pour chaque état possible. En fonction de ce que vous faites des tests, cela peut avoir du sens, mais souvent j'ai plusieurs
assert
s par cas de test.Par exemple, si vous avez écrit
java.lang.Integer
, vous pourriez avoir quelques cas qui ressemblent à:Quelques règles simples que je peux penser de la main pour combien d'affirmer est à mettre dans un cas de test:
assert
qui dépend de la les effets secondaires de l'exécution précédente.assert
s en même temps que le test de la même fonction/caractéristique ou une facette de celle-ci--pas besoin de la surcharge de plusieurs scénarios de test unitaire lorsqu'il n'est pas nécessaire.assert
consolidés.Non, ce n'est pas une mauvaise pratique. Si la méthode de test renvoie une classe, vous devez tester les différentes variables qui doivent avoir été définies. À cet effet, vous pourriez aussi bien utiliser un appareil de test.
Si, toutefois, vous êtes à l'essai de plusieurs fonctions en un seul appareil de test, il n'est pas aussi clair lorsqu'il ne remplit pas les fonctions qui a causé le problème. Rappelez-vous des tests unitaires sont à votre ami, alors laissez-les vous aider. De le rendre facilement disponible pour voir ce qui n'allait pas, alors vous pouvez aller le réparer.
Vos tests unitaires devraient être assez fines. En général, moins il l'affirme, le plus probable que votre test est de cibler une fonction spécifique, et ne pas se mélanger les tests pour plusieurs entités d'un même test. Est-ce à dire que tous les tests ne devrait avoir qu'un faire valoir? Non, mais je le considère comme un "test de l'odorat" si j'ai trouvé plusieurs affirme, potentiellement test de plusieurs choses dans la même unité de test. Traiter cette "odeur" comme une odeur de code et de refactoriser le test de l'améliorer afin qu'il ne teste que sur une "chose", même si cela nécessite plus qu'un faire valoir.
Par exemple, je suis en train de faire un projet MVC maintenant et l'un des tests que j'écris, c'est que la vue correcte est rendu par l'action. Il y aura peut-être plusieurs de ces si différents chemins de code peut entraîner différents points de vue. C'est la définition de la vue correcte: le résultat est le bon type et le nom correct. Cela nécessite deux affirme, mais je ne fais que des tests d'une chose.
Je pourrais faire quelque chose de similaire avec le modèle, mais je ne voudrais pas tester que le modèle est correct dans le même test que la vérification de la vue, car ce sont les différents aspects du comportement du code. J'ai pu modifier le modèle ou la vue et en le mettant dans un autre test, seuls les tests concerné par cette caractéristique de la méthode doivent être modifiées.
Pour moi sa très fréquent d'avoir plus qu'un faire valoir dans un test unitaire. J'ai habituellement une affirmation d'une condition préalable et un faire valoir pour le post-condition.
Considérer:
Oui, j'ai pu séparer les deux postes les conditions dans les deux tests, mais en fonction du coût de la FetchValues pourrait ralentir l'ensemble du processus de test inutilement.
Je ne la considérons pas comme une mauvaise pratique. Les tests unitaires peuvent faire ce qu'ils veulent: affirmer, journal de fichiers, envoyer des insultes par SMS à la gestion, à quoi que ce soit.
La possible problème est que la complexité peut changer le comportement du programme sous test, mais c'est rarement le cas si vous êtes prudent, et peuvent être découverts de toute façon.
Mettre dans toutes les affirme que vous souhaitez. Sérieusement.
J'essaie de faire valoir à chaque étape du chemin jusqu'à et y compris l'objectif spécifique de mon test.
Je dois certainement utiliser une seule affirmer dans la méthode d'essai! À l'aide de nombreuses assertions peuvent être l'odeur de code que vous souhaitez tester plus d'une chose. En outre, il ya une chance que quelqu'un peut ajouter de nouveaux affirmer dans votre test, au lieu d'écrire un autre. Et comment pouvez-vous comprendre comment vos autres affirme terminé lorsque la première a échoué?
Vous pouvez également trouvé intéressant cet article: https://timetocode.wordpress.com/2016/06/01/zen-of-unit-testing/
Il n'a pas d'importance. La seule chose qui compte, c'est que vos tests unitaires couvrira tous les possibles bugs.
Ceci est un exemple de "sur-pensée".
Un "test Unitaire" devrait test 1 unité, pour être aussi petite que possible et de tester seulement 1 chose certaine.
Je suggère d'avoir seulement 1 affirmer
MAIS je pense que c'est ok d'avoir 2 affirmations aussi longtemps qu'ils ne sont pas l'un derrière l'autre.
Mauvais exemple