2010-02-22 10 views
6

Ich habe eine JUnit 4 Testsuite mit BeforeClass- und AfterClass-Methoden, die einen Setup/Teardown für die folgenden Testklassen vornehmen. Was ich brauche ist, die Testklassen auch selbst auszuführen, aber dafür brauche ich ein Setup/Teardown-Szenario (BeforeClass und AfterClass oder so ähnlich) für jede Testklasse. Die Sache ist, dass ich, wenn ich die Suite ausführen möchte, das Setup/Teardown nicht vor und nach jeder Testklasse ausführen möchte, sondern nur das Setup/Teardown aus der Testsuite (einmal) ausführen möchte. Ist es möglich? Danke im Voraus.Junit 4 Testsuite und individuelle Testklassen

Antwort

4

Ich kenne keinen Standard Weg, dies mit JUnit zu tun. Der Grund dafür, wie Sie wahrscheinlich schon wissen, ist, dass Ihre Testfälle unabhängig voneinander laufen sollten. Dies betrifft die "normalen" Setup/Teardown-Methoden, die vor und nach jeder Testmethode ausgeführt werden. Der Klassenaufbau und das Teardown sind ein bisschen anders - obwohl ich es trotzdem vorziehen würde, meine Tests unabhängig auszuführen und außerhalb der Problemzone zu bleiben.

Wenn Sie jedoch wirklich davon überzeugt sind, was Sie tun, können Sie ein globales Flag verwenden, um zu signalisieren, ob das Klassensetup/Teardown ausgeführt werden soll, und in den Klasseneinrichtungs-/Teardown-Methoden nach seinem Status suchen . In Ihrer Testsuite können Sie eine spezielle Klasse als erste Klasse hinzufügen, die lediglich das Setup ausführt und das globale Flag so setzt, dass es den realen Testfällen anzeigt, dass ihre Klasseneinrichtungs-/Teardown-Methoden nicht ausgeführt werden dürfen. Ebenso kann eine spezielle letzte Klasse in der Suite den Teardown-Code ausführen. Der Nachteil ist, dass ich fürchte, dass JUnit nicht die Reihenfolge der Ausführung von Testklassen in einer Suite garantiert, obwohl es höchstwahrscheinlich in der angegebenen Reihenfolge ausgeführt wird - aber dies ist nur ein Implementierungsdetail. Probieren Sie es aus, es kann für Sie funktionieren - aber es gibt keine Garantie, dass es immer das tut, was Sie erwarten.

+2

Danke für die Antwort, ich dachte eigentlich, dass aber ich dachte, vielleicht gibt es eine Lösung besser war. Der Grund für das, was ich tun möchte, ist, weil das Setup die Umgebung bereinigt und die Datenbank so zurücksetzt, dass es einige Zeit braucht, und deshalb möchte ich das Setup nicht für jede Testklasse ausführen, aber ich muss, wenn ich ein laufe Einzeltest. – Hypnus

3

Wenn Sie jUnit 4.7+ haben, empfehle ich die neue Funktion namens Regeln (die in this blog post erklärt werden). Sie sind vielleicht nicht genau das, was Sie wollen, aber sie sind wahrscheinlich die besten, die Sie mit jUnit bekommen.

Angeblich hat TestNG bessere Testgruppierungsmöglichkeiten, aber ich habe es noch nicht wirklich selbst untersucht.

0

Nein, in JUnit gibt es keinen Standard, aber Sie könnten etwas hacken, wie Péter Török vorgeschlagen hat.

Beachten Sie jedoch, dass Sie JUnit dabei mehr oder weniger missbrauchen. Der ganze Punkt der Einheit testet es, dass sie unabhängig voneinander sind. Dies liegt daran, dass Abhängigkeiten zwischen Tests einen totalen Wartungsalarm verursachen (Tests scheitern, weil der Lauf in der falschen Reihenfolge ausgeführt wird).

Also würde ich raten Ihnen dringend zu prüfen, ob es nicht besser ist, nur immer das Setup ausführen ...

+0

Danke, ID hat das in Betracht gezogen, aber das Setup hat eine viel längere Dauer als der Hole-Test mit allen Test-Klassen :) – Hypnus

+0

Ich fühle deine Schmerzen :-(. Wenn das auch wirklich nötig war, für Tests mit komplizierten Setup (obwohl es nur pro Klasse war. Eine Art von "Ich bin schon initialisiert" Flagge ist wahrscheinlich die beste Wahl. – sleske

Verwandte Themen