maven-surefire-plugin 2.22.1无法执行全部测试的解决方案求助
解决Maven Surefire 2.22+版本仅运行部分测试的问题
从你描述的情况来看,核心问题是Surefire插件从2.20升级到2.22.1后,默认的测试类扫描规则或执行逻辑发生了变化,导致部分测试(比如单元、集成测试)未被纳入执行范围。以下是针对性的排查和解决步骤:
1. 确认测试类命名是否符合默认规则
Surefire 2.22.0及以后版本,默认只扫描并执行符合以下命名模式的测试类:
**/Test*.java**/*Test.java**/*Tests.java**/*TestCase.java
如果你的单元测试、集成测试类命名不在这个范围内(比如叫*IntegrationTest.java、*ServiceTest.java这种后缀不是Test/Tests/TestCase的),就会被默认跳过。
2. 显式配置Surefire的测试类匹配规则
如果测试类命名无法统一成默认模式,直接在插件配置里添加所有需要执行的测试类匹配规则:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> <configuration> <includes> <!-- 保留默认规则 --> <include>**/Test*.java</include> <include>**/*Test.java</include> <include>**/*Tests.java</include> <include>**/*TestCase.java</include> <!-- 添加你的其他测试类模式,比如集成测试、单元测试 --> <include>**/*IntegrationTest.java</include> <include>**/*UnitTest.java</include> <!-- 如果有其他自定义命名的测试类,也加在这里 --> </includes> </configuration> </plugin> </plugins> </build>
3. 检查是否使用了测试分类注解
如果你的测试用@Category注解做了分类(比如标记了UnitTest、IntegrationTest等),Surefire默认不会执行所有分类,需要显式指定要运行的分组:
<configuration> <!-- 替换成你实际的分类类路径 --> <groups>com.example.tests.Unit,com.example.tests.Integration,com.example.tests.Smoke,com.example.tests.Mock</groups> </configuration>
4. 查看Surefire执行日志定位问题
如果上面的方法都没解决,运行以下命令查看详细日志:
mvn test -X
在日志里找Included tests:和Excluded tests:的部分,就能明确看到哪些测试类被选中、哪些被排除,进而精准调整配置。
5. 排除其他干扰因素
- 检查pom.xml里有没有全局的
skipTests或maven.test.skip配置设为true; - 确认命令行执行
mvn test时没有加-DskipTests或-Dmaven.test.skip=true参数; - 检查测试类是否存在编译错误,编译失败的类不会被执行。
内容的提问来源于stack exchange,提问作者Alen Siilivask
相关产品推荐
相关产品推荐

