Frage

Alle Vorschläge, wie wiederholbar Unit-Tests für Code zu schreiben, zu Deadlocks und Race Conditions empfindlich sein können?

Im Moment bin ich stützte sich Unit-Tests auf das Überspringen und die Konzentration auf Stresstests. Das Problem dabei ist, können Sie einen Belastungstest 5-mal laufen und fünf verschiedene Ergebnisse sehen.

EDIT: Ich weiß, es ist wahrscheinlich nur ein Traum, aber wenn es eine Möglichkeit, einzelne Fäden zu steuern und bewirken, dass sie eine Anweisung zu einem Zeitpunkt auszuführen, dann könnte ich irgendwo bekommen

.
War es hilfreich?

Lösung

Hier finden Sie aktuelle TypeMock Racer (es ist in Beta)

Bearbeiten: eigentlich Alpha

http://www.typemock.com/Typemock_software_development_tools.html

Andere Tipps

Es ist in der Regel möglich zu zwingen vorgesehen Renn Conditions und Deadlocks durch Dinge wie Manual mit jedem Thread in den erwarteten Zustand zu erhalten, bevor es die Freigabe - dh Thread A erhalten die Sperre haben und warten, ein Signal ... Thread B erhalten, das Schloss zu beantragen, etc ...

Allerdings - Sie könnten der Regel schreiben einen solchen Test einen Verdacht auf Fehler zu untersuchen, um zu beweisen, wenn es festgelegt ist und dass es nicht-Oberfläche wieder. Sie würden Rennbedingungen im Allgemeinen entwerfen um (aber prüfen, wie man am besten als pragmatisch ist).

Das glaube ich nicht für Rennbedingungen suchen wirklich das Reich der Unit-Tests fällt. Mehr oder weniger per Definition der einzige Weg für Rennbedingungen zu testen, ist pseudo-zufällig. Es sei denn, Sie bereit sind, um den Aufwand zu gehen formal die Richtigkeit Ihrer Sperrstrategie erweist, werden Sie müssen einige Stress-Tests durchführen.

Sie müssen noch Unit-Tests, schreiben, um die Richtigkeit der Algorithmen, um zu überprüfen, anstatt die Sperrstrategie.

Bei Stresstests Multi-Threaded-Code, möchten Sie unter Bedingungen testen, wo Sie eine CPU pro Thread, in dem Sie mehrere Threads die gemeinsame Nutzung der CPU haben, und wo haben Sie mehr CPUs als Gewinde (wenn möglich).

Sie können eine Sperre Klasse schreiben, die potenziellen Deadlocks erkennt, indem man die Anordnung der Verriegelungsoperationen suchen. Wir tun dies durch einen Thread-Kontext aufweisen, die alle Sperren mit registrieren, wenn sie erworben werden (kann eine DEBUG einzige Option gemacht werden).

Die Idee ist eine Grafik zu erstellen, wo die Knoten Schlösser und eine gerichtete Kante zwischen A und B Mittel darstellt ‚Lock A gehalten wurde, als Sperre B erworben‘. Lassen Sie Ihr Programm normalen Belastungen laufen verwenden, dann für die Zyklen in der Grafik überprüfen. Ein Zyklus bedeutet für Deadlock es Potenzial, auch wenn Ihr Code es nicht getroffen.

Kann mir nicht eine gute automatisierte Weise, aber in der Nähe bin ich gekommen war, ein Unit-Test zu schreiben, die ein Deadlock ‚aussetzen‘ war, würde durch Haltepunkte zusätzlich zu einer Einheit Test. Ich habe einfach ein paar Anweisungen, wo Sie den Haltepunkt hinzuzufügen. Es gibt einigen manuellen Aufwand, aber mit ihnen können Sie Ihren schlimmsten Fall Thread Zeitplan immer aus.

Vielleicht hat jemand einen guten Weg gefunden, diese Art von Funktionalität zu automatisieren? Ich konnte automatisch vorstellen, den Debugger ausgeführt wird, an einer bestimmten Linie einen Faden zu brechen, einen anderen Lauf bis zu einem bestimmten Zustand zu lassen, dann für den Unit-Test durchzusetzen.

Ich habe früher künstliche Verzögerungen im Code verwendet, die von einigen Parametern in der Anforderung ausgelöst werden. Zum Beispiel sagt eine Anforderung den Server Schreib zwischen zwei Schreibvorgänge zu verzögern und ein anderer sie ohne Verzögerung dazwischen zu tun.

A Mark Bessey schreibt, das für die Erstellung von Repro nur dann sinnvoll ist, nicht für das Problem zu entdecken.

Haben Sie versucht, Corensic Jinx ?

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