Wie zu teilen, JUnit BeforeClass Logik zwischen mehreren Klassen testen
Derzeit alle meine JUnit-tests erstrecken sich von einer gemeinsamen Basisklasse stellt Methoden bereit tagged mit @BeforeClass
und @AfterClass
Anmerkungen - all diese wirklich tun, ist das setup eine Reihe von statischen Ressourcen/Dienstleistungen für die tests zu verwenden.
Scheint das ein unangenehm zu mir für ein paar Gründe:
- Teil der Punkt JUnit4 (aus meinem Verständnis) ist, dass wir nicht benötigen, sollten Sie diese klassische test-Vererbung mehr.
- Wenn ich diese tests als Teil einer suite, anstatt individuell (was wir oft tun), die
@BeforeClass
und@AfterClass
bekommen mehrmals aufgerufen wird, eine Verlangsamung des tests - wir sollten wirklich nur den Aufruf dieser einmal
Was ich gerne machen würde, ist irgendwie verschieben der aktuellen BeforeClass/AfterClass Logik aus der Vererbungskette und in etwas, das geteilt werden kann, die durch einzelne tests und die suite als ganzes.
Kann das getan werden? Wenn ja, wie? (Wenn es darauf ankommt, bin ich mit JUnit 4.7, und es könnte eine harte verkaufen, um ein update auf eine andere version)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Lösung für das erste Problem ist das verschieben der Logik in einer Erweiterung der
org.junit.rules.ExternalResource
Anschluss an den test über eine@ClassRule
, eingeführt in JUnit 4.9:In diesem Weg, die Ressourcen, die zuvor von der Basis-Klasse verschoben werden aus der test-Klasse Hierarchie und in die modular/Verbrauchsmaterial "Ressourcen", die erstellt werden können, bevor eine Klasse führt und zerstört, wenn eine Klasse ausgeführt wird.
Als Lösung für beide Probleme zur gleichen Zeit, obwohl - das heißt: mit dem gleichen hohen level setup/teardown ausgeführt, als Teil einer individuellen Prüfung und als Teil einer suite - es scheint nicht zu sein jede spezifische integrierte Unterstützung für diese. Jedoch..., Sie konnte es selbst implementieren:
Ändern Sie einfach die
@ClassRule
Ressource Schöpfung in einer Fabrik-Muster, das tut reference counting intern, um zu bestimmen, ob oder nicht, um zu erstellen/zerstören die Ressource.Z. B. (bitte beachten: dies ist rauh und braucht vielleicht einige tweaks/Fehlerbehandlung Robustheit):
Beide Ihre suite /test-Klassen würden nur die Verwendung der Ressource als
@ClassResource
durch die factory-Methode:Beim laufen einen einzelnen test, der refcounting keine Wirkung haben - die "eigentliche init" und "tatsächliche Abrüsten" wird nur einmal geschehen. Beim laufen durch die suite, die suite erstellen Sie die TestResource, und die einzelnen tests werden nur die Wiederverwendung der bereits instantated (der refcounting davon abhält, tatsächlich zerstört und neu erstellt, die zwischen den tests in der suite).
ClassRule
. Jeder test ändern wird refCount auf 2, dann zurück auf 1, wenn es fertig ist. Wenn die suite fertig ist, wird es auf 0 gehen. Wann läuft so ein test, refCount auf 1 gesetzt ist, indem der einzelne test, dann auf 0, wenn der test abgeschlossen ist. Der Punkt ist, dass die Ressource ist nur geschaffen und vernichtet, sobald in beide Richtungen laufen.Können Sie die
@BeforeClass
und@AfterClass
IN DER SUITE-KLASSE.Dieser wird ausgeführt, der Methoden, bevor die test-Klassen in der suite ausführen und nach alle test-Klassen finish (jeweils)
Diese Weise können Sie führen Sie Sie nur einmal.
Stieß ich auf ähnliches problem (Frühjahr keine option war und ich nicht mit dem schreiben von TestSuites in maven-Projekten), so schrieb ich einfache junit-runner um dieses problem zu lösen.
Den Sie schreiben müssen, SharedResource Klasse und markieren Sie Ihren test zu verlangen, dass die Ressource.
}
Quellen https://github.com/eanlr/junit-shared-resources-runner