如何限制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
相关产品推荐
相关产品推荐

