Kraft JUnit einen Testfall zu einer Zeit,
Habe ich eine problematische situation mit einigen ziemlich hoch unit-tests (mit PowerMock für Spott und JUnit 4.5). Ohne in zu viel detail, der erste test bei einer test-Klasse wird immer erfolgreich sein, aber alle folgenden Testfälle, die in der gleichen Prüfung der Klasse fehlschlägt. Allerdings, wenn ich wählen, um nur Testfall 5 von 10, zum Beispiel, wird es passieren. Also alle tests übergeben, wenn Sie einzeln ausgeführt. Gibt es eine Möglichkeit zu zwingen, JUnit einen Testfall zu einer Zeit? Ich nenne JUnit aus ant-script.
Ich bin mir bewusst, das problem der abhängigen Testfällen, aber ich kann nicht lokalisieren, warum das so ist. Es gibt keine gespeicherten Variablen in den test-Fällen, also nichts zu tun in der @Before-annotation. Das ist, warum ich bin auf der Suche nach einer Notfall-Lösung wie zwingen JUnit-tests ausführen, individuell.
- Sind Sie mit JUnit < 4.x?
- Nein, es ist JUnit 4.5.
- Bitte Bearbeiten Sie diese Informationen in Ihre Frage, so dass jeder es Lesen kann.
- "Es gibt keine gespeicherten Variablen in den test-Fällen" sind Sie sich da sicher? Was ist mit static Variablen?
- Wie genau funktioniert ein test fehl, D. H., was Sie testen für?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist nicht, dass JUnit ausgeführt, alle tests auf einmal, Ihr problem ist, dass Sie nicht sehen warum ein test fehlschlägt. Lösungen:
Beispiel:
Ich bin mir bewusst, all die Empfehlungen, aber um endlich deine Frage zu beantworten hier ist ein einfacher Weg, das zu erreichen, was Sie wollen. Setzen Sie einfach diesen code in Ihre test-Fall:
Mit dabei, und kein test kann erst beginnen, wenn die Sperre erworben wird, und nur ein Schloss erworben werden können, zu einer Zeit.
Es scheint, dass Ihre Testfälle abhängig, dass heißt: die Durchführung von Fall-X wirkt sich auf die Durchführung von Fall-Y. So ein Test-system sollte vermieden werden (zum Beispiel: es gibt keine Garantie auf die Reihenfolge, in der JUnit ausgeführt wird Ihre Fällen).
Sollten Sie umgestalten Fällen machen Sie unabhängig von einander. Viele Male die Verwendung der @Before-und @After-Methoden können Ihnen helfen, entwirren solche Abhängigkeiten.
Herzlichen Glückwunsch. Sie haben einen Fehler gefunden. 😉
Wenn die tests "sollte nicht" - Effekt jedes andere, dann können Sie aufgedeckt zu haben eine situation, wo Sie Ihren code eingeben können, einen gebrochenen Zustand. Versuchen Sie, behauptet und die Protokollierung, um herauszufinden, wo der code schief geht. Sie können sogar brauchen, um die tests ausführen im debugger und prüfen Sie Ihre code-interne Werte nach dem ersten test.
Entschuldigen Sie mich, wenn ich nicht beantworten Ihre Frage direkt, aber das ist nicht Ihr problem genau das, was TestCase.setUp() und TestCase.tearDown() werden soll zu lösen? Dies sind die Methoden, die von JUnit-framework wird, rufen Sie immer vor und nach jedem Testfall, und werden typischerweise verwendet, um sicherzustellen, dass Sie beginnen jeden Testfall in den gleichen Zustand.
Siehe auch die JavaDoc für TestCase.
Sollten Sie Ihre gesamte Codebasis, gibt es keine statischen Variablen, die sich auf veränderliche Zustand. Idealerweise sollte das Programm nicht statisch veränderlich Staat (oder sollten es zumindest dokumentiert werden wie ich hier). Auch sollten Sie sehr vorsichtig sein, über das Aufräumen, was Sie schreiben, wenn die tests schreiben, um das Dateisystem oder die Datenbank. Ansonsten laufen die tests, die Auslaufen können einige Nebenwirkungen, die es schwierig macht, um die tests unabhängig und wiederholbar.
Maven und Ant enthalten eine "forkmode" parameter für die Ausführung von JUnit-tests, die angibt, ob jedes test-Klasse bekommt seine eigene JVM oder sind alle tests laufen in derselben JVM. Aber Sie haben eine option für jedes test Methode in seiner eigenen JVM.
Das @Vor der Anweisung ist harmlos, weil es heißt für jeden Testfall. Das @VorKlasse ist gefährlich, weil es zu statisch sein.
Es klingt zu mir, dass es vielleicht gar nicht, dass Sie nicht die Einrichtung oder reißen Sie Ihre tests richtig (obwohl zusätzliche setup/teardown können Teil der Lösung sein), aber vielleicht haben Sie freigegebenen Zustand in Ihrem code, dass Sie nicht bewusst sind. Wenn ein früh test ist die Einstellung static /singleton /shared variable, die Sie nicht bewusst sind, die tests schlagen fehl, wenn Sie nicht erwartet. Auch mit Mocks dies ist sehr gut möglich. Sie brauchen, um zu finden, die diese verursachen. Ich Stimme mit den anderen Antworten, dass Ihre tests herausgestellt haben, ein problem, das sollte nicht gelöst werden, indem Sie versuchen, führen Sie die tests anders.
Deine Beschreibung zeigt mir, dass deine unit-tests abhängen jeder andere. Das ist stark nicht empfohlen in unit-tests.
Unit-test muss unabhängig und isoliert. Sie müssen in der Lage sein, um Sie auszuführen, allein, alle von Ihnen (in welcher Reihenfolge, es spielt keine Rolle).
Weiß ich, dass es Ihnen nicht helfen wird. Das problem wird in Ihrem
@BeforeClass
oder@Before
Aussagen. Gibt es Abhängigkeiten. So gestalten Sie Sie und versuchen das problem zu isolieren.Wahrscheinlich Ihre mocks erstellt werden, die in Ihrem
@BeforeClass
. Berücksichtigen, um Sie in die@Before
- Anweisung. Es gibt also keine Instanz, die länger als ein Testfall.