1140 votes

Quelle est la différence entre une maquette et un talon ?

J'ai lu plusieurs articles sur le mocking par rapport au stubbing dans les tests, notamment Les moqueries de Martin Fowler ne sont pas des moquettes mais je ne comprends toujours pas la différence.

118 votes

@OP Parce qu'il n'y a pas de différence. Cet article, bien qu'aimé par la communauté, rend - avec tout le respect que je lui dois - tout ce qui est inutile confus en ajoutant un sens supplémentaire à des mots qui sont faciles à comprendre autrement et en rendant les choses inutilement compliquées. L'objet fantaisie n'est qu'un objet fantaisie, quelque chose qui exécute une fausse logique d'entreprise au lieu d'une vraie. La vérification du comportement à la fin est votre choix, mais c'est toujours un simulacre. Ou appelez-le comme vous voulez, mais faites-en UNE. Ne coupez pas les cheveux en quatre. Restez simple, afin que les gens puissent comprendre votre concept facilement - ce que l'article ci-dessus ne fait pas.

17 votes

"La classification entre mocks, fakes et stubs est très incohérente dans la littérature." Avec de nombreuses citations. Toujours une de mes citations Wikipedia préférées - si une telle chose existe :) fr.wikipedia.org/wiki/Mock_object

985voto

Ryszard Dżegan Points 4079

Avant-propos

Il existe plusieurs définitions d'objets, qui ne sont pas réels. Le terme général est test double . Ce terme englobe : factice , faux , talon , simuler .

Référence

Selon L'article de Martin Fowler :

  • Dummy Les objets sont transmis mais ne sont jamais utilisés. En général, ils sont juste utilisés pour remplir les listes de paramètres.
  • Faux ont en fait des implémentations fonctionnelles, mais prennent généralement un raccourci qui les rend inadaptés à la production (une base de données en mémoire en est un bon exemple).
  • Stubs fournissent des réponses toutes faites aux appels effectués pendant le test, et ne répondent généralement pas du tout à ce qui n'est pas programmé pour le test. Les stubs peuvent également enregistrer des informations sur les appels, comme un stub de passerelle de messagerie qui se souvient des messages qu'il a "envoyés", ou peut-être seulement du nombre de messages qu'il a "envoyés".
  • Mocks sont ce dont nous parlons ici : des objets préprogrammés avec des attentes qui constituent une spécification des appels qu'ils sont censés recevoir.

Style

Mocks vs Stubs = Tests comportementaux vs tests d'état

Principe

Selon le principe de Ne testez qu'un seul élément par test Dans les tests, il peut y avoir plusieurs stubs dans un test, mais généralement il n'y a qu'un seul mock.

Cycle de vie

Cycle de vie des tests avec les stubs :

  1. Setup - Préparer l'objet qui est testé et ses collaborateurs stubs.
  2. Exercice - Tester la fonctionnalité.
  3. Vérifier l'état - Utiliser les assertions pour vérifier l'état de l'objet.
  4. Démontage - Nettoyer les ressources.

Cycle de vie des tests avec les mocks :

  1. Données de préparation - Préparer l'objet qui est testé.
  2. Définir les attentes - Préparez les attentes dans l'objet fictif qui est utilisé par l'objet primaire.
  3. Exercice - Tester la fonctionnalité.
  4. Vérifier les attentes - Vérifier que les méthodes correctes ont été invoquées dans l'objet fantaisie.
  5. Vérifier l'état - Utiliser les assertions pour vérifier l'état de l'objet.
  6. Démontage - Nettoyer les ressources.

Résumé

Les tests mocks et stubs donnent tous deux une réponse à la question : Quel est le résultat ?

Les tests avec des mocks sont également intéressés par : Comment le résultat a-t-il été atteint ?

0 votes

Attendez, les tests blancs donnent aussi des réponses toutes faites ? Parce que sinon, pourquoi répondent-ils à la question ?

0 votes

D'après ce que vous avez écrit, je peux dire que les mocks = stubs + attentes et vérifications, parce que les mocks "fournissent des réponses en conserve aux appels faits pendant le test, ne répondant généralement à rien en dehors de ce qui est programmé pour le test" (comme les stubs). Et l'exemple que Fowler a montré comme exemple de stub est en fait un exemple d'espion ! Cela signifie qu'un mock est un stub, et qu'un spy est un stub. Et un stub est juste un objet qui a plusieurs méthodes de travail. Cela explique aussi pourquoi Mockito a déprécié la méthode stub().

