Quels sont les facteurs clés dans le choix d'un cadre de simulation?

15

Je cherche à démarrer avec les objets dans mes tests unitaires. Il semble qu'il existe des tonnes de bons cadres de simulation.

  1. Les différents cadres ont-ils différents publics cibles?
  2. Quels facteurs dois-je prendre en compte lors du choix du cadre adapté à ma situation?
epotter
la source
Je travaille dans un environnement .Net, mais je voulais que la question soit applicable aux frameworks de simulation en général.
epotter

Réponses:

14

Les différents cadres ont-ils différents publics cibles?

Oui. Certains frameworks comme Microsoft Moles , TypeMock Isolator et JustMock , vous permettent de vous moquer de tout. Ces outils de simulation sont généralement meilleurs pour les développeurs qui souhaitent les utiliser sur du code existant, car il peut ne pas être possible de refactoriser une telle version dans une conception plus testable. *

Traditionnellement, les conceptions testables signifie que le code de base doit utiliser libérale des interfaces, classes abstraites, des méthodes virtuelles, des classes non scellées, etc. Par conséquent, les cadres moqueurs traditionnels comme Moq et RhinoMocks travail bien avec le code développé à l' aide Test Driven Development, injection de dépendance, et d'autres concepts de ce type. Soit dit en passant, je recommanderais fortement d'utiliser l'injection de dépendances, car vous gagnez beaucoup plus que du code testable, mais aussi du code plus maintenable.

Quels facteurs dois-je prendre en compte lors du choix du cadre adapté à ma situation?

  • Activité de développement. Des outils comme Moq et RhinoMocks sont très actifs et populaires et sont donc à jour.
  • Open Source Vs. Commercial . Considérez les divers avantages et inconvénients typiques de cette comparaison. Coût, support, etc ...
  • Maturité. L'outil est nouveau. Est-il en version bêta (comme Microsoft Moles) ou a-t-il eu plusieurs versions stables? Par exemple, j'aime Moles pour le code hérité, mais il y a plusieurs bogues qui doivent être corrigés et il faudra attendre longtemps avant qu'ils ne soient corrigés (prochaine version novembre 2011).
  • Documentation. Il existe plusieurs livres et blogs qui couvrent les tests unitaires, les moqueries, les moqueries automatiques, etc. De plus, quelle est la qualité de la documentation de l'outil?
  • Syntaxe . Chaque outil a sa propre façon de dire la même chose. Voyez lequel vous convient le mieux.
  • La vitesse . Les outils qui utilisent le profilage CLR (TypeMock, Moles, JustMock), peuvent être beaucoup plus lents que les outils traditionnels (Moq, RhinoMocks). Cette pénalité de vitesse peut être un problème car vous effectuez de nombreux tests unitaires. En règle générale, si un test dure plus de 1/10 de seconde, il est trop lent.
  • Soutien communautaire . D'autres développeurs écrivent-ils d'autres outils qui s'étendent (ou fonctionnent en complément) à l'outil de simulation? Il existe un projet Moq.Contrib qui ajoute une capacité de mocking automatique à Moq (ce qui permet d'accélérer le temps d'écriture des tests). Mieux encore, il existe AutoFixture , AutoFixture.AutoMoq, AutoFixture.AutoRhinoMocks, qui permet également le mocking automatique, ainsi que la création de variables anonymes.

* Voir Travailler efficacement avec le code hérité , pour savoir comment refaçonner lentement le code sans tests en code qui peut être utilisé avec des outils de test (et de simulation) traditionnels.

Mat
la source
2

Le tutoriel Moq a une section sur le fond, la philosophie et la controverse au début qui en discute en relation avec quelques outils spécifiques: TypeMock Isolator, RhinoMocks et Moq. Il est écrit pour expliquer Moq, il est donc naturellement un peu biaisé, mais je l'ai trouvé très utile pour moi lorsque j'essaie de comprendre certaines des différences dans les cadres de simulation.

J'ai trouvé les réponses à ce fil de discussion SO sur C # Mocking Frameworks également utiles. La plupart se réfèrent simplement à un Mocking Framework que l'utilisateur trouve vraiment utile, mais il y a une réponse de HaraldV un peu plus bas qui discute des simulations basées sur un proxy et des simulations basées sur un profileur.

J'ai également pu trouver un tableau comparatif en ligne. Notez que cela date de 2009, donc je ne suis pas sûr qu'il soit à jour; il y a au moins un commentaire indiquant que les informations sur TypeMock et les rappels sont obsolètes, mais le graphique peut être utile pour soulever des problèmes à prendre en compte même si vous devrez faire des démarches pour voir l'état actuel: RhinoMocks, Moq, NMock, et tableau de comparaison TypeMock

Il existe un projet sur Google Code avec des cas de test dans plusieurs frameworks de simulation pour une comparaison de code facile: mocking-frameworks-compare

Ethel Evans
la source
2
  1. Facilité d'utilisation. Certains cadres ont des idiomes d'utilisation plus avancés. Par exemple, MOQ permet l'utilisation de lambdas pour coder les attentes. Certaines bibliothèques plus anciennes ne le prennent pas en charge.
  2. La vitesse. Chaque test unitaire doit être rapide afin que votre bibliothèque entière ne prenne pas des heures à s'exécuter. Certains frameworks de simulation ont des simulations générées statiquement, ce qui est rapide. D'autres frameworks génèrent dynamiquement du code lors de l'exécution, ce qui est plus lent.
  3. Soutien. Vous souhaitez un cadre activement pris en charge avec des correctifs et mis à jour pour prendre en charge les nouvelles versions de .NET, au fur et à mesure qu'elles sont publiées.
  4. Puissance. La plupart des cadres de simulation que j'ai étudiés sont à peu près les mêmes en termes de puissance. Il y a une exception notable. Microsoft Moles permet de se moquer des «méthodes non virtuelles / statiques dans les types scellés». C'est quelque chose qu'aucun autre cadre moqueur ne prend en charge, à ma connaissance.

Dans mon équipe, nous avons choisi Microsoft Moles . Il gagne de manière significative sur # 2, # 3 et # 4, bien qu'il soit moins idiomatique que la plupart des alternatives et est à l'extrémité inférieure sur # 1.

Matthew Rodatus
la source
Maintenant, de nombreux frameworks comme TypeMock, JustMock permettent de se moquer des méthodes statiques, des classes scellées, etc.
muruge