在JUnit 4中,“超时”注释参数可用于强制测试在给定的时间后停止:
@Test(timeout=100)
public void infinity() {
while(true);
}
Run Code Online (Sandbox Code Playgroud)
如何在JUnit 5中完成?
使用assertTimeoutPreemptively
静态断言org.junit.jupiter.api.Assertions
:
@Test
public void infinity() {
assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
while (true);
});
}
Run Code Online (Sandbox Code Playgroud)
该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
将超时范围缩小到一组特定语句的替代方法:这些语句在Executable
或Supplier
传递为as参数中定义。
这两种方法(名称非常接近)解决了相同的总体目标,但存在细微差别。如果超时发生而没有发生,则
assertTimeoutPreemptively()
抢先中止。
为此,请在与调用代码不同的线程中执行提供的内容,而在同一线程中执行它。 Executable/Supplier
assertTimeout()
assertTimeoutPreemptively()
Executable/Supplier
assertTimeout()
官方文档中的警告:依赖于java.lang.ThreadLocal
存储进行测试执行设置/拆卸的代码/库可能会带来不良的副作用,assertTimeoutPreemptively()
因为它将在不同的线程中执行提供的语句。
归档时间: |
|
查看次数: |
436 次 |
最近记录: |