Frage

Ich habe ein seltsames Problem. Ich habe einen Einheitstest, der im Run-Modus stecken bleibt. Wenn ich den gleichen Test in Debugge ausführen kann, ohne Haltepunkte, passiert der Test jedes Mal.

Grundsätzlich ist es ein Socket-Verbindungstest. Ich trennen Sie zunächst eine Sockel und versuchen Sie dann wieder herzustellen, und ich versuche, zu überprüfen, ob die Wiederverbindung erfolgreich war.

Irgendwo im Connect-Code, prüfe ich, ob es eine Sockelausnahme gab. Wenn dies geschieht, wird der Benutzer in einem Dialogfeld mit einigen Optionen angezeigt, während der Anschlusscode über ein AutoresTevent hängt und auf eine Entscheidung wartet.

Es ist dieses Autoresekt, das das System hängt. Es muss per Code im Gerätestest bereitgestellt werden. Aber meine Frage ist, wie kommt dies in den Debug-Modus? Gibt es etwas Besonderes über den Debug-Modus, bei dem AutoresDevents automatisch von Visual Studio eingestellt werden?

edit

Es war in der Tat ein Rennzustand. Ich habe nach meinem Trennencode eine Verzögerung in den Code hinzugefügt, und es funktioniert jetzt. Aber es trifft mich immer noch als seltsam, dass es einen Rennzustand zu beginnen. Lassen Sie mich ausarbeiten, indem Sie einen Teil des Codes anpassen.

Dies ist der Testcode:

generasacodicetagpre.

Der Grund, warum das mir schlägt, ist, dass ich auf eine Rendite des DIConnect-Codes warte, bevor Sie den Connect Code anrufen. Der letzte Teil des Trennencodes sieht so aus:

generasacodicetagpre.

ist es, weil socket.shutdown () und / oder socket.close () -Methoden die IT-Threads ausführen? Obwohl ich einen Wert von meinem Trennencode zurücksende, ist der Sockel nicht wirklich nicht wirklich getrennt?

War es hilfreich?

Lösung

es klingt nach einem Rennzustand.Der Debug-Code läuft in der Regel viel zusätzliches Zeug "unter der Haube", und dieser Unterschied beim Timing wirft wahrscheinlich Ihre Tests ab.

Natürlich ohne Code, können wir Ihnen wirklich nicht helfen.

Andere Tipps

höchstwahrscheinlich wegen eines Einfädelungsrennens.Sie sind sehr empfindlich für den Timing und der Timing im Debug-Build ist anders.Sie können ein Tool wie Schach verwenden, um solche Fehler auszuüben.

Verwenden Sie jedoch Werkzeuge +, um zuerst zu verarbeiten.Debug + brechen alle, Debug + Windows + Threads und Blick auf die Thread-Anrufstapel.Möglicherweise können Sie die Ursache des Rennens oder des Deadlocks sehen.

hatte ein ähnliches Problem, in dem ich zwei Termine vergliche habe, und erwartete ein Datum nach dem anderen, aber weil es so schnell ausgeführt wurde, erhielten sie den gleichen Zeitstempel.

Dieser Test sagt Ihnen, dass Ihr Code nicht ordnungsgemäß aus der von Ihnen verwendeten Socket-Bibliothek isoliert ist.Der Code, den Sie testen, sollten sich nicht auf bestimmte Artefakte mit-in dieser Bibliothek abhängen müssen.Sie müssen eine Abstraktion zwischen der Sockelbibliothek hinzufügen, die die Artefakte in Acoount ergibt.

Der Grund, warum ich das heißt, ist das, was die Sockel tatsächlich 123.251-fache <100 ms trennen, aber die 123.252-tülle treibende Trottel dauert 101 ms.

Ich würde wärmstens empfehlen, dass fast alle Ihr Gerätetestcode nicht ein Threading verwenden.Ich schaue an, Anrufe von irgendeinem Typ in meine Einheitstests als Code-Geruch einzustellen.In der Regel, wo ich das Einfädeln von Problemen auf der Integrationsebene sehen möchte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top