Question Quelle est la différence entre un faux et un talon?


J'ai lu divers articles sur la moquerie et le blocage dans les tests, y compris Les Mocks de Martin Fowler ne sont pas des stubs, mais ne comprends toujours pas la différence.


668
2017-08-11 14:19


origine


Réponses:


Bout

Je crois que la plus grande distinction est qu'un bout 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 la plus probable) que vous simulez à des fins de test et les méthodes seraient simplement écrasées avec des réponses définies. Ils ne feraient rien d'extraordinaire et vous auriez déjà écrit le code tronqué pour cela en dehors de votre test.

Moquer

Un simulacre est quelque chose qui dans le cadre de votre test, vous devez configurer avec vos attentes. Un simulacre n'est pas configuré de manière prédéterminée, donc vous avez du code qui le fait dans votre test. Les mocks d'une certaine manière sont déterminés au moment de l'exécution car le code qui définit les attentes doit être exécuté avant de faire quoi que ce soit.

Différence

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

Similarité

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 essayent de prouver.


525
2017-08-11 14:38



Avant-propos

Il y a plusieurs définitions d'objets, qui ne sont pas réelles. Le terme général est test double. Ce terme englobe: mannequin, faux, bout, moquer.

Référence

Selon L'article de Martin Fowler:

  • Mannequin les objets sont transmis mais jamais réellement utilisés. Habituellement, ils sont simplement utilisés pour remplir les listes de paramètres.
  • Faux Les objets ont en fait des implémentations de travail, mais prennent généralement un raccourci qui les rend inadaptés à la production (une base de données en mémoire est un bon exemple).
  • Stubs Fournir des réponses prédéfinies aux appels effectués pendant le test, ne répondant généralement pas à quoi que ce soit en dehors de ce qui est programmé pour le test. Les talons peuvent également enregistrer des informations sur les appels, comme un talon de passerelle de messagerie qui se souvient des messages qu'il a «envoyés» ou peut-être seulement sur le nombre de messages qu'il a «envoyés».
  • Mocks sont ce dont nous parlons ici: des objets préprogrammés avec des attentes qui forment 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 Tester seulement une chose par test, il peut y avoir plusieurs talons dans un test, mais généralement il n'y a qu'un seul faux.

Cycle de la vie

Test du cycle de vie avec des stubs:

  1. Configuration - Préparez l'objet en cours de test et ses collaborateurs de talons.
  2. Exercice - Testez la fonctionnalité.
  3. Vérifier l'état - Utilise les asserts pour vérifier l'état de l'objet.
  4. Démontage - Nettoyer les ressources.

Testez le cycle de vie avec des faux-semblants:

  1. Configurer les données - Prépare l'objet en cours de test.
  2. Configurer les attentes - Préparer les attentes dans le simulacre qui est utilisé par l'objet principal.
  3. Exercice - Testez la fonctionnalité.
  4. Vérifiez les attentes - Vérifiez que les méthodes correctes ont été invoquées dans Mock.
  5. Vérifier l'état - Utilise les asserts pour vérifier l'état de l'objet.
  6. Démontage - Nettoyer les ressources.

Résumé

Les tests de faux-moignons et de talons donnent une réponse à la question: Quel est le résultat?

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


641
2017-07-23 12:18



Stub est un objet faux simple. Il s'assure que le test se passe bien.
Mock est un talon plus intelligent. Vous vérifiez que votre test le traverse.


229
2017-08-11 14:33



Voici une description de chacun suivi d'un exemple du monde réel.

  • Mannequin - Juste des valeurs fausses pour satisfaire la API.

    Exemple: Si vous testez une méthode d'une classe qui nécessite de nombreux paramètres obligatoires dans un constructeur n'ont aucun effet Lors de votre test, vous pouvez créer des objets fictifs dans le but de créer de nouvelles instances d'une classe.

  • Faux - créer une implémentation de test d'une classe pouvant dépendre d'une infrastructure externe. (C'est une bonne pratique que votre test unitaire ne NE PAS interagissent réellement avec l'infrastructure externe.)

    Exemple: Créer une fausse implémentation pour accéder à une base de données, la remplacer par in-memory collection.

  • Bout - remplacer les méthodes pour renvoyer des valeurs codées en dur, également appelées state-based.

    Exemple: Votre classe de test dépend d'une méthode Calculate() prendre 5 minutes pour terminer. Plutôt que d'attendre 5 minutes, vous pouvez remplacer son implémentation réelle par un stub qui renvoie des valeurs codées en dur; prendre seulement une petite fraction du temps.

  • Moquer - très similaire à Stub mais interaction-based plutôt que d'état. Cela signifie que vous ne vous attendez pas à Mock pour renvoyer une certaine valeur, mais pour supposer que l'ordre spécifique des appels de méthode est fait.

    Exemple: vous testez une classe d'inscription d'utilisateur. Après avoir appelé Save, il devrait appeler SendConfirmationEmail.

Stubs et Mocks sont en fait des sous-types de Mock, les deux swap implémentation réelle avec implémentation de test, mais pour des raisons différentes et spécifiques.


161
2017-11-26 14:12



dans le codeschool.com cours, Rails de test pour les zombies, ils donnent cette définition des termes:

Bout

Pour remplacer une méthode par du code renvoyant un résultat spécifié.

Moquer

Un talon avec une affirmation que la méthode est appelée.

Ainsi que Sean Copenhaver l'a décrit dans sa réponse, la différence est que les simulacres fixent des attentes (c'est-à-dire font des assertions, à propos de si ou comment ils sont appelés).


152
2017-07-04 22:32



Les talons n'échouent pas tes tests, bidon bidon.


104
2018-04-18 20:05



Je pense que la réponse la plus simple et la plus claire à propos de cette question est donnée par Roy Osherove dans son livre L'art des tests unitaires (page 85)

La façon la plus facile de dire que nous avons affaire à un talon est de remarquer que le talon ne peut jamais échouer le test. Le affirme les utilisations de test sont toujours contre   la classe à tester.

D'autre part, le test utilisera un objet simulé pour vérifier si le   test échoué ou non. [...]

Encore une fois, l'objet simulé est l'objet que nous utilisons pour voir si le test a échoué ou non.

Cela signifie que si vous faites des assertions contre le faux, cela signifie que vous utilisez le faux comme un faux, si vous utilisez le faux seulement pour exécuter le test sans assertion dessus, vous utilisez le faux comme un talon.


25
2017-08-24 14:06