Question

Dans cet asp.net, je nettoie, il est possible que des blocages se produisent. Je veux m'assurer que le code les traite correctement, alors j'essaie d'écrire des tests NUnit qui déclenchent un blocage .....

Le DAO est divisé par entité. Chaque entité dispose d'un ensemble de tests qui sont entourés par les méthodes Startup () et Teardown (), qui créent un transactioncope, puis l'annulent une fois les tests terminés. Cela fonctionne très bien pour tout le reste, mais est totalement inutile pour les impasses.

Comment puis-je configurer et exécuter un " impasse " test utilisant TransactionScope et SQL2000 (c’est-à-dire que MSDTC est impliqué) qui peut être reproduit de manière fiable? Plus de détails: je sais qu’il peut arriver que, si deux utilisateurs appellent deux fonctions avec des valeurs de données différentes, spécifiques, un résultat de blocage peut . Comment puis-je simuler ceci dans NUNIT - et faire en sorte que l'impasse soit toujours ?

Et oui, j’ai commencé par "Pourquoi ne pas empêcher les blocages d’arriver en premier lieu"? plan d’action, mais je n’ai aucun contrôle sur le code dans lequel les blocages peuvent se produire - j’appelle simplement les fonctions et elles peuvent se bloquer.

Était-ce utile?

La solution

Si votre interblocage entraîne la levée d'une exception, vous souhaitez utiliser un objet fantaisie pour émuler cette exception.

L'idée de base est de dire à votre infrastructure Mock Object (j'aime bien que TypeMock ) lève une exception. à la place, quelque chose comme ceci:

MockObject mo = MockManager.MockObject(typeof(MyDeadlockException));
mock.ExpectAndThrow("MyMethod", (MyDeadlockException)mo.Object); 

L’idée est fondamentalement la même pour les autres frameworks moqueurs.

Autres conseils

La plupart de ces solutions impliquent plusieurs threads. En voici un qui ne fonctionne pas.

Fermez ces échappatoires - reproduisez les erreurs de base de données

.

L'auteur est Alex Kuznetsov.

Que se passe-t-il si l'un de vos tests au milieu de votre transaction fait simplement un "attendre"? pour comme 5 minutes? Ou alors, vous écrivez simplement un test qui démarre une transaction, crée un nouvel enregistrement, puis met à jour cet enregistrement sans validation. Ensuite, démarrez une nouvelle transaction et essayez de lire l’enregistrement créé et en cours de mise à jour. Vous obtiendrez une impasse là-bas.

Que faire si vous avez verrouillé manuellement une table et que vous l'avez TOUJOURS laissée verrouillée? Ensuite, toute action de votre part contre cette table créerait une impasse?

Venir à cet aveugle, mais est-il possible dans votre méthode TestSetup de créer une connexion SQLConnection à votre base de données? Ensuite, en utilisant cela, vous pouvez simplement lancer une commande pour verrouiller la table ou prendre des mesures pour verrouiller un enregistrement ou une page? De cette façon, ce serait en dehors de toute autre transaction que vous avez en cours? Il semble que ce soit une option que vous avez déjà envisagée. Qu'est-ce qui me manque dans votre situation?

Pour les tests unitaires, vous voudrez probablement éviter d'utiliser une base de données. Comment savez-vous que vous avez une impasse. Vous devriez tester la condition qui vous indique qu'il y a une impasse et la créer dans votre test.

Un simulacre est un moyen idéal de reproduire cela si vous appelez un service et qu'il renvoie une erreur. Demandez simplement à la maquette de renvoyer l'erreur que vous attendez. Si vous attendez un délai d'attente ou quelque chose de ce genre, la même chose s'applique.

En général, un test unitaire ne doit s’exécuter que sur le code testé et ne pas reposer sur d’autres codes ou composants. Cela dit, les bases de données sont essentiellement un autre composant et vous effectuez probablement une sorte de test fonctionnel en utilisant nunit pour les gérer.

Dans ce cas, vous devez réellement créer une situation de blocage en verrouillant un enregistrement ou une table, puis en appelant un composant qui tente d'utiliser le même enregistrement et en traitant la réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top