Question

De nombreuses personnes utilisent des objets simulés lorsqu'elles écrivent des tests unitaires.Qu'est-ce qu'un Objet simulé?Pourquoi en aurais-je besoin ?Ai-je besoin d’un framework d’objets simulés ?

Était-ce utile?

La solution

Object Mocking est utilisé pour garder les dépendances hors de votre test unitaire.Parfois, vous aurez un test comme "SelectPerson" qui sélectionnera une personne dans la base de données et renverra un objet Person.

Pour ce faire, vous auriez normalement besoin d'une dépendance sur la base de données, mais avec la simulation d'objet, vous pouvez simuler l'interaction avec la base de données avec un framework simulé, de sorte qu'il puisse renvoyer un ensemble de données qui ressemble à celui renvoyé par la base de données et vous pouvez ensuite tester votre code pour vous assurer qu'il gère la traduction d'un ensemble de données en un objet personne, plutôt que de l'utiliser pour tester l'existence d'une connexion à la base de données.

Autres conseils

Plusieurs personnes ont déjà répondu à la question « quoi », mais voici quelques « pourquoi » rapides auxquels je peux penser :

  1. Performance

    Étant donné que les tests unitaires doivent être rapides, tester un composant qui interagit avec un réseau, une base de données ou une autre ressource à forte intensité temporelle n'a pas besoin de payer la pénalité si cela est fait à l'aide d'objets simulés.Les économies s’accumulent rapidement.

  2. Collaboration

    Si vous écrivez un morceau de code bien encapsulé qui doit interagir avec le code de quelqu'un d'autre (qui n'a pas encore été écrit, ou est développé en parallèle - un scénario commun), vous pouvez exercer votre code avec des objets simulés une fois L'interface a été convenue.Sinon, votre code ne peut pas commencer à être testé avant la fin de l'autre composant.

Un objet fictif vous permet de tester exactement ce que vous écrivez et d'abstraire des détails tels que l'accès à une ressource (disque, service réseau, etc.).La simulation vous permet ensuite de prétendre être cette ressource externe, cette classe ou autre.

Vous n'avez pas vraiment besoin d'un framework d'objets fictifs, étendez simplement la classe des fonctionnalités dont vous ne voulez pas vous soucier dans votre test et assurez-vous que la classe que vous testez peut utiliser votre simulation au lieu de la réalité (transmettez-la dans via un constructeur ou un setter ou quelque chose comme ça.

La pratique montrera quand les simulations sont utiles et quand elles ne le sont pas.

MODIFIER:La simulation des ressources est particulièrement importante afin que vous n'ayez pas besoin de compter sur elles pour exister pendant le test, et vous pouvez vous moquer des détails de leur existence et de ce à quoi elles répondent (comme la simulation d'une FileNotFoundException, ou d'un service Web manquant, ou diverses valeurs de retour possibles d'un webservice)...le tout sans les temps d'accès lents impliqués (la moquerie s'avérera BEAUCOUP plus rapide que l'accès à de telles ressources dans le test).

Ai-je besoin d’un framework d’objets simulés ?

Certainement pas.Parfois, écrire des simulations à la main peut être assez fastidieux.Mais pour des choses simples, ce n'est pas mal du tout.En appliquant le principe de Dernier moment responsable aux frameworks moqueurs, vous ne devriez passer des simulations écrites à la main à un framework que lorsque vous vous êtes prouvé que l'écriture manuscrite des simulations pose plus de problèmes qu'elle n'en vaut la peine.

Si vous commencez tout juste à vous moquer, sauter directement dans un cadre va au moins doubler votre courbe d'apprentissage (pouvez-vous doubler une courbe ?).Les frameworks moqueurs feront beaucoup plus de sens lorsque vous avez passé quelques projets à écrire des maquettes à la main.

Object Mocking est un moyen de créer un objet « virtuel » ou simulé à partir d’une interface, d’une classe abstraite ou d’une classe avec des méthodes virtuelles.Il vous permet en quelque sorte d'encapsuler l'un d'entre eux dans votre propre définition à des fins de test.Il est utile pour créer un objet sur lequel s'appuie un certain bloc de code que vous testez.

Un populaire que j'aime utiliser s'appelle Moq, mais il y en a bien d'autres comme RhinoMock et de nombreux autres que je ne connais pas.

Il vous permet de tester la façon dont une partie de votre projet interagit avec le reste, sans construire l'intégralité du projet et sans potentiellement manquer une partie vitale.

MODIFIER:Excellent exemple tiré de Wikipédia :Il vous permet de tester le code au préalable, comme un concepteur automobile utilise un mannequin de crash test pour tester le comportement d'une voiture lors d'un accident.

Une autre utilisation est qu'il vous permettra de tester d'autres parties de votre système qui ne sont pas encore construites.Par exemple, si votre classe dépend d'une autre classe qui fait partie d'une fonctionnalité sur laquelle quelqu'un d'autre travaille, vous pouvez simplement demander une interface presque complète, programmer l'interface et simplement vous moquer des détails pendant que vous vous attendez à ce qu'ils fonctionnent.Ensuite, assurez-vous que vos hypothèses sur l'interface étaient correctes (soit pendant le développement, soit une fois la fonctionnalité terminée).

L'utilité ou non d'un framework moqueur dépend en partie du langage du code que vous écrivez.Avec un langage statique, vous devez déployer des efforts supplémentaires pour inciter le compilateur à accepter vos objets fictifs en remplacement des objets réels.Dans un langage typé dynamiquement tel que Python, Ruby ou Javascript, vous pouvez généralement simplement attacher les méthodes à un objet ou une classe arbitraire et les transmettre en tant que paramètre. Un framework ajouterait donc beaucoup moins de valeur.

Les deux frameworks moqueurs recommandés pour les tests unitaires .net sont Typemock Isolator et Rhino Mock.

Dans le lien suivant, vous pouvez voir une explication de Typemock expliquant pourquoi vous avez besoin d'un cadre moqueur pour les tests unitaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top