2009-06-05 8 views
15

Haben Sie Ratschläge zum Testen einer Multithread-Anwendung?So testen Sie die Thread-Sicherheit

Ich weiß, Threading-Fehler sind sehr schwer zu fangen und sie können jederzeit auftreten - oder gar nicht. Tests sind schwierig und die Ergebnisse sind nie sicher. Sicherlich ist es am besten, die gleichzeitigen Module sorgfältig zu entwerfen und zu programmieren.
Trotzdem - ich möchte den Testaspekt nicht auslassen. Wenn Sie also viele Threads ausführen, die alle an denselben Elementen arbeiten, können manchmal Threading-Fehler auftreten.

Irgendwelche Ideen oder Best Practices, um eine hohe Trefferquote bei versteckten Threading-Fehlern zu erzielen?
(Ich verwende .Net/C#)

+0

hier ist eine ähnliche Frage: http://StackOverflow.com/Questions/111676/Einheit-Test-Amultithreaded-Application –

+0

Danke, ich hatte eine sieh dich um, aber du hast das nicht gefunden. – tanascius

+0

Hoppla, duplizieren Kommentar. –

Antwort

11

Sie können einige gute Werkzeuge verwenden, um alle Threading-Probleme wie Datenrennen, Deadlocks, blockierte Threads usw. zu testen. intel-thread-checker ist ein solches gutes Werkzeug.

Sie können auch versuchen, CHESS von Microsoft Research

+0

Danke für die Links - ich schaue gerade jetzt auf CHESS - die Beispiele sehen sehr vielversprechend aus – tanascius

+1

CHESS ist definitiv der Weg zu gehen, schau dir auch Videos auf http://channel9.msdn.com/ an –

5

Versuchen Sie, die Anzahl der Threads zu einer großen Anzahl zu erhöhen, wenn möglich, sogar darüber hinaus, wie viele in einer Version verwendet werden. Bei vielen Threads, die Ihr Programm ausführen, wird häufiger ein Fehler angezeigt, da mehr Threads über den Code ausgeführt werden.

Überprüfen Sie Ihre Deklarationen, Sperren, Entsperrungen, Semaphore usw. und stellen Sie sicher, dass sie Sinn ergeben.

Erstellen Sie ein Testdokument oder eine Tabelle und denken Sie anhand Ihrer Kenntnisse des Codes darüber nach, wo mögliche Rassenbedingungen oder Deadlocks auftreten können.

Schnappen Sie sich ein paar Leute aus der Halle und machen Sie einen 'Flur Usability Test' (Joel auf Software sagte, dass ich denke?). Im Allgemeinen werden Leute, die keine Ahnung haben, was Ihr Programm macht/ist, in der Lage sein, es leicht zu brechen.

2

Gute Frage. Normalerweise teste ich auf Rennbedingungen, indem ich viele Threads hervorbringe und sie die Operationen wild ausführen lasse, von denen ich vermute, dass sie den Rennbedingungen unterliegen.

Vielleicht können Sie PNUnit betrachten - obwohl es wahrscheinlich ein wenig anders ist, als Sie suchen. Die Autoren sagen, dass sie es gebaut haben, weil "wir Hunderte von Clients gegen denselben Server simulieren mussten".

-1

grep-Code für Aufrufe von Threading-Routinen. Wenn irgendwelche gefunden werden, scheitern Sie den Test, da Ihr Code Multithreading-Fehler aufweist.

Wenn es besteht, erweitern Sie Ihre Suche auf die Teile der Bibliotheken, die Sie verwenden, bis es fehlschlägt oder (unwahrscheinlich) ist threadsicher (d. H. Single-threaded).

Sobald Sie wissen, dass Sie Fehler einfädeln, ist der Test Teil des Jobs abgeschlossen. Alles, was übrig bleibt, ist die kleine Sache, sie zu finden und zu entfernen ...