Question

J'ai un problème étrange. J'ai un test d'unité qui continue à rester bloqué en mode de course. Lorsque j'exécute le même test de débogage, sans points d'arrêt, le test passe à chaque fois.

Fondamentalement, il s'agit d'un test de connexion de socket. Je débranchai d'abord une prise, puis essayez de vous reconnecter et j'essaie de vérifier si la reconnexion a réussi.

Quelque part dans le code de connexion, je vérifie s'il y avait une exception de socket. Lorsque cela se produit, l'utilisateur est présenté avec quelques choix dans une boîte de dialogue, tandis que le code de connexion est suspendu via un aditurisme, en attente d'une décision.

C'est ce changement automobile qui pend le système. Il doit être fourni par le code dans le test de l'unité. Mais ma question est, comment se fait-il que cela passe en mode de débogage? Y a-t-il quelque chose de spécial sur le mode de débogage dans lequel les adefèsestevents sont automatiquement définis par Visual Studio?

Modifier

C'était en effet une condition de race. J'ai ajouté un retard dans le code après mon code de déconnexion et cela fonctionne maintenant. Mais cela me frappe toujours comme étrange qu'il y ait une condition de course pour commencer. Laissez-moi élaborer en collant une partie du code.

Ceci est le code de test:

MySystem.FindEquipment(new List<string>(1) { "192.1.1.243:28000" });
MySystem.ConstructSystem();
MySystem.IsConstructedFlag.WaitOne();
Assert.AreEqual(1, MySystem.CommunicationController.HardwareIPList.Count);

PFFrame frame1 = MySystem.Frames["0.x.x"];

Assert.IsTrue(frame1.Disconnect());
Thread.Sleep(100);
Assert.IsTrue(frame1.Connect());

La raison pour laquelle cela me frappe, c'est que j'attends un retour sur le code Diconnect avant d'appeler le code de connexion. La dernière partie du code de déconnexion ressemble à ceci:

lclSocket.Shutdown(SocketShutdown.Both);
lclSocket.Close();
OnSocketDisconnected(new PFSocketConnectionEventArgs(ipEp));
return true;

est-ce parce que socket.shutdown () et / ou socket.close () les méthodes exécutent des threads? Ainsi, même si je retourne une valeur de mon code de déconnexion, le socket n'est pas vraiment déconnecté?

Était-ce utile?

La solution

Cela ressemble à une condition de course.Le code de débogage gère généralement beaucoup de choses supplémentaires «sous la hotte», et cette différence de synchronisation lance probablement vos tests.

Bien sûr sans voir du code, nous ne pouvons vraiment pas vous aider beaucoup.

Autres conseils

Très probablement à cause d'une course de filetage.Ils sont très sensibles à la synchronisation et le moment de la construction de débogage sera différent.Vous pouvez utiliser un outil comme des échecs pour exercer des bugs comme ça.

mais utilisez des outils + Joindre au processus en premier.Débogou + casser tout, débogage + filetage Windows + et regardez les piles d'appel de fil.Vous pourrez peut-être voir la cause de la race ou de l'impasse.

eu un problème similaire une fois où j'ai comparé deux dates et attendait une date après l'autre, mais parce que cela a été exécuté si vite, ils ont reçu le même horodatage.

Ce test vous indique que votre code n'est pas correctement isolé de la bibliothèque de socket que vous utilisez.Le code que vous testez ne doit pas nécessairement dépendre de certains artefacts avec cette bibliothèque.Vous devez ajouter une abstraction entre la bibliothèque de socket qui prend les artefacts dans Acôte.

La raison pour laquelle je dis que c'est, c'est si la prise déconnecte réellement 123.251 fois <100 ms à 100 ms, mais le déconnexion de 123,252nd délibérant prend 101 ms.

Je recommande vivement que presque tous votre code de test de l'unité n'utilisent pas de filetage.Je regarde les appels enfilés de tout type dans mes tests d'unité comme odeur de code.Habituellement, où je veux voir les problèmes de filetage est au niveau de l'intégration.

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