2013-08-05 7 views
5

Mam trochę kodu Java, który testuję jednostkowo przy użyciu JUnit, działającego w środowisku Eclipse (Neon). Zdarza się, że testowany kod zawiera błąd, który powoduje, że wchodzi w nieskończoną pętlę. Oczywiście JUnit nie kończy się. Jak zabić uruchomienie testowe?Jak zabić test JUnit w Eclipse, który wszedł w pętlę infinte

Przycisk zatrzymania testu ("Zatrzymaj JUnit Test Run") nie działa dobrze: GUI wydaje się myśleć, że zatrzymało testowe uruchomienie, ale przyjrzeć się działaniu procesora (używając np. top, na przykład), pokazuje, że wątek Java nadal działa. Mogę samemu zabić wątek, wysyłając mu sygnał zabicia. Ale wydaje się, że jest to niedogodność i jest niewygodne. Czy istnieje lepszy sposób, dostępny w samym Eclipse?

Odpowiedz

6

Zabij go w widoku konsoli, używając czerwonego przycisku. To zatrzymuje proces.

enter image description here

Zatrzymanie go z widzenia junit prosi go tylko zatrzymać.

0

Po pierwsze, spróbuj odpowiedzi Matthew Farwella. Jeśli to nie działa, musisz przejść do uruchomionych procesów (ctrl + shift + esc w oknach, następnie zakładka procesów) i wybrać zadanie java.exe, a następnie zakończyć proces. W przypadku kiedykolwiek trzeba zabić zaćmienie, to javaw.exe

3

może obsługiwać takie rzeczy z JUnit przez określenie time-out w ciągu @Test adnotacji. Na przykład:

// 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); 
    } 
} 

Jeżeli metoda badawcza nie kończy się na czas, następnie JUnit będzie go przerwać i zgłosić awarię testową. Dla powyższego przykładu będzie to:

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

Przydatne, jeśli przewidujesz awarię określonego testu * może * spowodować nieskończoną pętlę. Nie jest to zbyt użyteczne, jeśli nie masz uzasadnionego podejrzenia, lub kolejna próba ponownego fakturowania wprowadza nieskończoną pętlę. – Raedwald

+0

@Raedwald Cóż, chciałbym obrócić twoje rozumowanie i opisać * każdą * metodę testową za pomocą '@Test (timeout = 60000)' (lub jakiegoś innego arbitralnie wysokiego limitu czasu), nawet jeśli mam * nie * nie mam żadnego powodu oczekiwać nieskończonego pętla. –

+0

Jeśli dodam, że * co * test jest zapachem kodu, myślę. – Raedwald