当前位置: 首页 > 教程 > Junit4 >

Junit4 超时测试

精华
小牛编辑
116浏览
2023-03-14

1 概述

在此示例中,我们将了解测试完成所花费的时间是否超过定义的“timeout”,将抛出TestTimedOutException并将测试标记为失败。
“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() {
        //...
    }
}