25 Stimmen

Was ist der beste Weg, um Unit-Test von mehreren Threads?

Dies ist eine Art Fortsetzung von etwas anderem Frage von mir.

Sobald ich den Code für den Zugriff auf die Datei habe (ich werde die Antworten in einer Minute überprüfen), was wäre der beste Weg, um Test es?

Ich denke darüber nach, eine Methode zu entwickeln, die einfach eine Menge von BackgroundWorker und sagt ihnen, dass sie alle die Datei laden/speichern und mit unterschiedlichen Datei-/Objektgrößen testen sollen. Dann erhalten Sie eine Antwort von den Threads, um zu sehen, ob der Test fehlgeschlagen ist, erfolgreich war, die Welt implodiert ist usw.

Könnt ihr mir Vorschläge machen, wie ich das am besten angehen kann? Wie ich schon sagte, ist das alles ziemlich neu für mich :)

bearbeiten

Unter ajmastrean's Posten:

Ich verwende eine Konsolenanwendung zum Testen mit Debug.Asserts :)


Update

Ursprünglich hatte ich die Verwendung von BackgroundWorker um mit dem Threading umzugehen (da ich das von der Windows-Entwicklung gewohnt bin), merkte ich bald, dass ich bei Tests, bei denen mehrere Ops (Threads) abgeschlossen werden mussten, bevor ich fortfahren konnte, feststellen musste, dass es ein bisschen schwierig sein würde, dies zu erreichen.

Ich habe dann nachgefasst über ajmastrean Post und stellte fest, dass ich eigentlich die Thema Klasse für die Arbeit mit gleichzeitigen Operationen. Ich werde jetzt mit dieser Methode (wenn auch mit einem anderen Ansatz) refaktorisieren.

0 Stimmen

Verwenden Sie die Visual Studio-Testtools oder ein Tool eines Drittanbieters, wie NUnit oder MbUnit? Es gibt einige sehr unterschiedliche Muster für Multi-Thread-Tests für beide. Und was das betrifft, sind Sie Unit-Tests oder nur eine Konsolenanwendung zu Testzwecken zusammenstellen?

22voto

Anthony Mastrean Punkte 20992

In .NET, ThreadPool Threads kehren nicht zurück, ohne dass die ManualResetEvent s oder AutoResetEvent s. Ich finde diese Overkill für eine schnelle Testmethode (ganz zu schweigen von Art von kompliziert zu erstellen, zu setzen, und zu verwalten). Background Worker ist ein auch ein bisschen komplex mit den Rückrufen und so.

Ich habe festgestellt, dass Folgendes funktioniert

  1. Erstellen Sie ein Array von Threads.
  2. Einrichten der ThreadStart Methode eines jeden Threads.
  3. Beginnen Sie jedes Thema.
  4. Join on all threads (blockiert den aktuellen Thread, bis alle anderen Threads abgeschlossen oder abgebrochen sind)

    public static void MultiThreadedTest() { Thread[] threads = new Thread[count];

    for (int i = 0; i < threads.Length; i++)
    {
        threads[i] = new Thread(DoSomeWork());
    }
    
    foreach(Thread thread in threads)
    {
        thread.Start();
    }
    
    foreach(Thread thread in threads)
    {
        thread.Join();
    }

    }

1voto

aku Punkte 118808

@ajmastrean, da das Ergebnis von Unit-Tests vorhersehbar sein muss, müssen wir die Threads irgendwie synchronisieren. Ich kann keinen einfachen Weg sehen, dies ohne die Verwendung von Ereignissen zu tun.

Ich habe festgestellt, dass ThreadPool.QueueUserWorkItem gibt mir eine einfache Möglichkeit, solche Anwendungsfälle zu testen

 ThreadPool.QueueUserWorkItem(x => { 
    File.Open(fileName, FileMode.Open);
    event1.Set(); // Start 2nd tread;
    event2.WaitOne(); // Blocking the file;
});
ThreadPool.QueueUserWorkItem(x => { 
    try
    {
        event1.WaitOne(); // Waiting until 1st thread open file
        File.Delete(fileName); // Simulating conflict
    }
    catch (IOException e)
    {
        Debug.Write("File access denied");
    }
});

-2voto

Eric Z Beard Punkte 36325

Ihre Idee sollte gut funktionieren. Im Grunde wollen Sie nur eine Reihe von Threads starten und sicherstellen, dass die, die die Datei schreiben, lange genug brauchen, um die Leser warten zu lassen. Wenn alle Ihre Threads ohne Fehler zurückkehren und nicht ewig blockieren, ist der Test erfolgreich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X