Ich habe einen Java-Dienst, der jetzt im Batch-Modus ausgeführt wird. Multi-Threading-Unterstützung wird dem Dienst hinzugefügt, sodass für jede Stapelanforderung ein Thread-Pool zum Ausführen des Stapels bereitgestellt wird. Die Frage ist, wie kann ich das testen? Ich habe Funktionstests, die unter der Threaded-Version des Dienstes gehen, aber irgendwie, ich denke, dass es ein Idiom geben muss, um das zu testen.Wie fügen Sie Tests für Multi-Thread-Unterstützung hinzu?
Antwort
Es gibt wirklich keinen "guten" Weg, dies zu tun. Das beste, was ich vorschlagen kann, wäre TestNG, mit dem Sie Ihre Testmethoden mit Anmerkungen versehen und sie in n Threads gleichzeitig ausführen können. Zum Beispiel:
@Test(invocationCount=10, threadPool=10)
public void testSomethingConcurrently() {
...
}
Mein TestNG Wissen ist besten rostig, aber AFAIK das sollte die testSomethingConcurrently
Methode 10mal gleichzeitig aufrufen. Dies ist eine nette und deklarative Möglichkeit, Multi-Threading-Tests gegen Ihren Code durchzuführen.
Sie können natürlich in JUnit etwas ähnliches tun, indem Sie Threads manuell in einer Schleife erzeugen, aber das ist wahnsinnig hässlich und schwer zu bearbeiten. Ich musste das für ein Projekt, an dem ich arbeitete, einmal machen; Diese Tests waren ein Alptraum, da ihre Fehler nicht immer wiederholbar waren.
Concurrency-Tests sind aufgrund ihrer nicht-deterministischen Natur schwierig und anfällig für Frustration. Dies ist einer der Gründe, warum es heute so einen großen Drang gibt, bessere Nebenläufigkeits-Abstraktionen zu verwenden, die leichter "vernünftig" zu argumentieren sind und sich selbst von der Korrektheit überzeugen.
Ich stimme mit Daniel überein, Nebenläufigkeitstests sind in der Tat sehr schwierig.
Ich habe keine Lösung für Parallelitätstests, aber ich werde Ihnen sagen, was ich mache, wenn ich Code testen möchte, der Multithreading beinhaltet. Die meisten meiner Tests werden mit JUnit und JMock durchgeführt. Da JMock mit mehreren Threads nicht gut funktioniert, verwende ich eine Erweiterung von JMock, die synchrone Versionen von Executor und ScheduledExecutorService bereitstellt. Dadurch kann ich Code testen, der von mehreren Threads in einem einzigen Thread ausgeführt wird, wobei ich auch den Ausführungsfluss steuern kann. Wie ich bereits gesagt habe, testet dies die Nebenläufigkeit nicht. Es überprüft nur das Verhalten meines Codes auf eine einzige Art und Weise, aber es reduziert die Anzahl der Fehler, die ich erhalte, wenn ich zu den Multithread-Executoren wechsle.
Wie auch immer ich empfehle die Verwendung der neuen Java Concurrency API. Es macht die Dinge viel einfacher.
Normalerweise sind die Dinge, die Multithread-Anwendungen zum Absturz bringen, Timing-Probleme. Ich vermute, dass das Ausführen von Komponententests für die gesamte Multithread-Umgebung große Änderungen an der Codebasis erfordern würde.
Was Sie möglicherweise tun können, ist jedoch, die Implementierung des Thread-Pools isoliert zu testen.
Indem Sie den Körper der Threads mit Testcode ersetzen, sollten Sie in der Lage sein, Ihre pathologischen Bedingungen für die Sperrung und Ressourcennutzung zu konstruieren.
Testen Sie dann die Funktionselemente in einer Umgebung mit einem einzelnen Thread, in der Sie das Timing ignorieren können.
Obwohl dies nicht perfekt ist, garantiert es doch die Wiederholbarkeit, die für Ihre Gerätetests von großer Bedeutung ist.(Wie in Daniel Spiewak Antwort angedeutet)
I verwendet
@Test(threadPoolSize = 100, invocationCount = 100)
@DataProvider(parallel = true)
100 Threads parallel 100-mal ausgeführt.
- 1. Fügen Sie eine Localdb für Tests hinzu
- 2. Fügen Sie den Kontakt für Identitätswechselkonto hinzu
- 3. Fügen Sie dem Testziel auch Cocoapoden hinzu?
- 4. SharpDevelop, Wie fügen Sie eine DataSource hinzu?
- 5. Wie fügen Sie ein Bild hinzu?
- 6. Fügen Sie mehrere Schaltflächen hinzu
- 7. Kennwortüberprüfungsskript. Fügen Sie Symbole hinzu
- 8. Wie fügen Sie Optionsfelder zu Menüelementen hinzu?
- 9. Wie fügen Sie Randbeschriftungen in Graphviz hinzu?
- 10. Wie fügen Sie die notifcationhubs-Bibliothek hinzu
- 11. Wie fügen Sie benutzerdefinierte Bilder als UIApplicationShortcutIcon für UIApplicationShortcutItem hinzu?
- 12. Wie programmatisch fügen Sie einen Tracepoint für Visual Studio hinzu?
- 13. So fügen Sie Eingabewerte hinzu
- 14. So fügen Sie die angezeigten Nummern hinzu
- 15. Fügen Sie eine Hyperlinkspalte für ein Winforms DataGrid-Steuerelement hinzu
- 16. So fügen Sie neue Objekte hinzu
- 17. Ruby: Fügen Sie einen dynamischen Modulnamen hinzu
- 18. Fügen Sie Maven-Repositories für ein Projekt in Eclipse hinzu?
- 19. Fügen Sie eine Beschreibung für eine Immobilie hinzu
- 20. Fügen Sie mehrere Ereignishandler für ein Ereignis in XAML hinzu?
- 21. Fügen Sie eine kreisförmige Beschneidungskomponente für UIImagePicker hinzu?
- 22. VS-Add-In: Fügen Sie die Kontextschaltfläche für Webanwendungen hinzu
- 23. fügen Sie einen gemeinsamen Rahmen für kombinierte ggplots hinzu
- 24. Fügen Sie Validierungs-Checks für GitHub-Pull-Requests hinzu.
- 25. Fügen Sie $ _POST dem Warenkorb hinzu
- 26. Fügen Suchmaschinen Gewicht für Mikroformate hinzu?
- 27. So fügen Sie meiner Anwendung Suchfunktionen hinzu
- 28. So fügen Sie Ansichten programmgesteuert Ansichten hinzu
- 29. Fügen Sie wordpress shortcode zu header.php hinzu
- 30. Fügen Sie JsonArray zu JsonObject hinzu