1. 引言

跳过测试通常不是一个好主意,但在某些特定场景下确实有用。例如在开发新功能时,阶段性构建的测试可能还未通过或无法编译,此时跳过测试可以节省时间。

当然,不运行测试可能导致代码质量下降或引入错误,所以务必谨慎使用。本篇文章将总结 Maven 中跳过测试的所有方式,包括命令行参数和配置方式。

2. Maven 生命周期简介

在深入了解跳过测试的方法之前,我们需要明确:Maven 在什么时候会编译和运行测试?

Maven 的生命周期决定了构建过程中不同阶段的行为。以 package 阶段为例,它会执行以下操作:

  1. 编译主代码 ✅
  2. 编译测试代码 ✅
  3. 执行测试代码 ✅

跳过测试主要涉及两个方面:

  • 跳过测试代码的编译(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

⚠️ 注意:跳过测试是一种“权宜之计”,不要滥用。长期跳过测试可能导致代码质量下降,甚至掩盖潜在问题。


原始标题:Skipping Tests with Maven | Baeldung