JUnit 5 @Timeout 超时注解详解

后端 潘老师 6个月前 (10-24) 128 ℃ (0) 扫码查看

学习编写JUnit 5测试,以测试外部系统和模拟依赖项的超时行为。

1.@Timeout注解

1)JUnit 5使用声明方式来定义给定测试的超时行为,使用@Timeout注解。这与JUnit 4的@Test超时属性不同。

2)配置超时的测试应该失败,如果它的执行时间超过给定的持续时间。测试的执行在主线程中进行。如果超时被超过,主线程将从另一个线程中断。

3)超时持续时间的默认时间单位是秒。我们也可以配置其他时间单位。

4)可以将@Timeout注解应用于:

  • 测试
  • 测试工厂
  • 测试模板
  • 生命周期方法

以下是一些测试的示例,应该在3秒内完成,否则失败。

@Timeout Syntax@BeforeEach
@Timeout(2)
void setUp() {
    // 执行超过2s就失败
}
@Test
@Timeout(3)
void someTest() {
    TimeUnit.SECONDS.sleep(5);
}

上述测试将以java.util.concurrent.TimeoutException失败,原因是:someTest()在3秒后超时。

2.全局超时

  • 要为所有测试和嵌套测试配置超时,我们可以在类级别上应用@Timeout注解。
  • 在类级别上声明的@Timeout注解不会应用于生命周期方法。
  • 我们可以通过在特定测试上应用@Timeout注解来覆盖特定测试的超时。
  • 当与@RepeatedTest@ParameterizedTest一起使用时,超时应用于每个测试调用。

在给定示例中,testMethodOne将失败,而testMethodTwo将通过。

@Timeout(3)
public class TimeoutTests {
    @Test
    void testMethodOne() throws InterruptedException {
        TimeUnit.SECONDS.sleep(5);
    }
    @Test
    @Timeout(5)
    void testMethodTwo() throws InterruptedException {
        TimeUnit.SECONDS.sleep(4);
    }
}

3.Assertions.assertTimeout()

assertTimeout()方法断言的是,执行提供的代码应在给定的超时时间之前完成。

以下给定的测试将会通过,因为方法执行在2秒内完成,而assertTimeout()等待3秒。

@Test
void testGetValue() throws InterruptedException {
    Assertions.assertTimeout(Duration.ofSeconds(3), () -> {
        getValue();
    });
}
String getValue() throws InterruptedException {
    TimeUnit.SECONDS.sleep(2);
    return "";
}

4.全局禁用@Timeout

禁用超时在全球范围内特别有用,当使用断点调试应用程序代码或测试代码时。在这种情况下,即使所有其他断言都为真,测试也可能因超时而被标记为失败。

使用junit.jupiter.execution.timeout.mode配置参数来配置超时行为。其值包括:

  • enabled(默认模式)–全局启用超时。
  • disabled–全局禁用超时。
  • disabled_on_debug–如果您的IDE不支持此属性,请使用此配置值。

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10294.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】