Les parties de toute implémentation de référentiel/DAO valant la peine d'être testées sont les requêtes. Pour vous assurer que ces requêtes sont correctes, vous devez l'exécuter dans la base de données réelle . Étant donné les faits ci-dessus, est-il logique d'effectuer des tests unitaires DAO/Respositories? Si oui, quelles sont les meilleures pratiques?Les DAO (aka Repositories) doivent-ils être testés à l'unité?
Répondre
I unité de tester mes dépôts assez religieusement. Ce sont probablement mes tests unitaires les plus importants.
Cela peut effectivement être assez indolore si vous utilisez un ORM tel que NHibernate.
J'utilise un appareil de base qui contient la configuration et le démontage pour créer un db sqlite en mémoire, puis le détruire à la fin de chaque test. C'est étonnamment rapide. Ensuite, pour chaque référentiel, j'ai une configuration qui injecte mes données de test pour mes tests. Ceci est très autonome et attrape tous les problèmes de logique dans mes requêtes de dépôt. La seule chose qu'il n'attrape pas, ce sont les cas spécifiques au fournisseur db, mais en utilisant quelque chose comme NHibernate, ils sont généralement l'exception.
Pour les cas particuliers où vous testez des requêtes spécifiques à une base de données, vous devrez peut-être avoir une suite de tests utilisant une méthodologie d'installation et de démontage différente. Malheureusement, ces tests seraient plus lents et probablement plus fragiles que vos autres tests unitaires (c'est pourquoi ils devraient être regroupés). Si les éditions "express" du logiciel de base de données que vous testez sont disponibles, je recommande toujours que la base de données soit configurée localement afin que vous vous assuriez toujours que la base de données sur laquelle vos tests s'exécutent respecte le schéma. Je voudrais changer une partie de la configuration et des démontages de cela. Je voudrais seulement configurer et démonter la base de données au début et à la fin de la série entière de tests. Ensuite, chaque configuration et démontage des tests devrait démarrer une transaction, puis la renvoyer à la fin. C'est un moyen rapide de garder les choses compartimentées entre les tests. La dernière chose que vous voulez, c'est que les données d'un test affectent un autre test.
Oui - avec une base de données (par exemple HSQLDBL)
This blogpost of mine en mémoire traite un sujet similaire.
Mise à jour: à propos de votre commentaire - dans le post J'ai lié un ORM est utilisé pour s'assurer que les incohérences de base de données ne sont pas un problème. Travailler avec SQL brut n'est pas une bonne idée en premier lieu (si vous travaillez avec OOP). Ensuite, vous pouvez toujours essayer d'utiliser SQL ANSI autant que possible (et ne pas tester les incohérences).
Une autre option pourrait être de dédier un serveur de base de données de test + un moteur d'intégration continue, et exécuter les tests que dans le moteur (de sorte que plusieurs exécutions de test de plusieurs machines ne salissent pas avec l'autre)
Étant donné que la plupart des serveurs SGBDR diffèrent les uns des autres dans la gestion de SQL, comment pouvons-nous être sûrs qu'il fonctionnera sur notre serveur de production simplement parce qu'il fonctionne sur la base de données en mémoire et vice versa? –
si vous voulez vous assurer que tout fonctionne, alors vous devez également faire un test d'intégration –
A voté pour une réponse utile.Cependant, l'utilisation d'ANSI SQL seul n'est pas une option. :( –
Il est indispensable de faire des tests unitaires pour la couche DAO. En Java, il existe des cadres comme dbUnit vous aide à le faire. Garder un schéma/une instance séparé dans la base de données avec des données bootstrap vous aidera à faire les bons tests unitaires et vous pourrez couvrir la plupart des scénarios.
J'utilise Hibernate (Java) mais mon application utilise un tas de SQL natifs pour utiliser quelques instructions spécifiques à Oracle qui ne sont pas disponibles sur d'autres serveurs –
J'ai ajouté quelques informations sur ce que j'ai fait dans le passé quand j'avais besoin de J'utilise un SG spécifique et pas seulement un test en mémoire, je préfère ne pas avoir à le faire parce que c'est plus de travail, mais cela peut encore être fait relativement sans douleur. – mockobject