在JUnit 5中,如何在超时后使测试失败?

xxhby3vn  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(250)

在JUnit 4中,“timeout”注解参数可用于强制测试在给定得时间之后停止:

@Test(timeout=100)
public void infinity() {
   while(true);
}

如何在JUnit 5中完成此操作?
timeout parameter for Annotation Type Test密切相关(代码取自timeout parameter for Annotation Type Test),但适用于JUnit 5。

zzoitvuj

zzoitvuj1#

timeout属性的严格对等用法是宣告式@Timeout注解。
在JUnit 5文档中:
@Timeout注解可让您宣告测试、测试作坊、测试模板或生命周期方法在执行时间超过指定的持续时间时应该失败。持续时间的时间单位预设为秒,但可以设定。
例如:

@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void infinity() { 
  // fails if execution time exceeds 100 milliseconds
  //...
}

Assertions.assertTimeout()Assertions.assertTimeoutPreemptively()是JUnit 5中引入的新概念(JUnit 4中不存在)。它们是@Timeout的替代方法,可将超时限制为一组特定的语句:在ExecutableSupplier中定义的参数。
这两种方法(名称非常接近)的总体目标相同,但有细微的区别。
如果发生超时,而assertTimeout()没有发生超时,则assertTimeoutPreemptively()会抢先中止Executable/Supplier
为了实现这一点,assertTimeoutPreemptively()在与调用代码不同的线程中执行提供的Executable/Supplier,而assertTimeout()在同一线程中执行它。
官方文件中的警告:依赖于java.lang.ThreadLocal存储进行测试执行设置/拆卸的代码/库可能会对assertTimeoutPreemptively()产生不良副作用,因为assertTimeoutPreemptively()会在不同的线程中执行提供的语句。

ssm49v7z

ssm49v7z2#

使用org.junit.jupiter.api.Assertions中的assertTimeoutPreemptively静态Assert:

@Test
public void infinity() {
    assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
        while (true);
    });
}
6xfqseft

6xfqseft3#

除了为特定测试指定超时的其他答案(根据OP请求)之外,从JUnit 5.5开始,还可以配置全局超时,这是一个有用的选项,而不是向每个方法添加@Timeout注解。
根据JUnit 5用户指南,该指南记录了其他答案中的语法:
配置参数可用于为某个类别的所有方法指定全局超时,除非它们或包含的测试类被标注为@Timeout
例如,这将为所有可测试和生命周期方法设置500毫秒的全局超时:

junit.jupiter.execution.timeout.default = 500 ms

超时的范围可以更窄,例如,仅限@Test方法:

junit.jupiter.execution.timeout.testtemplate.method.default = 500 ms

如果使用其他答案中描述的@Timeout注解,则它将覆盖这些默认值。

相关问题