2008-09-14 10 views
9

Lorsque vous effectuez des tests d'intégration avec uniquement votre couche d'accès aux données ou la majorité de la pile d'applications. Quel est le meilleur moyen d'éviter que plusieurs tests s'affrontent s'ils sont exécutés sur la même base de données?Tests d'intégration de base de données

Répondre

9

Transactions.

Qu'est-ce que le rubis sur des rails cadre de test unitaire n'est la suivante:

Load all fixture data. 

For each test: 

    BEGIN TRANSACTION 

    # Yield control to user code 

    ROLLBACK TRANSACTION 

End for each 

Cela signifie que

  1. Toute modification de votre test fait à la base de données ne sera pas affecter d'autres sujets alors qu'il est in- progress
  2. Les données du test suivant ne sont pas polluées par des tests antérieurs
  3. Cela représente environ un zillion de fois plus rapide que le rechargement manuel des données pour chaque test.

I pour penser cela est assez cool

9

Pour les applications de base de données simples, je trouve l'utilisation SQLite inestimable. Il vous permet d'avoir une base de données unique et autonome pour chaque test. Toutefois, cela ne fonctionne que si vous utilisez une fonctionnalité SQL générique simple ou si vous pouvez facilement masquer les légères différences entre SQLite et votre système de base de données de production derrière une classe, mais j'ai toujours trouvé cela assez facile dans le SQL. applications que j'ai développées.

0

Je voulais accepter les réponses est à la fois libre gnous et Orion Edwards, mais il ne me laisseraient pas. La raison pour laquelle je voulais faire cela est que j'en arrivais à la conclusion que ce sont les deux principales façons de le faire, mais laquelle choisir dépend du cas individuel (principalement la taille de la base de données).

+1

Je trouve toujours un problème sur stackoverflow. C'est le problème du choix quand vous voulez vraiment dire que les deux sont bons. Je suppose que si les deux sont également utiles, ils seront votés par des numéros similaires, alors restez près du sommet. Laissez les gens décider :) –

0

Également exécuter les tests à des moments différents, de sorte qu'ils n'affectent pas la performance ou la validité de l'autre.

1

Juste pour ajouter à la réponse de Free Wildebeest j'ai également utilisé HSQLDB pour faire un test de type similaire où chaque test obtient une instance propre de la DB.

0

Bien que n'étant pas aussi intelligent que le cadre de test de l'unité Rails dans l'une des autres réponses ici, la création de données distinctes par test ou groupe de tests est une autre façon de le faire. Le niveau d'ennui avec cette solution dépend du nombre de cas de test que vous avez et de leur degré de dépendance l'un par rapport à l'autre. L'ennui sera vrai si vous avez une base de données par test ou un groupe de tests dépendants.

Lors de l'exécution de la suite de tests, vous chargez les données au démarrage, exécutez la suite de tests, déchargez/comparez les résultats en vous assurant que le résultat réel correspond au résultat attendu. Sinon, recommencez le cycle. Charger, exécuter une suite, décharger/comparer.

Questions connexes