2009-04-20 9 views
9

Est-ce que quelqu'un a des suggestions pour une meilleure pratique ou un moyen privilégié pour annuler les transactions de base de données effectuées à partir d'un framework de test d'intégration tel que Selenium?Tests de la base de données après intégration (Selenium)

Voici notre situation actuelle: Nous avons un projet web .net avec un certain nombre de tests unitaires qui fonctionnent bien dans notre environnement de test unitaire - chaque test hérite d'une classe parente qui ouvre une transaction dans [SetUp], et lance sauvegarder la transaction dans [TearDown]. Après chaque test, notre base de données de tests unitaires est restaurée à l'état d'origine. Cependant, les choses changent une fois que nous arrivons à notre environnement d'intégration. Notre serveur d'intégration continue compile automatiquement nos validations et les envoie à un serveur de test, afin que le serveur fonctionne toujours avec le code le plus à jour. Nous avons également configuré une instance Selenium pour automatiser l'interaction de l'utilisateur avec le site. Les tests de sélénium communiquent essentiellement avec un serveur Selenium existant, et disent au serveur des choses comme, "Lancer un navigateur et aller à http://testsite/TestPage.aspx - entrer le texte 'abc' dans le champ de formulaire avec l'ID 'def' - assert nouvelle page contient le texte 'xyz'" Chaque test est exécuté d'une manière similaire à nos tests unitaires de vanille, mais avec une exception importante: toutes les modifications apportées par Selenium sont faites dans un fil/application complètement différent, et donc nous ne pouvons pas (je * pense que nous ne peut pas, au moins) les renvoyer dans le démontage d'essai.

Nous n'avons pas encore trouvé une bonne solution pour cela. En ce moment, nous utilisons un SqlCommand pour exécuter une instruction sql afin de sauvegarder la base de données, puis à la fin du test, nous définissons la base de données sur un utilisateur unique, supprimant la base de données actuelle et restaurant l'ancienne copie - c'est loin d'être idéal, car cela tue efficacement l'application qui était attachée à la base de données et nous oblige à ré-initialiser l'application.

Est-ce un problème qui a déjà été résolu? Tout conseil serait génial.

Merci!

Répondre

3

Nous exécutons un script drop/create-table avant chaque test. C'est assez rapide et garantit qu'il ne reste rien des tests précédents. PS: Nous utilisons NHibernate, qui crée ce script à la volée et exécute le test sur Sqlite en mémoire, c'est lightpeed. Mais si nous passons à SqlServer, c'est encore assez rapide.

+0

Merci Stefan, Cela semble être la meilleure solution - nous avons eu recours à juste troncature tables et rechargeons les appareils après chaque test, ce qui n'est pas vraiment * taxant », et il semble que ça fonctionne bien. Merci encore! – matt

+1

Tronquer sur oracle est assez rapide, car vous ne pouvez pas annuler cette opération. Les scripts sont faciles dans notre situation, les scripts sont déjà disponibles, nous n'avons pas besoin de maintenir autre chose. –

+0

Ce script est-il exécuté avant chaque méthode de test ou scénario de test? Je suppose que chaque méthode de test .... Aussi comment ce script est-il exécuté? Avez-vous une API de service dans le backend? – HDave

3

C'est un problème difficile et la solution est généralement unique pour chaque application. Jusqu'à ce que les grands cadres adoptent une «approche recommandée», cela continuera d'être une douleur.

Ma meilleure recommandation: prévoyez cette utilisation au début de votre application. Inclure les API qui nettoient après la réinitialisation de la base de données sous l'application (c.-à-d. Réinitialiser les caches).

Questions connexes