[英]How to fail a test after a timeout is exceeded in JUnit 5?
在 JUnit 4 中,“timeout”注释参数可用于强制测试在给定时间后停止:
@Test(timeout=100)
public void infinity() {
while(true);
}
这如何在 JUnit 5 中完成?
与Annotation Type Test 的超时参数(和代码取自)密切相关,但对于 JUnit 5。
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
的替代方案,可将超时缩小到一组特定的语句:这些语句在Executable
或作为参数传递的Supplier
中定义。
这两种方法(名称非常接近)解决了相同的总体目标,但存在细微差别。
如果发生超时而assertTimeout()
没有发生超时,assertTimeoutPreemptively( assertTimeoutPreemptively()
会抢先中止Executable/Supplier
。
为了实现它, assertTimeoutPreemptively()
在与调用代码不同的线程中执行提供的Executable/Supplier
,而assertTimeout()
在同一个线程中执行它。
来自官方文档的警告:依赖于java.lang.ThreadLocal
存储进行测试执行设置/拆卸的代码/库可能会对assertTimeoutPreemptively()
产生不良副作用,因为它会在不同的线程中执行提供的语句。
使用来自org.junit.jupiter.api.Assertions
的assertTimeoutPreemptively
静态断言:
@Test
public void infinity() {
assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
while (true);
});
}
除了为特定测试(根据 OP 请求)指定超时的其他答案之外,从 JUnit 5.5 开始,还可以配置全局超时,这是一个有用的选项,而不是为每个方法添加@Timeout
注释。
根据JUnit 5 User Guide ,其中记录了其他答案中的语法:
配置参数可用于为某个类别的所有方法指定全局超时,除非它们或封闭的测试类使用 @Timeout 注释
例如,这将为所有可测试和生命周期方法设置 500 毫秒的全局超时:
junit.jupiter.execution.timeout.default = 500 ms
超时的范围可以更窄,例如只是@Test
方法:
junit.jupiter.execution.timeout.testtemplate.method.default = 500 ms
如果使用其他答案中描述的@Timeout
注释,它将覆盖这些默认值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.