SpringIntegrationSerenityRunner与maven-surefire并行执行失效求助
Maven Surefire 单进程多线程并行测试配置
我要运行6个测试类(每个类包含6-12个测试用例),但当前的Surefire配置没能实现并行执行。试过用forkCount能实现并行,但多进程会让耗时的setUp方法重复执行——所有测试都依赖这个方法的返回值,所以只想用单进程内的多线程实现并行,完全避免创建新进程。
当前配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <includes> <include>**/stories/**/*.java</include> </includes> <excludes> <exclude>**/stories/Base*.java</exclude> </excludes> <testFailureIgnore>true</testFailureIgnore> <parallel>all</parallel> <threadCountClasses>2</threadCountClasses> <threadCountMethods>6</threadCountMethods> <threadCount>10</threadCount> <!--<forkCount>3</forkCount>--> <!--<useUnlimitedThreads>true</useUnlimitedThreads>--> <perCoreThreadCount>false</perCoreThreadCount> </configuration> </plugin>
解决方案:强制单进程+调整并行参数
要实现单进程内多线程并行,核心是设置forkCount=0,同时调整并行线程数参数适配测试规模:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <includes> <include>**/stories/**/*.java</include> </includes> <excludes> <exclude>**/stories/Base*.java</exclude> </excludes> <testFailureIgnore>true</testFailureIgnore> <!-- 关键:强制所有测试在主进程执行,不创建子进程 --> <forkCount>0</forkCount> <!-- 同时并行测试类和类内方法 --> <parallel>all</parallel> <!-- 同时运行的测试类数量,匹配6个测试类的规模 --> <threadCountClasses>6</threadCountClasses> <!-- 每个类内同时执行的测试方法数 --> <threadCountMethods>6</threadCountMethods> <!-- 总线程数上限,避免线程过载 --> <threadCount>12</threadCount> <perCoreThreadCount>false</perCoreThreadCount> </configuration> </plugin>
关键说明
- forkCount=0:这个参数是核心,它让所有测试在Maven的主JVM进程内运行,不会生成任何子进程,因此全局的setUp逻辑只会执行一次,所有测试类共享其返回值。
- 并行参数适配:
parallel=all表示同时并行测试类和方法;threadCountClasses设为6可以让所有测试类同时启动,threadCountMethods控制每个类内的方法并行数,threadCount设置总线程上限避免系统资源耗尽。 - 初始化逻辑优化:如果你的setUp是每个测试类的
@BeforeClass(JUnit4)或@BeforeAll(JUnit5),那每个测试类还是会执行一次初始化。这种情况下需要把初始化改成静态代码块,或者将@BeforeAll标记为static,确保在整个测试周期内只执行一次。
内容的提问来源于stack exchange,提问作者Satam Guin
相关产品推荐
相关产品推荐

