如何让JaCoCo在Maven项目测试失败时仍生成代码覆盖率报告?
问题:Maven+JaCoCo环境下,测试失败时无法生成覆盖率报告
我在VS Code中开发Java项目,采用Maven作为构建框架,已配置JaCoCo用于生成单元测试代码覆盖率报告,执行的命令是:
mvn jacoco:prepare-agent test install jacoco:report -X
但当存在至少一个失败测试时,代码覆盖率报告无法生成,报错信息如下:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.2.2:test (default-test) on project <REDACTED> There are test failures. [ERROR] [ERROR] Please refer to <REDACTED>/target/surefire-reports for the individual test results. [ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
我曾查阅类似问题,大多针对Android/Gradle环境,或建议使用-Djacoco.haltOnFailure=false参数,尝试执行以下命令后仍无效:
mvn jacoco:prepare-agent test install -Djacoco.haltOnFailure=false jacoco:report -X
请问如何让JaCoCo忽略测试失败,正常生成覆盖率报告?
解决方法
核心原因:测试失败时Maven的
test阶段直接终止流程,导致后续的jacoco:report目标根本没机会执行。-Djacoco.haltOnFailure=false是控制JaCoCo本身是否因收集数据失败终止,而非控制Maven是否忽略测试失败。方法1:命令行添加参数忽略测试失败
在命令中添加Surefire插件的参数-Dmaven.test.failure.ignore=true,这个参数会让Maven在测试失败后继续执行后续阶段。修改后的命令:mvn jacoco:prepare-agent test install jacoco:report -X -Dmaven.test.failure.ignore=true方法2:在pom.xml中配置Surefire插件
如果不想每次命令都加参数,可以直接在项目的pom.xml中配置Surefire插件,设置忽略测试失败:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.2</version> <configuration> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> </plugins> </build>配置后,直接执行原来的命令即可,测试失败时Maven会继续走流程生成覆盖率报告。
额外提示
- 如果测试失败后不需要将构件安装到本地仓库,可以去掉命令中的
install阶段,简化为mvn jacoco:prepare-agent test jacoco:report -X -Dmaven.test.failure.ignore=true - 忽略测试失败后,测试失败的详细结果依然会保存在
target/surefire-reports目录中,不会丢失相关信息
- 如果测试失败后不需要将构件安装到本地仓库,可以去掉命令中的
内容的提问来源于stack exchange,提问作者Calseon
相关产品推荐
相关产品推荐

