如果测试用例运行时不受控制或者运行时间过长,就将其自动判定为运行失败。实现这个功能,有以下2种选择:
在@Test注释的括号中添加timeout 参数(适用测试方法)
你可以随意指定一个毫秒级别的时长,如果测试用例运行后超过这个时长,则抛出的 Exception 会触发失败,从而判定测试用例执行失败。用法如下:
@Test(timeout=1000)
public void testWithTimeout() {
...
}
这种方法是靠在单独的线程中运行该测试用例实现的,如果用例运行的时长超过设置时长,用例会执行失败同时JUnit会中断该线程; 如果测试在执行可中断操作时超时,则该线程自动退出;如果测试用例是无限循环,则该线程会一直运行该用例,同时其他用例继续执行。
Timeout 规则 (适用于测试类中的所有测试方法)
Timeout 规则适用测试类中的所有测试方法的超时测试,除了在单个@Test注释中指定的timeout会执行外,Timeout规则一般也会执行。
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;
public class HasGlobalTimeout {
public static String log;
private final CountDownLatch latch = new CountDownLatch(1);
@Rule
public Timeout globalTimeout = Timeout.seconds(10); // 10 seconds max per method tested
@Test
public void testSleepForTooLong() throws Exception {
log += "ran1";
TimeUnit.SECONDS.sleep(100); // sleep for 100 seconds
}
@Test
public void testBlockForever() throws Exception {
log += "ran2";
latch.await(); // will block
}
}
在Timeout
rule中定义的timeout 适用于整个测试,包括@Before
或者 @After
.如果某个测试方法会无限循环下去,则 @After
不会被触发。