You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让JUnit5指定测试类按顺序执行,其余测试并行?

解决方案

1. 拆分Surefire执行阶段,混合串行与并行

通过配置Surefire的多执行阶段,先串行跑指定的两个测试类,再并行执行其余测试,完美匹配你的需求:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.2.5</version>
    <executions>
        <!-- 第一阶段:串行执行需要顺序的测试类 -->
        <execution>
            <id>run-sequential-tests</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <includes>
                    <include>**/TestClassA.java</include>
                    <include>**/TestClassB.java</include>
                </includes>
                <parallel>none</parallel>
                <forkCount>1</forkCount>
            </configuration>
        </execution>
        <!-- 第二阶段:并行执行剩余所有测试 -->
        <execution>
            <id>run-parallel-tests</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <excludes>
                    <exclude>**/TestClassA.java</exclude>
                    <exclude>**/TestClassB.java</exclude>
                </excludes>
                <parallel>classes</parallel>
                <forkCount>4</forkCount> <!-- 可根据CPU核心数调整 -->
                <reuseForks>true</reuseForks>
            </configuration>
        </execution>
    </executions>
</plugin>

2. 用测试套件控制顺序,配合并行配置

创建一个测试套件指定两个类的执行顺序,再让Surefire分开执行套件和其余并行测试:

  • 编写JUnit 5测试套件:
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({TestClassA.class, TestClassB.class})
public class SequentialTestSuite {
}
  • 对应Surefire配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.2.5</version>
    <executions>
        <execution>
            <id>run-sequential-suite</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <includes>
                    <include>**/SequentialTestSuite.java</include>
                </includes>
                <parallel>none</parallel>
            </configuration>
        </execution>
        <execution>
            <id>run-parallel-tests</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <excludes>
                    <exclude>**/SequentialTestSuite.java</exclude>
                    <exclude>**/TestClassA.java</exclude>
                    <exclude>**/TestClassB.java</exclude>
                </excludes>
                <parallel>classes</parallel>
                <forkCount>4</forkCount>
            </configuration>
        </execution>
    </executions>
</plugin>

如果用JUnit 4,套件换成@RunWith(Suite.class)和@SuiteClasses注解即可。

3. 排查批量失败的核心原因

批量跑失败但单个执行正常,90%是测试间状态污染:

  • 检查两个测试类是否依赖同一静态变量、数据库连接、文件资源等共享数据
  • 在@AfterEach/@AfterAll方法中强制重置资源,比如清空静态缓存、关闭数据库连接池
  • 可给这两个类加@Isolated注解(JUnit 5),让Surefire为它们单独分配进程,彻底隔离环境

内容的提问来源于stack exchange,提问作者user19128690

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:35:24