2013-08-05 2 views
5

Ich habe etwas Java-Code, den ich Unit-Tests mit JUnit, innerhalb von Eclipse (Neon) läuft. Es kommt vor, dass ein Testcode einen Fehler enthält, der in eine Endlosschleife übergeht. Der JUnit Lauf läuft dann natürlich nicht aus. Wie kann ich den Testlauf beenden?Wie man einen JUnit-Testlauf in Eclipse beendet, der in eine unendliche Schleife eingetreten ist

Die Schaltfläche zum Stoppen des Testlaufs ("Stop JUnit Test Run") funktioniert nicht gut: Die GUI scheint zu glauben, dass sie den Testlauf gestoppt hat, aber einen Blick auf die CPU-Aktivität (z. B. top)), zeigt an, dass ein Java-Thread noch läuft. Ich kann den Thread selbst töten, indem ich ihm ein Tötungssignal sende. Aber das scheint ein Klud und ist unbequem. Gibt es einen besseren Weg, der in Eclipse verfügbar ist?

Antwort

6

Töten Sie es aus der Konsolenansicht, mit der roten Taste. Dies stoppt den Prozess.

enter image description here

es aus der junit Ansicht Stoppen fragt es nur zu stoppen.

0

Versuchen Sie zuerst Matthew Farwells Antwort. Wenn das nicht funktioniert, müssen Sie zu Ihren laufenden Prozessen gehen (Strg + Umschalt + Esc auf Windows, dann Registerkarte Prozesse) und wählen Sie die java.exe Aufgabe, dann beenden Sie den Prozess. Für den Fall, müssen Sie jemals Eclipse töten, dann ist es javaw.exe

3

Sie solche Dinge mit JUnit durch Angabe eines Time-out innerhalb die @Test Anmerkung verarbeiten kann. Zum Beispiel:

// Simple test-case which will always fail with time-out 
@Test(timeout = 1000 * 60) throws Exception // 60 seconds 
public void testSomething() { 
    for (int i = 0; i < 100; i++) { // 100 seconds 
     Thread.sleep(1000); 
    } 
} 

Wenn Ihre Testmethode nicht rechtzeitig fertig, dann JUnit wird es unterbrechen und einen Testfehler melden. Für das obige Beispiel wird es sein:

java.lang.Exception: test timed out after 60000 milliseconds 
    at java.lang.Thread.sleep(Native Method) 
    at my.package.Test1.testSomething(Test1.java:12) 
+0

Nützlich, wenn Sie einen Fehler eines bestimmten Tests * könnte antizipieren eine Endlosschleife * verursachen. Nicht so nützlich, wenn Sie keinen guten Grund haben, dies zu vermuten, oder ein nachträgliches Re-Factoring führt zu einer Endlosschleife. – Raedwald

+0

@Raedwald Nun, ich würde Ihre Argumentation umdrehen und * jede * Testmethode mit '@Test (timeout = 60000)' (oder einem anderen beliebig hohen Timeout) annotieren, selbst wenn ich * keinen * Grund habe, ein Unendliches zu erwarten Schleife. –

+0

Hinzufügen zu * jedem * Test ist ein Code Geruch, denke ich. – Raedwald

Verwandte Themen