22 Stimmen

junit: Auswirkungen von forkMode="once" auf die Korrektheit von Tests

Ich möchte die Zeit reduzieren, die unser Build (mit Ant) für die Ausführung der Tests benötigt. Derzeit verwende ich die Standard forkMode die forkt eine neue vm für jede Testklasse ( perTest ).

Ich denke über einen Wechsel zu forkMode="once" aber ich bin unsicher, ob dies die Tests koppeln wird und mir nach der Durchführung meiner Tests vielleicht falsch positive und/oder falsch negative Ergebnisse liefern.

Fragen:

  1. Bekommt jeder Testfall einen neuen ClassLoader so dass alle statischen Referenzen aus früheren Läufen nicht mehr zugänglich/sichtbar sind?

  2. Gibt es andere Dinge die zu einer Testabhängigkeit/Kopplung von Testmethoden führen, die das Verhalten verändern können (abgesehen vom Laden nativer Bibliotheken, die ich nicht verwende)

  3. Was ist mit Garbage Collection/Finalisierung, werden sie nach jedem Test ausgeführt? (Ich verlasse mich nicht auf sie, aber ich möchte einfach ein vollständiges Bild bekommen)

UPDATE

Nach den aktuellen Antworten scheint es, dass Junit bei der Verwendung von forkMode immer einen einzigen Classloader für alle Testfälle pro vm/fork verwendet. (forkMode="once" bedeutet also tatsächlich, dass es einen Classloader für alle Tests gibt)

Dies hat viele Vorteile (schnellere Tests und kann dazu führen, dass Tests aufgrund der statischen Kopplung fehlschlagen), aber auch einige Nachteile (statische Kopplung, die nur funktioniert, wenn ein gemeinsamer Classloader verwendet wird -> falsch positiv)

11voto

Duncan McGregor Punkte 16565
  1. Der Testrunner erstellt eine einzige Suite aller Tests und führt sie aus, so dass nur ein einziger Classloader beteiligt ist.
  2. Ja, das bedeutet, dass statische Daten von Tests gemeinsam genutzt werden, was gelegentlich praktisch sein kann, aber Sie zwingt, die statische Kopplung zwischen Klauseln zu reduzieren, was eine gute Sache ist.
  3. In der Regel gibt es keine explizite GC, aber Sie können Ihre eigene machen.

Im Allgemeinen ist es eine gute Sache, alle Tests in einer VM durchzuführen. Es zwingt Sie dazu, die statische Kopplung zu betrachten und ist viel schneller. Entscheidend ist auch, dass Ihre IDE sie auf diese Weise ausführt, und das ist wirklich die Art und Weise, in der Tests ausgeführt werden sollten - so nah wie möglich an der Kompilierungshäufigkeit.

5voto

Ben Punkte 2318

Beachten Sie, dass der Standardmodus eine neue VM für jeden Testfall (d.h. Klasse) und nicht für jeden Test (d.h. Methode) forkt. In der Anwendung, die ich derzeit teste, gibt es Probleme, wenn ich eine VM für mehr als einen Test wiederverwende: Objekte und Zustände bleiben von früheren Tests übrig und verhindern, dass spätere Tests funktionieren. Dies mag kein Problem sein, wenn Ihre Anwendung gut strukturiert ist und Ihre Tests streng in sich geschlossen sind. Ich bezweifle, dass die Garbage Collection nach jedem Test automatisch abläuft: Es ist bekanntermaßen schwierig, sicherzustellen, dass sie in jedem Fall zu einem bestimmten Zeitpunkt aufgerufen wird.

0voto

Liv Punkte 5916

Blick auf Stefans Blogeintrag Darüber würde ich eine Vermutung anstellen:

  1. erhalten Sie bei forkMode="once" nur einen einzigen Klassenlader
  2. Sie werden keinen Zugang mehr zur Ant-Umgebung haben.
  3. die GC wird innerhalb der gespawnten GC durchgeführt (wenn forceMode="once") und das bedeutet, dass sie NICHT nach jedem Testdurchlauf erfolgt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X