JUnit - Timeout-Test
Wenn ein Test länger als ein definiertes „Timeout“ dauert, wird einTestTimedOutException ausgelöst und der Test als fehlgeschlagen markiert. Siehe folgendes Beispiel:
P.S Tested with JUnit 4.12
1. Timeout-Beispiel
Diesestimeout-Beispiel gilt nur für eine einzelne Testmethode. Der Timeout-Wert wird in Millisekunden angegeben.
TimeoutTest.java
package com.example;
import org.junit.Test;
public class TimeoutTest {
//This test will always failed :)
@Test(timeout = 1000)
public void infinity() {
while (true) ;
}
//This test can't run more than 5 seconds, else failed
@Test(timeout = 5000)
public void testSlowMethod() {
//...
}
}
Dieser Timeout-Test ist nützlich, um die Methodenleistung zu testen.
2. Beispiel für eine globale Timeout-Regel
Dieses Beispiel zeigt Ihnen, wie Sie eine globale Zeitüberschreitungsregel erstellen. Diese Regel gilt für alle Testmethoden in einer Klasse.
TimeoutTest.java
package com.example;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;
import java.util.concurrent.TimeUnit;
public class TimeoutRuleTest {
//global timeout rule
@Rule
public Timeout globalTimeout = Timeout.seconds(1);
//This test will be failed, because it will take more than 1 second to finish!
@Test
public void testSlowMethod1() throws InterruptedException {
//...
TimeUnit.SECONDS.sleep(5000);
}
//passed
@Test
public void testSlowMethod2() {
//...
}
}
Im obigen Beispiel wird eine globaleTimeout-Regel deklariert. SowohltestSlowMethod1() als auchtestSlowMethod2() müssen den Test innerhalb von 1 Sekunde beenden. Andernfalls schlägt der Test fehl.
P.S The rule also applies on @Before and @After methods.
Note
Alle Unit-Tests sollten schnell sein, und diese globale Timeout-Regel sollte Ihr bester Helfer sein.