Quelle est la différence entre les falsifiant, en se moquant, et buter?
Je sais comment j'utilise ces termes, mais je me demandais si il y a des définitions acceptées de semblant, moqueur, et stubbing pour les tests unitaires? Comment définissez-vous ces pour vos tests? Décrire des situations où vous pourriez utiliser chaque.
Voici comment je les utilise:
Faux: une classe qui implémente une interface, mais qui contient des données fixes et pas de logique. Retourne simplement "bonne" ou "mauvaise" données en fonction de la mise en œuvre.
Se moquer de: une classe qui implémente une interface et permet la possibilité de définir de manière dynamique les valeurs de retour/exceptions à deux pas de méthodes particulières et offre la possibilité de vérifier si certaines méthodes ont été appelés/pas appelé.
Stub: Comme une maquette de la classe, sauf qu'il ne prévoit pas la possibilité de vérifier que les méthodes ont été appelés/pas appelé.
Se moque et des talons peut être généré ou généré par un moqueur cadre. Faux classes sont générées par la main. J'utilise se moque surtout de vérifier les interactions entre les élèves de ma classe et des classes dépendantes. J'utilise talons une fois que j'ai vérifié les interactions et suis en train de tester d'autres chemins à travers mon code. J'utilise de faux classes principalement à l'abstraction de dépendances de données ou quand on se moque de/talons sont trop fastidieux à configurer à chaque fois.
- Eh bien en gros, vous avez tout dit dans votre "question" 🙂 je pense que ceux qui sont assez bien accepté les définitions de ces termes
- La définition de Wikipedia de Faux diffère de ce, affirmant qu'un Faux "est utilisé comme une simplification de la mise en œuvre, par exemple à l'aide d'une base de données en mémoire dans les tests, plutôt que de faire de la vraie base de données access)" Voir en.wikipedia.org/wiki/Test_double
- J'ai appris beaucoup de ressources suivants, avec une excellente explication par Robert C. Martin (Oncle Bob): Le Peu Moqueur sur Le Propre Blog de Code. Il explique les différences entre les et les subtilités de mannequins, test doubles, des talons, des espions, des (vrais) se moque et des faux. Il mentionne également Martin Fowler et il explique un peu de tests de logiciels de l'histoire.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir des renseignements :
De Martin Fowler au sujet de Dérision et de Stub
Faux objets ont implémentations de travail, mais l'habitude de prendre des raccourcis qui les rend aptes à la production
Talons fournir des conserves de réponses à des appels effectués au cours de l'essai, habituellement, ne répond pas du tout à quoi que ce soit à l'extérieur de ce qui est programmée pour le test. Les talons peuvent également enregistrer des informations concernant les appels d'offres, comme une passerelle de messagerie stub qui se souvient des messages qu'il "envoyé", ou peut-être seulement le nombre de messages qu'il "envoyer".
Se moque de sont ce que nous en parlons ici: les objets pré-programmé avec des attentes, ce qui forme un cahier des charges des appels qu'ils devraient recevoir.
De xunitpattern:
Faux: Nous acquérir ou de construire une très légère mise en œuvre de la même fonctionnalité fournie par un composant qui le SUT dépend et d'instruire le SUT d'utiliser à la place du réel.
Stub : Cette application est configuré pour répondre à des appels de la CUS avec les valeurs (ou exceptions) qui exercera la fonction de Code non testé (voir la Production de Bugs sur la page X) au sein de la CUS. Une indication clé pour l'utilisation d'un Test de Stub est d'avoir le Code non testé causé par l'incapacité de contrôler les apports indirects de la SUT
Objet fantaisie qui implémente la même interface que l'objet sur lequel le SUT (Système Sous Test) dépend. On peut utiliser un Objet Fantaisie comme un point d'observation où nous avons besoin de faire le Comportement de Vérification pour éviter d'avoir un non testé Exigence (voir la Production de Bugs sur la page X) causée par une incapacité à observer les effets secondaires de l'appel de méthodes sur la CUS.
Personnellement
J'essaie de simplifier la vie en utilisant : Maquette et le Talon. J'utilise se Moquer quand c'est un objet qui renvoie une valeur qui est définie pour la classe testée. J'utilise Talon pour imiter une Interface ou une classe Abstraite pour être testé. En fait, il n'importe pas vraiment ce que vous l'appelez, ils sont de toutes les classes qui ne sont pas utilisés dans la production, et sont utilisés comme des classes utilitaires pour tester.
Stub - un objet qui fournit des réponses prédéfinies pour les appels de méthode.
Se moquer de - un objet sur lequel vous fixer des attentes.
Faux - un objet avec des capacités limitées (à des fins de test), par exemple un faux service web.
Test Double est le terme général pour les talons, se moque et des faux. Mais de façon informelle, vous entendrez souvent des gens appellent simplement se moque d'eux.
Je suis surpris que cette question a été autour depuis si longtemps et personne n'a encore fourni une réponse basée sur Roy Osherove de "L'Art de Tests Unitaires,.
Dans "3.1 Introduction stubs" définit un talon comme:
Et définit la différence entre les talons et se moque comme:
Faux, c'est juste le nom utilisé pour les deux talons et se moque. Par exemple, lorsque vous ne vous inquiétez pas à propos de la distinction entre les talons et se moque.
La façon Osherove la distinction entre les talons et se moque de, signifie que toute la classe utilisée comme un faux pour les tests peuvent être à la fois un tampon ou une maquette. Qui c'est pour un test spécifique qui dépend entièrement de la façon dont vous écrivez le vérifie dans votre test.
Exemple de test de la classe FakeX est utilisé comme un stub:
La
fake
exemple, est utilisé comme un tampon parce que leAssert
ne pas utiliserfake
à tous.Exemple d'un test où la classe de test X est utilisé comme un simulacre:
Dans ce cas, le
Assert
vérifie la valeur surfake
, ce qui le rend faux d'une fantaisie.Maintenant, bien sûr, ces exemples sont très artificiel, mais je vois beaucoup de mérite dans cette distinction. Il vous fait prendre conscience de la façon dont vous testez vos trucs et où les dépendances de votre test sont.
Je suis d'accord avec Osherove qui
Faire valoir contre le faux, c'est quelque chose que vous voulez vraiment éviter, car il rend vos tests fortement tributaire de la mise en œuvre d'une classe qui n'est pas l'objet de l'essai à tous. Ce qui signifie que les tests pour la classe
ActualClassUnderTest
peut commencer à briser parce que la mise en œuvre deClassUsedAsMock
changé. Et qui envoie une odeur désagréable pour moi. Tests pourActualClassUnderTest
doit, de préférence, break uniquement lorsqueActualClassUnderTest
est changé.Je me rends compte que l'écriture affirme contre le faux, c'est une pratique courante, surtout quand vous êtes un mockist type de TDD abonné. Je suppose que je suis fermement avec Martin Fowler dans le classicisme camp (Voir Martin Fowler "Simulacres ne sont pas des Talons") et comme Osherove éviter l'interaction des tests (qui ne peut être fait en s'affirmant contre le faux) autant que possible.
Pour le plaisir de la lecture sur pourquoi vous devriez éviter de se moque de tel que défini ici, google pour "fowler mockist classique". Vous trouverez une pléthore d'opinions.
Comme l'a indiqué le haut-voté réponse, Martin Fowler discute de ces distinctions dans Simulacres ne Sont pas des Talons, et en particulier de la sous-position La Différence Entre les Simulacres et les Talons de, alors assurez-vous de lire cet article.
Plutôt que de se concentrer sur comment ces choses sont différentes, je pense qu'il est plus instructif de se concentrer sur pourquoi ce sont des concepts distincts. Chacun existe pour un but différent.
Faux
Un faux est une application qui se comporte de façon "naturelle", mais n'est pas "réel". Ce sont des concepts flous et si différentes personnes ont différentes conceptions de ce qui rend les choses un faux.
Un exemple d'un faux, c'est une base de données en mémoire (par exemple, utiliser sqlite avec le
:memory:
magasin). Vous de ne jamais utiliser cela pour la production (puisque les données ne sont pas conservées), mais il est parfaitement suffisante en tant que base de données à utiliser dans un environnement de test. C'est aussi beaucoup plus léger qu'un "réel" de la base de données.Comme autre exemple, vous utilisez peut-être une sorte de magasin d'objets (par exemple, Amazon S3) dans la production, mais dans un test, vous pouvez simplement enregistrer des objets dans des fichiers sur le disque; alors votre "enregistrer sur le disque" la mise en œuvre serait un faux. (Ou vous pouvez même le faux "enregistrer sur le disque" opération à l'aide d'un système de fichiers en mémoire à la place.)
Comme troisième exemple, imaginer un objet qui fournit une API de cache; un objet qui implémente l'interface correcte mais que, tout simplement effectue pas de mise en cache à tous, mais renvoie toujours un cache miss serait une sorte de faux.
Le but d'un faux, c'est pas pour affecter le comportement du système sous test, mais plutôt à simplifier la mise en œuvre de l'épreuve (en supprimant les ou poids lourd de dépendances).
Talons
Un stub est une application qui se comporte "anormalement". Il est préconfiguré (généralement par le test set-up) pour répondre à des entrées spécifiques, avec des sorties spécifiques.
Le but d'un stub est d'obtenir votre système en cours de test dans un état spécifique. Par exemple, si vous écrivez un test de code qui interagit avec une API REST, vous pourriez talon l'API REST avec une API qui renvoie toujours une réponse toute faite, ou qui répond à une demande d'API avec une erreur spécifique. De cette façon, vous pourriez écrire des tests qui font des affirmations au sujet de la façon dont le système réagit à ces états; par exemple, le test de la réponse de vos utilisateurs si l'API renvoie une erreur 404.
Un stub est généralement mis en œuvre pour répondre uniquement à l'exacte des interactions que vous avez dit il à répondre. Mais l'élément clé qui fait quelque chose d'un stub est son but: un stub est tout au sujet de la configuration de votre cas de test.
Se moque de
Un se moquer de est semblable à un talon, mais avec vérification ajouté. L'objet d'un simulacre est pour faire des assertions sur la façon dont votre système sous test interagi avec la dépendance.
Par exemple, si vous écrivez un test pour un système qui transfère des fichiers sur un site web, vous pourriez construire un se moquer de qui accepte un fichier et que vous pouvez utiliser pour affirmer que le fichier téléchargé est correcte. Ou, à plus petite échelle, il est courant d'utiliser une maquette d'un objet de vérifier que le système sous test, les appels de méthodes spécifiques de la moqué de l'objet.
Se moque de sont liées à interaction tests, qui est une méthodologie de test. Les personnes qui préfèrent tester de l'état du système plutôt que système d'interactions va utiliser se moque avec parcimonie, voire pas du tout.
Test doubles
Des faux, des talons, et se moque de tous appartiennent à la catégorie des test doubles. Un test de double est un objet ou d'un système que vous utilisez dans un test au lieu de quelque chose d'autre. La plupart des logiciel automatisé, test implique l'utilisation d'un test en double d'une sorte ou d'une autre. Certains autres types de test doubles comprennent valeurs factices, espions, et I/O blackholes.
Pour illustrer l'utilisation de talons et se moque, je voudrais également inclure un exemple basé sur Roy Osherove du "L'Art de Tests Unitaires".
L'imaginer, nous avons un LogAnalyzer application qui a pour seule fonction de l'impression de journaux. Il ne doit pas seulement parler à un service web, mais si le service web renvoie une erreur, LogAnalyzer a pour vous connecter l'erreur à une autre dépendance externe, de l'envoyer par e-mail pour le service web de l'administrateur.
Ici est la logique que nous aimerions tester à l'intérieur de LogAnalyzer:
Comment faites-vous tester LogAnalyzer appelle le service de messagerie correctement lorsque le service web renvoie une exception?
Voici les questions auxquelles nous sommes confrontés:
Comment pouvons-nous remplacer le service web?
Comment peut-on simuler une exception dans le service web, de sorte que nous pouvons
test de l'appel pour le service de messagerie?
Comment saurons-nous que le service de messagerie a été appelée correctement ou à
tous?
Nous pouvons traiter avec les deux premières questions par à l'aide d'un tampon pour le service web. Pour résoudre le troisième problème, nous pouvons utiliser un objet fantaisie pour le service de messagerie.
Un faux, c'est un terme générique qui peut être utilisé pour décrire un tampon ou une maquette.Dans notre test, nous allons avoir deux faux. L'un sera le service de messagerie maquette, que nous allons utiliser pour vérifier que les paramètres corrects ont été envoyés pour le service de messagerie. L'autre sera un stub que nous allons utiliser pour simuler une exception levée par le service web. C'est un stub parce que nous ne serons pas en utilisant le service web de faux pour vérifier le résultat du test, seulement assurez-vous que le test fonctionne correctement. Le service de messagerie est un simulacre, car nous allons faire valoir à son encontre qu'il a été appelé correctement.
C'est une question de faire les tests expressive. J'définir les attentes sur une Maquette si je veux le tester pour décrire une relation entre deux objets. Je stub valeurs de retour si je suis la mise en place d'un soutien de l'objet pour obtenir le comportement intéressant dans le test.
Si vous êtes familier avec les Arrange-Loi-Valoir, alors un moyen d'expliquer la différence entre le talon et le simulacre qui pourrait être utile pour vous, c'est que les talons appartiennent à l'arrangement de la section, comme ils le sont pour l'organisation d'état d'entrée, et se moque appartiennent à l'assertion de la section qu'ils le sont pour faire valoir les résultats de la contre.
Les nuls de ne pas faire n'importe quoi. Ils sont juste pour remplir les listes de paramètres, de sorte que vous n'avez pas défini ou null erreurs. Ils existent aussi pour satisfaire le vérificateur de types strictement tapé langues, de sorte que vous pouvez être autorisé à compiler et exécuter.
la chose que vous affirmez,est appelé un se moquer de objet et tout autre chose que juste aidé le test de course, est un stub.
stub et faux sont des objets qu'ils peuvent faire varier leur réponse en fonction des paramètres d'entrée. la principale différence entre eux est que d'un Faux est plus proche du monde réel de la mise en œuvre de la souche. Talons contiennent essentiellement codée en dur réponses à une demande attendue. Voyons un exemple:
Un se moquer de est un faux et des talons. On se moque de fournir les mêmes fonctionnalités que les talons mais sont plus complexes. Ils peuvent avoir des règles définies pour eux qui dictent l'ordre de méthodes sur leur API doit être appelée. Les plus ils peuvent faire le suivi du nombre de fois qu'une méthode est appelée, et peut réagir en fonction de cette information. On se moque généralement connaître le contexte de chaque appel et peut réagir différemment à des situations différentes. De ce fait, se moque nécessitent une certaine connaissance de la classe, elles sont habitées. un stub est généralement impossible de savoir combien de fois une méthode a été appelée ou de l'ordre d'une séquence de méthodes a été appelé. Une maquette ressemble: