超时
重要性:★★☆☆☆
如果给一个测试方法、测试工厂方法、生命周期方法、测试模板方法添加了@Timeout
注解,那么,当测试没有在指定的时间内完成时,测试将被标识为失败。默认的时间单位是秒,但可以配置为其他时间单位。
下面是代码示例:
package yang.yu.tdd.timeout;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import java.util.concurrent.TimeUnit;
public class TimeoutDemo {
@BeforeEach
@Timeout(5)
void setUp() {
// fails if execution time exceeds 5 seconds
}
@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void failsIfExecutionTimeExceeds100Milliseconds() {
// fails if execution time exceeds 100 milliseconds
}
}
与assertTimeoutPreemptively()
断言相反,@Timeout
注解的方法的执行在测试的主线程中进行。 如果超过设定的超时时间,则主线程从另一个线程中断。 这样做是为了确保与Spring等框架的互操作性,这些框架使用了对当前运行的线程敏感的机制——例如ThreadLocal
事务管理。
通过在测试类上添加@Timeout
注解,可以对测试类中的所有测试方法、测试工厂方法、测试模板方法和嵌套测试类统一设置超时时间,除非这些方法或嵌套类上面也有加@Timeout
注解。但是,测试类上的@Timeout
注解对生命周期方法没有作用。
在测试工厂方法@TestFactory
上添加@Timeout
注解,只会对整个测试工厂方法设定超时时间,而不会针对工厂方法产生的每一个测试用例设定超时时间。如果要对后者设定超时时间,请使用assertTimeout()
或 assertTimeoutPreemptively()
断言。
如果在@TestTemplate
、@RepeatedTest
、@ParameterizedTest
等测试模板方法上添加@Timeout
注解,那么就会针对每次调用来应用超时时间。
可以在全局配置文件junit-platform.properties
上统一进行超时设置。
设置项 | 说明 |
---|---|
junit.jupiter.execution.timeout.default | 设置所有测试方法和生命周期方法的缺省超时时间 |
junit.jupiter.execution.timeout.testable.method.default | 设置所有测试方法的缺省超时时间 |
junit.jupiter.execution.timeout.test.method.default | 设置@Test 方法的缺省超时时间 |
junit.jupiter.execution.timeout.testtemplate.method.default | 设置@TestTemplate 方法的缺省超时时间(包括@RepeatedTest 和@ParameterizedTest ) |
junit.jupiter.execution.timeout.testfactory.method.default | 设置@TestFactory 方法的缺省超时时间 |
junit.jupiter.execution.timeout.lifecycle.method.default | 设置生命周期方法的缺省超时时间 |
junit.jupiter.execution.timeout.beforeall.method.default | 设置@BeforeAll 生命周期方法的缺省超时时间 |
junit.jupiter.execution.timeout.beforeeach.method.default | 设置@BeforeEach 生命周期方法的缺省超时时间 |
junit.jupiter.execution.timeout.aftereach.method.default | 设置@AfterEach 生命周期方法的缺省超时时间 |
junit.jupiter.execution.timeout.afterall.method.default | 设置@AfterAll 生命周期方法的缺省超时时间 |
更具体的配置参数会覆盖更不具体的配置参数。例如:junit.jupiter.execution.timeout.test.method.default
> junit.jupiter.execution.timeout.testable.method.default
> junit.jupiter.execution.timeout.default
上面的配置参数的值遵循下面的(不区分大小写的)格式:<number> [ns|μs|ms|s|m|h|d]
。数值和单位之间的空格会被忽略。没有指定单位等价于使用秒为单位。
例如:
参数值 | Equivalent annotation |
---|---|
42 |
@Timeout(42) |
42 ns |
@Timeout(value = 42, unit = NANOSECONDS) |
42 μs |
@Timeout(value = 42, unit = MICROSECONDS) |
42 ms |
@Timeout(value = 42, unit = MILLISECONDS) |
42 s |
@Timeout(value = 42, unit = SECONDS) |
42 m |
@Timeout(value = 42, unit = MINUTES) |
42 h |
@Timeout(value = 42, unit = HOURS) |
42 d |
@Timeout(value = 42, unit = DAYS) |
还可以配置junit.jupiter.execution.timeout.mode
参数来临时取消超时机制。这个配置参数有三个可能的取值:
enabled
:缺省模式。使超时机制生效。disabled
:使超时配置无效。disabled_on_debug
:在调试时使超时设置无效。如果有一个以agentlib:jdwp
开头的输入参数,JVM运行时就处于调试模式。
对于可能耗时很久的异步操作,@Timeout
特别有用。它可以防止由于异步操作挂起而导致的无限期等待测试完成。