Comme mentionné dans la réponse la plus votée, Martin Fowler discute de ces distinctions dans les moqueries ne sont pas des talons , et en particulier le sous-titre The Difference Between Mocks and Stubs , alors assurez-vous de lire cet article.
Plutôt que de se concentrer sur la façon dont ces choses sont différentes, je pense qu'il est plus instructif de se concentrer sur la raison pour laquelle il s'agit de concepts distincts. Chacun existe dans un but différent.
Faux
Un faux est une implémentation qui se comporte "naturellement", mais n'est pas "réelle". Ce sont des concepts flous et donc différentes personnes ont des compréhensions différentes de ce qui rend les choses fausses.
Un exemple de faux est une base de données en mémoire (par exemple en utilisant sqlite avec le :memory:
magasin). Vous ne l'utiliseriez jamais pour la production (car les données ne sont pas persistantes), mais c'est parfaitement adéquat comme base de données à utiliser dans un environnement de test. Il est également beaucoup plus léger qu'une "vraie" base de données.
Comme autre exemple, vous utilisez peut-être une sorte de magasin d'objets (par exemple Amazon S3) en production, mais dans un test, vous pouvez simplement enregistrer des objets dans des fichiers sur le disque; alors votre implémentation "enregistrer sur disque" serait un faux. (Ou vous pouvez même simuler l'opération "enregistrer sur le disque" en utilisant un système de fichiers en mémoire à la place.)
Comme troisième exemple, imaginez un objet qui fournit une API de cache; un objet qui implémente la bonne interface mais qui n'effectue simplement pas de mise en cache mais renvoie toujours un échec de cache serait une sorte de faux.
Le but d'un faux n'est pas d'affecter le comportement du système testé , mais plutôt de simplifier l'implémentation du test (en supprimant les dépendances inutiles ou lourdes).
Bouts
UNE stub est une implémentation qui se comporte "de façon anormale". Il est préconfiguré (généralement par la configuration de test) pour répondre à des entrées spécifiques avec des sorties spécifiques.
Le but d'un stub est de faire tester votre système dans un état spécifique. Par exemple, si vous écrivez un test pour du code qui interagit avec une API REST, vous pouvez supprimer l'API REST avec une API qui renvoie toujours une réponse prédéfinie 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 sur la façon dont le système réagit à ces états; par exemple, tester la réponse de vos utilisateurs si l'API renvoie une erreur 404.
Un stub est généralement implémenté pour ne répondre qu'aux interactions exactes auxquelles vous lui avez demandé de répondre. Mais la caractéristique clé qui fait de quelque chose un talon est son objectif : un stub consiste à configurer votre cas de test.
Se moquer
Une maquette est similaire à un stub, mais avec une vérification ajoutée. Le but d'une maquette est de faire des affirmations sur la façon dont votre système testé interagit avec la dépendance .
Par exemple, si vous écrivez un test pour un système qui télécharge des fichiers sur un site Web, vous pouvez créer une maquette qui accepte un fichier et que vous pouvez utiliser pour affirmer que le fichier téléchargé était correct. Ou, à plus petite échelle, il est courant d'utiliser une maquette d'un objet pour vérifier que le système testé appelle des méthodes spécifiques de l'objet simulé.
Les simulations sont liées aux tests d'interaction , qui est une méthodologie de test spécifique. Les personnes qui préfèrent tester l' état du système plutôt que les interactions système utiliseront les simulations avec modération, voire pas du tout.
Double test
Les contrefaçons, les talons et les simulacres appartiennent tous à la catégorie des doubles de test . Un double de test est tout objet ou système que vous utilisez dans un test au lieu de quelque chose d'autre. La plupart des tests de logiciels automatisés impliquent l'utilisation de tests doubles d'une sorte ou d'une autre. D'autres types de doubles de test comprennent des valeurs fictives , des espions , et E / S blackholes .