在 JUnit 4 中,“timeout”注释参数可用于强制测试在给定时间后停止:
@Test(timeout=100)
public void infinity() {
while(true);
}
在 JUnit 5 中如何做到这一点?
与(以及摘自的代码)密切相关注释类型测试的超时参数 https://stackoverflow.com/questions/7015032/timeout-parameter-for-annotation-type-test,但对于 JUnit 5。
严格等价于timeout
属性是声明性的@Timeout
注解。
来自 JUnit 5 文档 https://junit.org/junit5/docs/current/user-guide/#writing-tests-declarative-timeouts :
The @Timeout
注释允许声明一个测试、测试
工厂、测试模板或生命周期方法应该失败,如果
执行时间超过给定的持续时间。时间单位为
持续时间默认为秒,但可以配置。
例如 :
@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void infinity() {
// fails if execution time exceeds 100 milliseconds
//...
}
Assertions.assertTimeout() https://junit.org/junit5/docs/5.7.2/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html#assertTimeout(java.time.Duration,org.junit.jupiter.api.function.Executable) and Assertions.assertTimeoutPreemptively() https://junit.org/junit5/docs/5.7.2/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html#assertTimeoutPreemptively(java.time.Duration,org.junit.jupiter.api.function.Executable)是 JUnit 5 中引入的新概念(JUnit 4 中不存在)。
这些是替代品@Timeout
将超时范围缩小到一组特定的语句:这些语句在Executable
或在Supplier
作为参数传递。
这两种方法(名称非常接近)实现相同的总体目标,但有细微的差别。
assertTimeoutPreemptively()
先发制人地中止Executable/Supplier
如果超时发生assertTimeout()
才不是。
为了实现它,assertTimeoutPreemptively()
执行提供的Executable/Supplier
在与调用代码不同的线程中assertTimeout()
在同一个线程中执行它。
官方文档的警告:
依赖的代码/库java.lang.ThreadLocal
测试执行设置/拆卸的存储可能会产生不良副作用assertTimeoutPreemptively()
因为它会在不同的线程中执行提供的语句。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)