2010-09-02 7 views
1

J'essaie d'écrire des scénarios de test pour mes services Web de manière à annuler les modifications de base de données qu'ils peuvent effectuer. Je peux essayer de les entourer d'une portée de transaction, mais comment puis-je spécifier un contexte pour la transaction? En d'autres termes, comment la transaction sait-elle quelle base de données et serveur restaurer? Dans mon cas, le serveur SQL s'exécute localement ainsi que les services Web. Avant de me dire d'appeler les services Web directement sans client, veuillez comprendre que les services Web ont des paramètres d'environnement d'exécution très spécifiques qui seraient une douleur royale à reproduire pour mes cas de test. Peut-être, la portée de la transaction n'est pas ce que je veux utiliser, existe-t-il une alternative? Y a-t-il une fonction de base de données que je pourrais appeler pour démarrer une transaction? Merci.Test unitaire, services Web et transactions de base de données

Répondre

2

D'abord, vous ne faites pas de test unitaire. Le test unitaire consiste à tester une petite unité de code (fonction). Lorsque vous testez une fonction, vous créez un test unitaire pour chaque chemin d'exécution afin d'avoir une couverture complète du code testé. Mais votre système sous test inclut la communication client à service et le service à la communication de base de données = plusieurs niveaux de code + configuration. C'est ce qu'on appelle les tests d'intégration.

Le problème ici est comment avez-vous conçu votre service? Est-ce que votre service achemine les transactions? Le flux de transaction permet de démarrer la transaction chez votre client et de la transmettre au service (transaction distribuée). Ce comportement n'est pas celui par défaut et nécessite une configuration spéciale des liaisons WCF. Si vous utilisez cette approche, vous pouvez faire la même chose dans votre test. Commencez la transaction au test et annulez la transaction à la fin du test. Si vous n'avez pas conçu de transaction de service à flux, vous ne pouvez pas l'utiliser car votre transaction commencée dans le test n'affectera pas le service. Dans ce cas, vous avez plusieurs choix:

  • Créer une compensation manuelle. À la fin de chaque test, exécutez SQL personnalisé pour déplacer les données à l'état initial. Cela simule le retour en arrière. Je ne recommande pas cette approche. Recréer la base de données au début de chaque test.
  • C'est lent mais tout à fait acceptable parce que les tests d'intégration sont généralement exécutés seulement sur le serveur de construction quelques fois par jour.
  • Ne pas tester le niveau de service WCF. Le service WCF ne devrait être qu'un encapsuleur au sommet de la logique métier ou de la logique d'accès aux données. Donc, ne pas tester le niveau de service, mais plutôt tester le calque enveloppé. Vous pouvez probablement utiliser des transactions là-bas. Cette approche peut être bien combinée avec la précédente afin que vous ayez un petit ensemble de tests d'intégration complexes qui requièrent une recréation de base de données et un plus grand ensemble de tests qui peuvent faire une restauration et utiliser la même base de données.
+0

Merci. Le vrai problème ici est que je ne contrôle pas le contexte dans lequel opère la couche métier. Il appelle une DAL tierce qui doit être exécutée sous ASP.NET et vérifie également les informations de licence. Je ne peux pas divorcer les deux. Le test devrait fonctionner sous IIS pour fonctionner. –

+0

La deuxième approche est probablement la meilleure pour vous. –

+0

La réponse ci-dessus est correcte, mais j'ajouterais que l'on devrait utiliser Mocks pour activer les tests unitaires, de cette façon vous pouvez construire une suite de tests unitaires et d'intégration facilement à partir du même code – MetalLemon

Questions connexes