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

如何限制maven-surefire-plugin仅运行特定测试源根的测试?

解决Maven多测试源根下指定目录运行测试的问题

核心方案

通过Maven配置文件(Profile)结合build-helper-maven-plugin管理多测试源,再针对不同Profile配置maven-surefire-plugin的筛选规则,或者直接在Profile中覆盖测试源目录,实现仅运行指定测试根的用例。

具体实现步骤

1. 先配置多测试源根

用build-helper-maven-plugin将多个测试目录(比如src/test/A和src/test/B)添加为项目的测试源:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <id>add-test-sources</id>
                    <phase>generate-test-sources</phase>
                    <goals>
                        <goal>add-test-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>src/test/A</source>
                            <source>src/test/B</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2. 创建对应Profile实现精准筛选

在profiles节点下定义两个Profile,分别对应只运行目录A或B的测试:

方案一:基于编译后路径筛选(编译所有测试类,仅运行指定目录的用例)

<profiles>
    <profile>
        <id>only-tests-in-directory-A</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.1.2</version>
                    <configuration>
                        <!-- 匹配src/test/A下所有包的测试类编译后路径 -->
                        <includes>
                            <include>**/a/**/*.class</include>
                        </includes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

    <profile>
        <id>only-tests-in-directory-B</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.1.2</version>
                    <configuration>
                        <includes>
                            <include>**/b/**/*.class</include>
                        </includes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

提示:这里的路径匹配需要对应测试类编译后的实际位置。比如src/test/A下的com/example/TestA.java,编译后会在target/test-classes/com/example/TestA.class,你需要根据实际包结构调整includes的匹配规则,确保只命中目标目录的测试类。

方案二:仅编译指定测试目录(节省编译时间)

如果不想编译所有测试源,可在Profile中直接覆盖testSourceDirectory,同时禁用build-helper-maven-plugin的多源添加:

<profiles>
    <profile>
        <id>only-tests-in-directory-A</id>
        <build>
            <testSourceDirectory>src/test/A</testSourceDirectory>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>add-test-sources</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

    <profile>
        <id>only-tests-in-directory-B</id>
        <build>
            <testSourceDirectory>src/test/B</testSourceDirectory>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>add-test-sources</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

3. 运行测试

执行对应Profile即可:

# 仅运行src/test/A下的测试
mvn test -P only-tests-in-directory-A

# 仅运行src/test/B下的测试
mvn test -P only-tests-in-directory-B

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:30:57