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

A J*_*lay 2 java junit junit5

在JUnit 4中,“超时”注释参数可用于强制测试在给定的时间后停止:

@Test(timeout=100)
public void infinity() {
   while(true);
}
Run Code Online (Sandbox Code Playgroud)

如何在JUnit 5中完成?

注释类型测试(但对于JUnit 5 )的超时参数密切相关(并且取自代码)。

A J*_*lay 7

使用assertTimeoutPreemptively静态断言org.junit.jupiter.api.Assertions

@Test
public void infinity() {
    assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
        while (true);
    });
}
Run Code Online (Sandbox Code Playgroud)


dav*_*xxx 6

timeout属性的严格等效项是声明性@Timeout注释。
从JUnit 5文档中

@Timeout如果执行时间超过给定的持续时间,则注释可以使人声明测试,测试工厂,测试模板或生命周期方法应该失败。持续时间的时间单位默认为秒,但可以配置。

例如 :

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

Assertions.assertTimeout()Assertions.assertTimeoutPreemptively()是在5 JUnit的引入的新概念(未JUnit 4中存在的)。这些是@Timeout将超时范围缩小到一组特定语句的替代方法:这些语句在ExecutableSupplier传递为as参数中定义。
这两种方法(名称非常接近)解决了相同的总体目标,但存在细微差别。如果超时发生而没有发生,则
assertTimeoutPreemptively() 抢先中止。 为此,请在与调用代码不同的线程中执行提供的内容,而在同一线程中执行它。 Executable/SupplierassertTimeout()
assertTimeoutPreemptively()Executable/SupplierassertTimeout()

官方文档中的警告:依赖于java.lang.ThreadLocal存储进行测试执行设置/拆卸的代码/库可能会带来不良的副作用,assertTimeoutPreemptively()因为它将在不同的线程中执行提供的语句。