2017-02-24 5 views
2

Ich arbeite mit viel Legacy-Code. Zu Beginn gab es eine JUnit-TestSuite. Wenn alle Tests mit Gradle ausgeführt wurden, sind sie fehlgeschlagen. Als sie den Test in IntelliJ durchführten, arbeiteten sie. Wir haben Gradle konfiguriert, um die Testsuite zu verwenden.JUnit Tests beeinflussen sich gegenseitig

Jetzt berichtete jemand über Tests, die lokal ohne Gradle funktionieren, aber nicht mit Gradle. Es ist Zeit, dass wir dieses Durcheinander beheben.

Gibt es eine intelligente Methode, um herauszufinden, welcher Test eine Konfiguration zurücklässt oder welche Tests sich auf die anderen Tests stützen?

+1

Wahrscheinlich ist es die Reihenfolge der Ausführung, denke ich, IDEs und JUnit im Allgemeinen nicht eine Bestellung oder Ausführung. Auch wenn es statische Variablen gibt, die nicht unveränderbar sind, können einige Probleme auftreten. - Entschuldigung für den mit Gründen versehenen Kommentar. – cesaregb

+1

Mir ist kein einfacher Weg bekannt ... Ich würde nach Tests mit '@ BeforeClass' suchen. Testfehler werden Sie natürlich auch auf die problematische Klasse hinweisen. Ich würde das Bugfixing nennen, und wenn es einen automatisierten Weg gäbe, Bugs zu beheben, wären wir alle arbeitslos. Wenn Sie einen Code-Coverage-Bericht erhalten können, wird möglicherweise genau angegeben, wo der Fehler auftritt. –

+0

Danke, @cesaregb, ich werde nach statischen Variablen suchen! –

Antwort

3

Die wahrscheinlichste Ursache für dieses "Bluten" von einem Test in einen anderen sind veränderbare statische Werte. Standardmäßig werden alle Tests von derselben JVM ausgeführt, sodass eine statische Variable, die durch einen Test "mutiert" wird, in einem anderen Test "schmutzig" ist.

Veränderliche Statik ist böse! Ich arbeite derzeit an einer Codebase mit veränderbaren Statiken und es ist ein Durcheinander. Wenn möglich, sollten Sie die Verwendung der Abhängigkeitsinjektion umgestalten und den änderbaren Zustand in Instanzen und nicht in statischen Daten speichern.

Als Workaround können Sie die Tests in Gradle ausführen, indem Sie Test.forkEvery verwenden, um eine separate JVM pro Test zu verwenden, so dass statische Variablen für jeden Testaufruf "sauber" sind. ZB

test { 
    forkEvery = 1 
} 
+0

Vielen Dank! Ich werde nach veränderbaren statischen Werten suchen. Wir haben eine Einstellungs-Klasse, daher habe ich den starken Verdacht, dass da etwas drin sein könnte. Ich habe noch nie mit Dependency-Injection gearbeitet, ich muss mich darum kümmern. Ich brauche den Grapple-Trick nicht (obwohl es ziemlich cool ist), da Gradle jetzt mit der Testsuite erfolgreich läuft. –

+1

Jeder Test, der die 'Settings'-Statik verändert, sollte' Settings.reset() 'in einer' @ After'- oder '@ AfterClass'-Methode aufrufen. Manchmal ist es auch einfacher, 'Settings.reset()' in '@ Before' oder' @ BeforeClass' zu setzen, wenn Sie den ungezogenen Test nicht aufspüren können –

Verwandte Themen