Usage and Idioms——Timeout for tests

如果测试用例运行时不受控制或者运行时间过长,就将其自动判定为运行失败。实现这个功能,有以下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不会被触发。

 

posted @ 2017-02-15 14:18  Cranberries  阅读(197)  评论(0)    收藏  举报