Junit4 超时测试
精华
小牛编辑
116浏览
2023-03-14
1 概述
在此示例中,我们将了解测试完成所花费的时间是否超过定义的“timeout”,将抛出TestTimedOutException并将测试标记为失败。
“runaway”或花费太长时间的测试可能会自动失败。有两种方法可以实现此行为:
“runaway”或花费太长时间的测试可能会自动失败。有两种方法可以实现此行为:
- @Test注释上的超时参数(适用于测试方法)
- 使用JUnit Foundation进行全局超时管理
2 @Test注释上的超时参数(适用于测试方法)
您可以选择指定超时(以毫秒为单位),以使测试方法失败(如果花费的时间长于该毫秒数)。如果超过了时间限制,则引发失败将引发失败 Exception :
@Test(timeout=1000)
public void testWithTimeout() {
...
}
这是通过在单独的线程中运行测试方法来实现的。如果测试运行的时间超过了分配的超时时间,则测试将失败,并且JUnit将中断运行测试的线程。如果在执行可中断操作时测试超时,则运行测试的线程将退出(如果测试处于无限循环中,则运行测试的线程将永远运行,而其他测试将继续执行)。
3 超时规则(适用于测试类中的所有测试用例)
超时规则将相同的超时应用于类中的所有测试方法,并且除由timeout 单个Test注解上的参数指定的任何超时外,还将执行 :
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;
/**
* 小牛知识库网: https://www.xnip.cn
*/
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 规则适用于整个测试夹具,包括任何 @Before或 @After 方法。如果测试方法处于无限循环中(或对中断没有响应),则 @After 不会调用方法。
4 使用JUnit Foundation进行全局超时管理
本示例向您展示如何创建全局超时规则,该规则将应用于类中的所有测试方法。
超时管理由HookInstallingRunner应用, 可以通过将TEST_TIMEOUT配置选项设置为所需的默认测试超时间隔(以毫秒为单位)来激活 。此超时规范适用于未明确指定更长间隔的每个测试方法。
import org.junit.runner.RunWith;
import com.nordstrom.automation.junit.HookInstallingRunner;
@RunWith(HookInstallingRunner.class)
public class ExampleTest {
...
}
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;
import java.util.concurrent.TimeUnit;
/**
* 小牛知识库网: https://www.xnip.cn
*/
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() {
//...
}
}