42 votes

Tests unitaires sur du code utilisant la base de données

Je suis curieux de savoir quelle approche les gens sont dans le développement de tests unitaires automatisés que l'exercice de la base de données

Ne vous Installez l'assurance qualité de la base de données (sait-point de départ) avant de la suite de test est exécuté.

OU

Voulez-vous construire la base de données de stub qui à chaque fois qu'une base de données d'appel se produit?

EDIT: question Connexe, mais pas un doublon, mais très important pour le sujet: Comment faire des tests unitaires persistance?

32voto

Anthony Points 2537

La base de données "stub" qui s'élève au est généralement considéré comme un "faux référentiel" ou "faux référentiel". Ils sont une bonne idée. Vous pouvez coder à la main (pas dur pour les cas simples) ou de l'utilisation d'un framework comme Rhinocéros se moque de les générer. Vous ne mentionnez pas la langue que vous travaillez. Rhino se moque de est pour .Net .

Si vous utilisez se moquer de dépôts, alors vous pouvez exécuter des tests sur le code qui fonctionne avec des données, sans l'aide d'une base de données pour les données. Cela rend l'exécution des tests très rapide, ce qui est une bonne chose.

Bien sûr, vous avez encore à tester le réel référentiel à un certain stade, et c'est plus un problème. Ces tests s'exécutent plus lentement, car ils utilisent une base de données réelle. Certains classer alors que "les tests d'intégration" pas de tests unitaires en raison de la vitesse et les problèmes de dépendance.

Je n'ai pas l'esprit de ce que vous appelez beaucoup, mais c'est une bonne idée de garder ces tests distincts.

Une bonne idée pour la cohérence des données est de commencer un db transaction avant le test, et de le restaurer par la suite. De cette façon, la base de données de l'état est revenu à ce qu'il était avant le test.

12voto

Mauricio Scheffer Points 70470

Si vous utilisez NHibernate, vous pouvez très facilement tester une base de données SQLite en mémoire , ce qui est très rapide.

3voto

Rolf Points 2966

Nous faisons quelques astuces:

edit: Nous avons séparé les bases de données par l'utilisateur. Notre buildserver a également sa propre base de données. Le coût supplémentaire de disques durs est beaucoup moins que le coût de développeurs influencer eachother de tests.

  1. Notre application peut générer des tableaux et faire des étapes de mise à niveau (aucun séparée db scripts). Ceci permet à notre client, parce qu'il doit déposer dans un fichier WAR et qu'il a fait. L'application recherche dans la base de données et exécute toutes les instructions DDL nécessaires avant de commencer le reste du Ressort du contexte.
  2. Notre suite de test a un bout de code qui décharge le Printemps contexte, les gouttes de la base de données, et redémarre le contexte, avec une propre base de données. Nous pouvons éventuellement désactivez-la si nous aimons
  3. Toutes nos bases de données/SQL unittests sont le Printemps transactionnel des tests d'intégration. Cela signifie qu'une fois le test terminé, les opérations sont annulées, et les autres unittests sera de nouveau look à un nettoyage de la base de données.

En plus de tout cela, nous essayons de faire se moquer de tester autant que possible, parce que unittests sont pas vraiment destinés à être des tests d'intégration. Donc, essayez de séparer votre servicelayer de la couche DAO. Cela vous permet également de trouver les problèmes plus facilement, car vous isolé de tout.

À un certain moment, je crois que vous avez besoin pour accéder à la base de données, car il n'est pas un idéal et universitaire du monde dans lequel nous vivons :-)

2voto

Patrik Hägne Points 7735

Dépend des cas, mais sur les anciens systèmes où j'ai wan pas d'écraser la base de données j'ai souvent introduire une interface, permet de dire IFooDBManager qui possède des méthodes qui retournent des ADO.Net entités, comme les tables de données ou des ensembles de données. Bien sûr, il n'a pas à être une interface, mais il pourrait être une méthode virtuelle par exemple. Ensuite, dans mes tests, j'utilise une petite API avec une interface fluide que j'ai construit moi-même il y a longtemps, je l'utiliser pour la création d'ensembles de données et les tables et les remplir avec des valeurs de test de sorte que je peux retourner à mes faux.

La fluidité de l'interface ressemble à quelque chose comme ceci:

return DataTableBuilder.Create()
    .DefineColumns("a, b")
    .AddRow().SetValue("a", 1).SetValue("b", 2).DoneWithRow()
    .AddRow().SetValue("a", 10).SetValue("b", 20).DoneWithRow()
.Table

Comme je l'ai dit, c'est juste l'une des approches que j'utilise, et c'est principalement pour des systèmes hérités où je ne veux pas d'introduire de nouvelles dépendances sur la base de travaux et de ces. C'est cependant une technique que je n'ai pas vu beaucoup d'autres personnes de l'utiliser alors j'ai pensé qu'il serait utile de mentionner.

EDIT: J'ai oublié de préciser que c'est pour déraciner la base de données, l'interaction avec la base de données n'est pas testé dans ce cas. L'interaction réelle aura lieu à la mise en œuvre concrète de IFooDBManager, pour tester que quelque chose de complètement différent est nécessaire.

Aussi, pas toutes les méthodes de cette interface renvoie des choses bien sûr, il y a aussi des méthodes pour l'écriture à la base de données et ces j'ai l'habitude de test par l'interaction des tests dans RhinoMocks où j'ai mis les attentes sur ces méthodes.

1voto

Ather Points 1249

Nous nous dirigeons vers l'utilisation de cadres fictifs - ils se moquent des ressources comme les bases de données, fichiers de configuration, etc. L'utilisation de ces cadres est un moyen pratique pour l'exécution de vos tests unitaires efficacement.

L'un des cadres que nous travaillons est de Rhinocéros se moque. Vous pouvez lire à ce sujet dans le lien ci-dessous. Il a également une bonne introduction de pourquoi vous avez besoin de tels cadres.

http://weblogs.asp.net/stephenwalther/archive/2008/03/22/tdd-introduction-to-rhino-mocks.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X