@RepeatedTest 不是并发测试,而是多次独立执行同一逻辑的稳定性探针,用于暴露静态变量污染、共享资源误改、时间敏感逻辑异常等问题,需配合@BeforeEach隔离上下文并用RepetitionInfo做轮次校验。

直接用 @RepeatedTest 不能模拟真实高并发,它只是顺序重复执行测试方法,每次仍是单线程。但它是验证**代码在多次调用下是否稳定、无状态污染、无竞态隐患**的实用起点。
明确重复测试的本质作用
重复测试不是并发测试,而是“多次独立执行同一逻辑”的稳定性探针。它能暴露以下问题:
- 静态变量未重置导致结果累积(如计数器、缓存未清)
- 共享资源(如单例对象、全局配置)被意外修改
- 时间敏感逻辑(如
System.currentTimeMillis())在快速连续调用中行为异常 - 伪随机逻辑(如
Math.random())是否始终满足断言边界
正确写法:隔离每次执行上下文
确保每次重复都像一次全新测试,关键靠生命周期控制和状态清理:
- 用
@BeforeEach初始化对象、清空静态字段或重置 mock 行为 - 避免在测试类中声明可变静态字段;如有,必须在
@BeforeEach中显式重置 - 不依赖外部共享服务状态(如数据库、Redis),除非你已为其设计幂等或隔离机制
示例:
立即学习“Java免费学习笔记(深入)”;
@RepeatedTest(5)
@DisplayName("订单创建应始终返回非空ID")
void createOrderReturnsId() {
// 每次重复前确保环境干净
OrderService.resetCounter(); // 清理静态计数器
Order order = orderService.create(new OrderRequest("ITEM-001", 1));
assertNotNull(order.getId());
assertTrue(order.getId().length() > 5);
}配合 RepetitionInfo 做针对性校验
通过注入 RepetitionInfo 获取当前轮次,可用于分阶段验证或日志追踪:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 打印执行序号,便于排查哪一轮失败
- 在第1轮做初始化断言,后续轮次跳过耗时操作
- 对偶数轮次施加额外约束(如要求耗时低于阈值)
示例:
立即学习“Java免费学习笔记(深入)”;
@RepeatedTest(value = 10, name = "稳定性测试 #{currentRepetition}/{totalRepetitions}")
void validateConsistentResponse(RepetitionInfo info) {
long start = System.nanoTime();
ApiResponse result = apiClient.call("/status");
long duration = System.nanoTime() - start;
<pre class="brush:php;toolbar:false;">assertEquals("OK", result.getStatus());
if (info.getCurrentRepetition() > 1) {
assertTrue(duration < 200_000_000L); // 后续轮次要求响应<200ms
}}
真正要测高并发?得另配工具
若目标是验证多线程/高并发下的线程安全,@RepeatedTest 不够用,需组合:
- 用
ExecutorService+CountDownLatch手动构造并发场景 - 引入 JUnit 的
@Timeout防止死锁无限等待 - 搭配
AtomicInteger或ConcurrentHashMap记录并发访问结果 - 使用
ThreadLocal验证上下文隔离是否可靠
注意:这类并发测试建议单独拆分,不与普通单元测试混跑,避免干扰 CI 稳定性。

