0 votes

Ce que je trouve déroutant à ce sujet et la réponse acceptée est ce "réglage des attentes", qu'est-ce que cela signifie ? Habituellement, dans le "code principal", vous créez les résultats que vous attendez. Il semble que vous ayez placé les attentes d'une manière ou d'une autre DANS l'objet fantaisie, ce qui n'a pas de sens pour moi. De plus, vous pourriez tout aussi bien exercer l'objet fantaisie avec une entrée, stocker le résultat, créer "les attentes" plus tard et ensuite comparer. Vous utilisez une terminologie que je trouve trop abstraite et ambiguë.

846voto

Sean Copenhaver Points 2070

Stub

Je crois que la plus grande distinction est qu'un stub que vous avez déjà écrit avec un comportement prédéterminé. Ainsi, vous auriez une classe qui implémente la dépendance (classe abstraite ou interface, le plus souvent) que vous simulez à des fins de test et les méthodes seraient simplement stubées avec des réponses définies. Elles ne feraient rien d'extraordinaire et vous auriez déjà écrit le code de la stub en dehors de votre test.

Mock

Un modèle est quelque chose qui fait partie de votre test et que vous devez configurer en fonction de vos attentes. Un mock n'est pas configuré d'une manière prédéterminée, vous avez donc du code qui le fait dans votre test. D'une certaine manière, les fantaisies sont déterminées au moment de l'exécution puisque le code qui définit les attentes doit être exécuté avant qu'elles ne fassent quoi que ce soit.

Différence entre Mocks et Stubs

Les tests écrits avec des mocks suivent généralement un initialize -> set expectations -> exercise -> verify modèle à tester. Alors que le stub pré-écrit suivrait un modèle initialize -> exercise -> verify .

Similitude entre Mocks et Stubs

Le but des deux est d'éliminer le test de toutes les dépendances d'une classe ou d'une fonction afin que vos tests soient plus ciblés et plus simples dans ce qu'ils essaient de prouver.

1 votes

Une ligne déroutante - A mock is something that as part of your test you have to setup with your expectations. A mock is not setup in a predetermined way so you have code that does it in your test. Donc, c'est mis en place selon vos attentes, mais pas de manière prédéterminée ? Comment cela est-il possible ?

440voto

Arnis L. Points 18316

Un stub est un simple faux objet. Il permet simplement de s'assurer que le test se déroule correctement.
Un mock est un stub plus intelligent. Vous vérifiez que votre test passe par lui.

44 votes

Je pense que c'est la réponse la plus succincte et la plus juste. À retenir : un simulacre est un talon d'Achille. stackoverflow.com/a/17810004/2288628 est la version longue de cette réponse.

13 votes

Je ne pense pas qu'un mock soit un stub. Les mocks sont utilisés pour asserter et ne devraient jamais retourner des données, les stubs sont utilisés pour retourner des données et ne devraient jamais asserter.

4 votes

@dave1010 Les objets fantaisie peuvent très certainement renvoyer des données ou même lever une exception. Ils doivent le faire en réponse aux paramètres qui leur sont passés.

190voto

Dillon Kearns Points 1249

Dans le codeschool.com cours, Tests Rails pour les zombies ils donnent cette définition des termes :

Stub

Pour remplacer une méthode par un code qui renvoie un résultat spécifié.

Mock

Un stub avec une assertion que la méthode est appelée.

Ainsi, comme l'a décrit Sean Copenhaver dans sa réponse, la différence est que les simulateurs définissent des attentes (c'est-à-dire qu'ils font des affirmations, sur le fait de savoir si ou comment ils seront appelés).

0 votes

Pour compléter le post de Dillon, pensez à ceci, vous avez une classe appelée "MakeACake" qui prend plusieurs bibliothèques : Lait, Oeufs, Sucre, Four.

159voto

brifbraff Points 630

Les stubs ne font pas échouer vos tests, les mock peuvent le faire.

2 votes

Et je pense que c'est bien, vous savez si les tests ont le même comportement après le remaniement.

1 votes

@RodriKing J'ai le même sentiment. Comme avec Mock, avec tout changement dans le code de production - vous avez des changements correspondants dans le code de test. Ce qui est pénible ! Avec les Stubs, on a l'impression que l'on continue à tester le comportement et que l'on n'a pas besoin d'apporter de micro modifications au code de test.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X