JUnit 并行执行有七八个配置项,它们的相互作用并不直观。这篇用 16 个真实的测试,把动态与固定并行度、类并发与方法并发、@ResourceLock / @Isolated / SAME_THREAD、I/O 型与 CPU 型测试对总时间的影响逐项量出来。
[默认(没有启用并行)] 测试 16 个,JUnit 报告的运行时间 4966 ms [enabled=true + mode.default=concurrent(mode.classes.default 没设,继承 mode.default),动态并行度] 测试 16 个,JUnit 报告的运行时间 670 ms [enabled=true + 显式写出两者都是 concurrent(动态并行度,factor = 1.0)] 测试 16 个,JUnit 报告的运行时间 669 ms [只有类并发:mode.default=same_thread,mode.classes.default=concurrent] 测试 16 个,JUnit 报告的运行时间 1288 ms [fixed 并行度 1] 测试 16 个,JUnit 报告的运行时间 5002 ms [fixed 并行度 2] 测试 16 个,JUnit 报告的运行时间 2524 ms [fixed 并行度 4] 测试 16 个,JUnit 报告的运行时间 1288 ms [fixed 并行度 8] 测试 16 个,JUnit 报告的运行时间 665 ms [fixed 并行度 16] 测试 16 个,JUnit 报告的运行时间 360 ms
[默认(串行)] 测试 16 个,JUnit 报告的运行时间 4876 ms [fixed 并行度 4] 测试 16 个,JUnit 报告的运行时间 1336 ms [fixed 并行度 10] 测试 16 个,JUnit 报告的运行时间 834 ms [fixed 并行度 16] 测试 16 个,JUnit 报告的运行时间 795 ms
[对照:16 个 I/O 测试,fixed 并行度 16] 测试 16 个,JUnit 报告的运行时间 361 ms
[16 个测试都加 @ResourceLock("db"),fixed 并行度 16] 测试 16 个,JUnit 报告的运行时间 5005 ms
[4 个并发的类 + 1 个 @Isolated 的类(只有 1 个 300 ms 的测试),fixed 并行度 16] 测试 17 个,JUnit 报告的运行时间 676 ms
[SameThreadClass:@Execution(SAME_THREAD) 的类,4 个测试,fixed 并行度 16] 测试 4 个,JUnit 报告的运行时间 1282 ms
[4 个并发的类 + 1 个 SAME_THREAD 的类] 测试 20 个,JUnit 报告的运行时间 1303 ms[默认(串行)] 完成 16 个测试,实际用到的线程数 1:[main] [fixed 并行度 4] 完成 16 个测试,实际用到的线程数 4:[FJP-worker-1, FJP-worker-2, FJP-worker-3, FJP-worker-4] [fixed 并行度 16] 完成 16 个测试,实际用到的线程数 16:[FJP-worker-1, FJP-worker-10, FJP-worker-11, FJP-worker-12, FJP-worker-13, FJP-worker-14]…