如何解决JUnit 5并行测试执行会丢失测试的输出
我们有用Rest Assured和JUnit 5编写的API测试,由于这些测试之间没有依赖关系,因此我们尝试并行运行这些测试。通过设置以下内容,我们尝试了JUnit 5的实验性并行执行:
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.default=same_thread
junit.jupiter.execution.parallel.mode.classes.default=concurrent
..但是已经看到通常在测试失败时,其输出不包含在测试报告中。
这是一个已知问题吗?有什么解决方法吗?
解决方法
事实证明,问题可能实际上出在gradle对测试输出的处理上。在我们的案例中,我们通过在gradle中而不是在Junit中使用并行化来解决此问题,方法是将其添加到gradle测试任务中:
forkEvery 1
maxParallelForks 20
我不确定maxParallelForks
的最佳价值是多少。 20
就是我们刚开始的内容,并将在需要时进行调整。 Gradle docs建议根据处理器数量进行设置。 (另请参见此SO question)
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
此外,Gradle docs明确警告不要将forkEvery
设置为1
,并声称它“非常昂贵”。在我们的情况下,它运行良好,但这可能是由于Gradle在此项目中只进行了最小的设置。
一些相关的结帐链接:
- Logs from one Test class are displayed in other class's Standard output section in Gradle Test reports
- https://discuss.gradle.org/t/testng-results-overwritten-when-running-in-parallel/7530
- https://discuss.gradle.org/t/parallel-tests-in-subprojects/34978/9
- Run parallel test task using gradle
- https://discuss.gradle.org/t/relationship-between-forkevery-maxparallelfork-and-parallel/25126