Pourquoi écrivons-nous des objets fictifs lors de l'écriture de cas de tests unitaires?

11

Nous écrivons actuellement des cas de tests unitaires dans notre projet. Les implémentations des méthodes de base de données existent et fonctionnent correctement. Dans ce cas, pourquoi devons-nous écrire des objets fictifs? Y a-t-il une raison précise? Pourquoi ne puis-je pas tester directement l'implémentation DAO?

Vinoth Kumar CM
la source

Réponses:

6

Vous ne devriez pas vous moquer des appels à la base de données, car cela irait à l'encontre du but. Par exemple, vous DEVRIEZ vous moquer des appels à votre DAO à partir, par exemple, d'une couche de service. La moquerie vous permet de tester les méthodes isolément.

Supposons que vous ayez une simulation de restaurant avec une architecture comme celle-ci:

Cook <=> Server <=> Customer

Vous souhaitez tester chaque couche indépendamment. Voici la Servercouche de service et Cookpeut être considérée comme un DAO. C'est Serverce que vous voulez vous moquer pendant le test Customer, et Cookc'est ce que vous voulez vous moquer pendant le test du Server. Les Cooktests unitaires devraient cependant vérifier que la mise en œuvre renvoie un hamburger lors de la commande d'un hamburger et non d'un pneu en caoutchouc.

Tyler Treat
la source
3
Je ne suis pas d'accord avec la déclaration Vous ne devriez pas vous moquer des appels à la base de données car cela irait à l'encontre du but. car cela semble trop générique. Comme d'autres le disent ci-dessous, vous devez tout tester séparément. Si la chose que vous testez est l'accès à la base de données, bien sûr, votre commentaire est correct. Si la chose que vous testez n'est pas un accès à la base de données, votre première phrase est incorrecte. Je suis d'accord avec tout ce que vous dites. +0. :-)
Peter K.
6

Il est parfaitement acceptable de tester businesslogic avec la base de données. mais ces tests sont appelés tests d'intégration même si vous utilisez nunit ou junit ou phpunit pour les exécuter.

Les tests non testés sont des tests spécialisés où les tests isolés (c.-à-d. La logique commerciale sans la base de données) sont importants. Des simulacres / faux / stups sont utilisés pour imposer cet isolement.

k3b
la source
2

Tout simplement: pour tester le DAO réel et non le contenu de la base de données.

Supposons que votre classe DAO Person possède une méthode getByName (). Vous écrivez un test et appelez Person.getByName ("John Smith"). Supposons que le test échoue, car quelqu'un a supprimé l'enregistrement de John de la base de données. Maintenant, chaque logiciel CI et vos superviseurs / réviseurs peuvent prétendre que votre logiciel est défectueux, alors qu'en réalité ce n'est pas le cas. Si vous vous moquez de la base de données, vous pouvez prouver que votre DAO fonctionne s'il reçoit la ligne correcte de la bonne table.

Si vous voulez vraiment tester la base de données elle-même, c'est-à-dire: si l'exécution de certaines méthodes DAO met les données dans un certain état, alors c'est également possible. De plus, il est vraiment utile avec des modèles de données farfelus (EAV, ensemble d'arbres imbriqués) où vous ne pouvez pas vous attendre à ce que la base de données fournisse une intégrité pare-balles. Jetez un œil à DBUnit pour vous faciliter la vie.

Jacek Prucia
la source
1

Une autre raison est d'éviter le temps d'exécution de l'exécution effective des commandes de la base de données. Cela peut ne pas sembler beaucoup, mais la surcharge de configuration et de suppression des connexions finira par s'additionner et augmentera probablement considérablement le temps global d'exécution de la suite de tests par rapport à l'utilisation d'objets fictifs.

Jeremy
la source
0

Pour isoler la classe que vous testez. Ou bien si le test échoue, comment savez-vous que le problème se situe dans la classe que vous testez ou dans l'une de ses dépendances.

Craig
la source
Appelez-vous et testez-vous directement des méthodes dans l'implémentation DAO?
Vinoth Kumar CM