J'ai lu de nombreux articles sur les tests unitaires. La plupart des articles ont dit que nous ne devrions pas utiliser plus d'un objet simulé dans un test, mais je ne peux pas comprendre pourquoi. Parfois, nous avons vraiment besoin de plus d'un objet simulé dans un test.Pouvons-nous utiliser plus d'un objet simulé dans un test unitaire?
Répondre
Vous devez ajouter autant de mock que nécessaire pour isoler votre classe testée. Vous avez besoin d'un simulacre pour chaque dépendance qui ne devrait pas faire partie du test.
Parfois, vous mettez deux ou trois classes ensemble dans un test, par simplicité, car ils construisent quelque chose comme un composant et sont fortement couplés. Tout le reste devrait être moqué. Je connais cette «meilleure pratique» pour avoir un seul simulacre et ne le comprends pas non plus. Dans nos tests unitaires, nous avons beaucoup de simulacres, certains simulacres environnementaux sont mis en place par le cadre de test que j'ai écrit (par exemple, TransactionService, SecurityService, SessionService). Il n'y a qu'une seule chose à considérer, comme Gishu l'a déjà mentionné dans sa réponse, de nombreux faux-semblants sont une indication d'une forte dépendance. C'est à vous de considérer quand c'est trop. Nous avons beaucoup de petites interfaces, ce qui nécessite de nombreux tests de simulation.
Pour activer votre réponse autour, vous ne devriez pas une dépendance moquerai quand:
- Il est une partie très couplée de la classe en cours de test, comme une classe interne, classe privée, etc.
- C'est une classe de framework .NET commune comme une collection et autres
- Vous voulez écrire un test d'intégration pour tester exactement l'interaction avec cette classe. (Vous vous moquez toujours de tout le reste et vous avez toujours des tests unitaires pour chaque classe impliquée dans l'isolement.)
- Il est juste trop coûteux de se moquer d'une certaine classe. Soyez prudent en décidant que c'est trop cher, les simulacres semblent être difficiles à configurer, mais s'avèrent être un jeu d'enfant par rapport aux problèmes de maintenabilité que vous aurez avec l'utilisation de vraies classes. Mais il existe des cadres et des technologies qui ne sont pas implémentés par rapport aux interfaces et qui sont très difficiles à simuler. S'il est trop coûteux de placer ces classes de framework derrière votre propre interface, vous devez les utiliser dans les tests.
Je ne suis pas sûr de savoir de quels articles vous parlez, mais j'ai généralement un objet simulé par dépendance pour la classe à tester.
Vous pouvez avoir plus d'un simulacre dans un test unitaire en fonction du contexte.
Cependant, je pense que 'les articles' pourraient être faisant allusion à est
-
prévention des
- sur-moqueur. Quand un test d'unité se moque de tous les collaborateurs, vous laissez la porte ouverte; le scénario peut échouer lorsque vous remplacez de vrais collaborateurs. En minimisant le nombre de faux-semblants et en utilisant de vrais collaborateurs autant que possible/possible, vous minimisez ce risque.
- High Coupling alertes: Si vous devez vous moquer de beaucoup de collaborateurs pour écrire un test unitaire, il peut s'agir d'une odeur de conception indiquant que vous avez un couplage élevé.
+1 pour l'indice de couplage.Mais je ne suggérerais pas d'utiliser de «vrais collaborateurs» uniquement pour réduire le nombre de faux-semblants. Parfois, vous testez plusieurs classes ensemble, car elles sont fortement couplées et construisent un composant. Mais tout ce qui est à l'extérieur devrait être isolé aussi bien que possible. Si vous trouvez que vous avez trop de mock, vous avez un problème de couplage. Ensuite, vous devriez refactoriser. –
Je recommande d'utiliser des «vrais» collaborateurs non pas pour réduire le nombre de mocks .. mais pour faire fonctionner le miroir en mode réel. C'est pour éviter le cas où votre test passe parce que vous étiez en train de jouer avec un ensemble d'objets fantaisistes. Cependant, dans le monde réel, il ne fonctionne pas car l'une des dépendances n'agit pas comme le simulacre correspondant. Si le collaborateur ne ralentit pas le test unitaire, créer une interface à la limite, puis utiliser un simulacre est trop rapide. – Gishu
@Gishu: Je ne suis pas d'accord. Les mocks sont pour l'isolation, pas pour la vitesse. Vous devez isoler le code testé aussi bien que possible, c'est comme un test de laboratoire en chimie, vous simplifiez l'environnement pour isoler un seul processus. Ensuite, vous pouvez prouver ce que fait le processus, indépendamment d'un environnement inconnu. Les simulacres doivent être triviaux et donc gérables. Les autres classes sont une autre inconnue. Ce que vous faites est également important, mais c'est un test d'intégration, que vous devriez faire après avoir prouvé que les classes individuelles se comportent selon les spécifications. –
- 1. Création d'un objet System.Web.Caching.Cache dans un test unitaire
- 2. Mocking l'instanciation d'un objet pour un test unitaire
- 3. Comment tester un second paramètre dans un objet simulé PHPUnit
- 4. Servlets de test unitaire
- 5. Test unitaire avec un fichier d'entrée
- 6. Comment puis-je utiliser un fichier de données dans un test unitaire VS 2008?
- 7. Comment charger des appareils dans un objet simulé dans des rails pour des tests?
- 8. Test unitaire: Maven ou Eclipse?
- 9. Obtention d'arguments de ligne de commande dans un test unitaire
- 10. NMock2, Rhino simulé. Lequel choisir?
- 11. Puis-je utiliser jtracert pour séquencer un test unitaire s'exécutant dans eclipse?
- 12. GWT Test unitaire TDD et outillage
- 13. Comment puis-je écrire un test unitaire pour l'événement Gridview_RowCommand?
- 14. Fonctions de test unitaire reposant sur MouseEventArgs?
- 15. constructeur de test unitaire qui utilise My.Settings
- 16. Test de code unitaire qui appelle VirtualPathUtility.ToAbsolute
- 17. Redéfinition des haricots de printemps dans l'environnement de test unitaire
- 18. SubSonic GetPaged méthode - différent indice nécessaire dans le test unitaire
- 19. .NET WebTest Custom ValidationRules - Comment faire un test unitaire?
- 20. Comment effectuer un test unitaire pour une application Web?
- 21. Quel cadre de test unitaire gratuit pour C#?
- 22. Comment gérer l'exception dans un thread d'arrière-plan dans un test unitaire?
- 23. Spring - Ignorer la méthode init en test unitaire
- 24. MockEJB - JUnit Mockito - ne peut pas relier un simulacre d'EJB au deuxième test unitaire
- 25. Passer de MSTest à un autre environnement de test unitaire dans VS 2010
- 26. Meilleur cadre de test unitaire pour l'ancienne école QNX?
- 27. Création d'un processus séparé à partir d'un test unitaire
- 28. Test si un objet implémente une interface
- 29. Test des procédures stockées CLR SQL avec le projet de test unitaire
- 30. Comment écrire un test unitaire automatisé d'une interface graphique dans Xcode?
"L'art du test unitaire" dit exactement cela. Testez seulement une chose par test, chaque fois que ce que signifie une chose n'est pas clair. –