@RepeatedTest用于让测试方法重复执行指定次数,支持通过RepetitionInfo获取当前序号和总次数,name属性支持占位符自定义名称,每次重复独立触发生命周期,单次失败即终止全部执行。

在 JUnit 5 中,@RepeatedTest 用于让单个测试方法重复执行指定次数,适合验证稳定性、随机性或需多次触发才暴露的问题。
基本用法:指定重复次数
直接在测试方法上添加 @RepeatedTest 注解,并传入整数参数表示执行次数:
@RepeatedTest(3)
void shouldProcessItemRepeatedly() {
// 每次都会执行的逻辑
assertTrue(Math.random() > 0.0);
}
该测试会运行 3 次,每次都是独立调用,有独立的生命周期(如 @BeforeEach 也会执行 3 次)。
访问当前重复信息
可通过参数注入 RepetitionInfo 获取当前第几次执行、总次数等信息:
- 方法签名中添加
RepetitionInfo类型参数(JUnit 自动注入) - 常用方法:
getCurrentRepetition()返回从 1 开始的序号,TotalRepetitions()返回总次数
示例:
@RepeatedTest(value = 5, name = "Running {currentRepetition}/{totalRepetitions}")
void testWithRepetitionInfo(RepetitionInfo info) {
System.out.println("第 " + info.getCurrentRepetition() + " 次执行");
assertNotNull(info);
}
自定义测试名称与显示格式
name 属性支持占位符,提升可读性:
-
{displayName}:测试方法的显示名(默认为方法名) -
{currentRepetition}:当前执行序号(从 1 开始) -
{totalRepetitions}:总重复次数
例如:@RepeatedTest(value = 4, name = "[{currentRepetition}/{totalRepetitions}] {displayName}") 会在 IDE 或报告中显示为 [1/4] shouldRetryOnFailure 等。
配合生命周期和异常处理
@RepeatedTest 方法仍遵循标准生命周期规则:
-
@BeforeEach和@AfterEach每次重复都会触发 - 某次执行失败(抛出未捕获异常),整个重复测试即视为失败,其余轮次不再执行
- 若希望“容忍部分失败”,需在方法内手动捕获异常并记录,但不建议掩盖真实问题
注意:不能与 @Test 共存于同一方法,否则编译报错。


















