Was ist der beste Weg, um Unit-Tests aus mehreren Threads durchzuführen?
-
09-06-2019 - |
Frage
diese Art folgt einer anderen Frage von mir.
Sobald ich den Code für den Zugriff auf die Datei habe (ich werde die Antworten dort in einer Minute durchsehen), was wäre im Grunde der beste Weg prüfen Es?
Ich denke darüber nach, eine Methode zu entwickeln, die einfach viele hervorbringt Hintergrundarbeiter's oder so und teilt ihnen allen mit, die Datei zu laden/speichern und mit unterschiedlichen Datei-/Objektgrößen zu testen.Erhalten Sie dann eine Antwort von den Threads, um zu sehen, ob es fehlgeschlagen/erfolgreich war/die Welt implodieren ließ usw.
Könnt ihr Vorschläge machen, wie man das am besten angeht?Wie ich schon sagte, das ist alles irgendwie neu für mich :)
Bearbeiten
Nachfolgend Ajmastreans Post:
Ich verwende eine Konsolen-App zum Testen mit Debug.Asserts :)
Aktualisieren
Ich habe ursprünglich mit der Verwendung gerollt Hintergrundarbeiter Um mit dem Threading klarzukommen (da ich das von Windows-Entwicklern gewohnt bin), wurde mir schnell klar, dass mir klar wurde, dass es eine Art Hack sein würde, als ich Tests durchführte, bei denen mehrere Operationen (Threads) abgeschlossen werden mussten, bevor ich fortfahren konnte Bringen Sie es dazu, dies zu tun.
Ich habe dann weitergemacht ajmastrean's Beitrag und mir wurde klar, dass ich das wirklich verwenden sollte Faden Klasse für die Arbeit mit gleichzeitigen Operationen.Ich werde jetzt mit dieser Methode umgestalten (wenn auch mit einem anderen Ansatz).
Lösung
In .NET, ThreadPool
Threads werden ohne Einrichtung nicht zurückgegeben ManualResetEvent
s oder AutoResetEvent
S.Ich finde diese für eine schnelle Testmethode übertrieben (ganz zu schweigen davon, dass sie etwas kompliziert zu erstellen, einzurichten und zu verwalten sind).Hintergrundarbeiter sind auch etwas komplex mit Rückrufen und dergleichen.
Etwas, das ich gefunden habe und das funktioniert, ist
- Erstellen Sie ein Array von Threads.
- Richten Sie das ein
ThreadStart
Methode jedes Threads. - Starten Sie jeden Thread.
- An allen Threads teilnehmen (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();
}
}
Andere Tipps
@ajmastrean, da das Ergebnis des Unit-Tests vorhersehbar sein muss, müssen wir Threads irgendwie synchronisieren.Ich kann mir keinen einfachen Weg vorstellen, dies ohne die Verwendung von Ereignissen zu tun.
Ich habe festgestellt, dass ThreadPool.QueueUserWorkItem mir eine einfache Möglichkeit bietet, 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");
}
});
Ihre Idee sollte gut funktionieren.Im Grunde möchten Sie nur eine Reihe von Threads erzeugen und sicherstellen, dass diejenigen, die die Datei schreiben, lange genug brauchen, um die Leser tatsächlich warten zu lassen.Wenn alle Ihre Threads ohne Fehler und ohne dauerhafte Blockierung zurückkehren, ist der Test erfolgreich.