1. 引言
跳过测试通常不是一个好主意,但在某些特定场景下确实有用。例如在开发新功能时,阶段性构建的测试可能还未通过或无法编译,此时跳过测试可以节省时间。
当然,不运行测试可能导致代码质量下降或引入错误,所以务必谨慎使用。本篇文章将总结 Maven 中跳过测试的所有方式,包括命令行参数和配置方式。
2. Maven 生命周期简介
在深入了解跳过测试的方法之前,我们需要明确:Maven 在什么时候会编译和运行测试?
Maven 的生命周期决定了构建过程中不同阶段的行为。以 package
阶段为例,它会执行以下操作:
- 编译主代码 ✅
- 编译测试代码 ✅
- 执行测试代码 ✅
跳过测试主要涉及两个方面:
- 跳过测试代码的编译(skip test compilation)
- 跳过测试代码的执行(skip test execution)
我们接下来会围绕 Maven Surefire Plugin 展开说明。
3. 使用命令行参数跳过测试
3.1. 跳过测试编译
有时候我们希望完全跳过测试代码的编译过程,比如测试代码存在语法错误,导致构建失败。
示例测试代码(无法编译):
@Test
public void thisDoesntCompile() {
baeldung;
}
正常执行命令:
mvn package
输出会包含编译错误信息,如:
[ERROR] /Users/baeldung/skip-tests/src/test/java/com/antmordel/skiptests/PowServiceTest.java:[11,9] not a statement
解决方法:使用 -Dmaven.test.skip
参数:
mvn -Dmaven.test.skip package
✅ 该参数会跳过测试代码的编译和执行,适用于测试代码本身不完整或暂时不想处理的场景。
3.2. 跳过测试执行
另一种常见需求是:保留测试代码的编译过程,但跳过执行。这适用于业务逻辑改动导致测试失败,但你暂时不想修复的情况。
示例测试方法(会失败):
@Test
public void thisTestFails() {
fail("This is a failed test case");
}
执行 mvn package
后,构建会失败,提示:
[ERROR] Failures:
[ERROR] PowServiceTest.thisTestFails:16 This is a failed test case
解决方法:使用 -DskipTests
参数:
mvn -DskipTests package
✅ 该参数会编译测试代码,但不会执行。适用于测试逻辑出错但结构未变的情况。
⚠️ 补充说明:
-DskipTests
会跳过 单元测试(Surefire) 和 集成测试(Failsafe)- 如果只想跳过集成测试,使用
-DskipITs
参数更合适
⚠️ 已废弃:旧版本中还可以使用
-Dmaven.test.skip.exec
,现在不推荐使用
4. 使用 Maven 配置跳过测试
如果需要长期跳过测试(比如某些构建环境),可以通过修改 pom.xml
来实现。
4.1. 跳过测试编译
通过设置 <maven.test.skip>
属性为 true
,可以跳过测试代码的编译:
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
✅ 该配置等价于命令行中的 -Dmaven.test.skip
,但可以在 pom.xml
中统一管理。
⚠️ 可以通过命令行覆盖该配置:
mvn -Dmaven.test.skip=false package
4.2. 跳过测试执行
若希望保留测试编译,但跳过执行,可以配置 Maven Surefire Plugin:
<properties>
<tests.skip>true</tests.skip>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>${tests.skip}</skipTests>
</configuration>
</plugin>
✅ 这样配置后,除非显式指定 -Dtests.skip=false
,否则测试不会执行。
5. 总结
本文总结了 Maven 中跳过测试的多种方式,包括:
方式 | 是否编译测试 | 是否执行测试 | 命令 / 配置 |
---|---|---|---|
-Dmaven.test.skip |
❌ | ❌ | mvn -Dmaven.test.skip package |
-DskipTests |
✅ | ❌ | mvn -DskipTests package |
<maven.test.skip>true</maven.test.skip> |
❌ | ❌ | pom.xml 中配置 |
<skipTests>true</skipTests> |
✅ | ❌ | Surefire 插件配置 |
✅ 建议:
- 临时跳过:使用命令行参数
- 长期跳过:使用
pom.xml
配置 - 仅跳过集成测试:使用
-DskipITs
⚠️ 注意:跳过测试是一种“权宜之计”,不要滥用。长期跳过测试可能导致代码质量下降,甚至掩盖潜在问题。