2013-03-05 5 views
6

Warum kann der Name einer Testmethode andere Tests beeinflussen?JUnit-Test fehlgeschlagen wegen des Methodennamens

Ich habe eine Suite mit 2 Klassen von Tests, und wenn ich einen Methodennamen von Klasse1 ändere, ist mein Test in Klasse2 ok (grün).

Ich bemerkte, dass beide Klassen eine Methode mit dem gleichen Namen haben, aber der Test, der fehlschlägt, ist keiner von diesen. Wenn ich jedoch einen von ihnen umbenenne, sind alle Tests in Ordnung.

Ist es in Ordnung, 2 Methoden mit demselben Namen in verschiedenen Klassen zu haben, aber in derselben Suite? Und die Tatsache, dass ein anderer Test zufällig fehlschlägt, ist nur ein Zufall?

ps: Die Reihenfolge der ausgeführten Tests wird geändert, nachdem ich diese Methode umbenannt habe. PS2: Entschuldigung für mein schlechtes Englisch.

kann das Bild besser erklären, meine Frage: enter image description here

+11

Sind die Tests gut entworfen, so dass sie tatsächlich in beliebiger Reihenfolge laufen? Gibt es einen Zustand, der von der Reihenfolge abhängig sein kann, in der sie ausgeführt werden? – vikingsteve

+6

Das Problem ist wahrscheinlich die Reihenfolge der Ausführung und nicht der Name des Tests. Einer (oder viele) der Tests können den Zustand des anderen ändern. –

+1

Riecht wie ein Test-Isolationsfehler, wie er bezeichnet wird, wenn ein Test von den Nebenwirkungen eines anderen Tests abhängt und daher in einer bestimmten Reihenfolge ausgeführt werden muss. –

Antwort

7

Es gibt keine Fehler in JUnit! Unser Team erlebte ähnliche Ergebnisse, die durch unsachgemäße Ressourcenverwaltung verursacht wurden. Sie können versuchen, Ihren fehlgeschlagenen Test umzubenennen, damit sie zuerst ausgeführt werden. Sie sollten jetzt grün werden, das ist meistens ein Zeichen, dass eine Ressource zwischen den Tests zufällig geteilt wird. In diesem Fall können Sie versuchen, die Ressource im Abreißen freizugeben (@After). Hier ist eine kleine Checkliste, um die Ursache zu finden:

  • Gibt es Threads, die einen Test überleben?
  • Sind alle Executors heruntergefahren und beendet?
  • Sind Dateien oder Streams nach einem Test noch geöffnet?
  • Sind alle Felder in der Test-Klasse nach einem Test gelöscht/reinitialisiert?
  • Vermeiden Sie die Verwendung von statischen Referenzen oder Singletons
  • Geben Sie Ressourcen in Ihrer Testmethode nicht frei, nur in der Abreißmethode. Andernfalls könnte eine Ausnahme diesen Code unzugänglich machen.