← 中文资源

简体中文版本

Maven BUILD FAILURE — surefire 测试目标失败

通过区分编译错误、断言失败与环境问题,阅读 Maven surefire 失败信息并重跑或定向到失败测试。

阅读英文原文

症状

错误“Maven BUILD FAILURE — surefire 测试目标失败”指向一个明确的失效模式。下面依次给出症状、定位该原因的检查命令、根本原因、修复方案,以及证明修复有效的验证步骤。

可观察到的症状包括:

  • mvn test 以 “BUILD FAILURE” 与 “[ERROR] Failed to execute goal … surefire …” 结束
  • 单个测试通过,全量运行却失败
  • 报告只显示某个类中的失败

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

mvn -q test 2>&1 | grep -E "Tests run|FAIL|ERROR" | head -20

摘要会区分 error 与 failure,并指向报告目录。

步骤 2

mvn -Dtest=OrderServiceTest#rejectsNegativeTotal test

复现单个测试可把逻辑问题与顺序或环境因素分开。

步骤 3

grep -rn "The forked VM terminated\|Corrupted STDOUT" target/surefire-reports

该消息表示 surefire 与 JVM 失联;应提高派生内存或设置 reuseForks=false。

常见诱因(按出现频率排序):

  • 某测试的断言失败导致构建中止
  • 派生 JVM 内存不足或超时
  • 测试依赖执行顺序或共享静态状态

根因

surefire 插件会派生 JVM 运行测试,任何 failure 或 error 都会使构建失败。失败分三类:断言不匹配、JVM 崩溃(fork 错误)与环境/顺序依赖,各自报告方式不同。

修复

修正真实断言,隔离依赖顺序的测试(独立夹具、无共享静态状态),并调整 surefire 的派生与内存配置。仅在诊断时用 -Dmaven.test.failure.ignore,切勿在 CI 使用。

注意:用 -DskipTests 跳过测试会掩盖回归;跳过编译与跳过执行含义不同,需明确所需。

<!-- pom.xml: isolate each test class in its own JVM -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.2.5</version>
  <configuration>
    <reuseForks>false</reuseForks>
    <argLine>-Xmx1g</argLine>
  </configuration>
</plugin>

# run a single test
mvn -Dtest=OrderServiceTest#rejectsNegativeTotal test

验证

重新运行完整测试阶段,确认 BUILD SUCCESS 且 Tests run 数符合预期;确保各类报告零 failure 零 error。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。