测试失败时donut-maven-plugin无法生成聚合报告求助
你遇到的核心问题是:测试失败时Maven构建提前终止,导致Donut报告插件绑定的构建阶段从未执行,所以看不到任何生成报告的日志,而测试全通过时构建能顺利走到报告生成阶段。
为什么会这样?
从你的Maven日志能看到,失败来自maven-surefire-plugin:2.19:test目标,这个目标属于Maven的test阶段。Maven默认规则是:如果某个阶段的目标执行失败,会立即终止后续所有阶段的运行。而你的Donut插件绑定在post-integration-test阶段(在test阶段之后),所以当test阶段因为测试失败报错时,后续的报告生成步骤直接被跳过了。
另外还有一个小问题:你用maven-surefire-plugin运行集成测试类(Parallel*IT.class),但按照Maven规范,surefire是专门处理单元测试(命名为*Test.class)的插件,集成测试(命名为*IT.class)应该用maven-failsafe-plugin——这个插件的特性就是即使集成测试失败,也会继续执行后续构建阶段,刚好能解决你的报告生成问题。
具体解决方案
方案1:改用maven-failsafe-plugin运行集成测试(推荐)
把原来的maven-surefire-plugin配置替换为maven-failsafe-plugin,让它来处理你的Parallel*IT.class测试:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.20</version> <configuration> <forkCount>5</forkCount> <reuseForks>true</reuseForks> <includes> <include>**/Parallel*IT.class</include> </includes> <systemPropertyVariables> <deviceName>${device.name}</deviceName> <targetEnv>${target.env}</targetEnv> </systemPropertyVariables> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin>
如果项目里没有单元测试,可以直接移除原来的maven-surefire-plugin配置;如果有单元测试,保留surefire处理*Test.class即可。
这样配置后,即使集成测试失败,Maven也会继续执行到post-integration-test阶段,Donut插件就能正常生成聚合报告了。
方案2:让Maven忽略测试失败(临时应急)
如果你暂时不想更换插件,可以在运行命令时添加参数,让Maven忽略测试失败、继续执行后续阶段:
mvn clean verify -Dmaven.test.failure.ignore=true
⚠️ 注意:这种方式会让Maven最终显示BUILD SUCCESS,可能掩盖测试失败的事实,需要你自行查看测试报告确认结果。
方案3:调整Donut插件的绑定阶段
把Donut插件的绑定阶段从post-integration-test改为verify(这个阶段在测试失败前会执行):
<plugin> <groupId>report.donut</groupId> <artifactId>donut-maven-plugin</artifactId> <version>0.0.6</version> <executions> <execution> <id>execution</id> <phase>verify</phase> <!-- 修改绑定阶段 --> <goals> <goal>generate</goal> </goals> <!-- 其他配置保持不变 --> </execution> </executions> </plugin>
不过这种方式存在风险:如果测试报告还没完全生成就执行Donut,可能会导致报告不完整,所以还是优先推荐方案1。
额外验证点
- 确认测试失败时,
target/cucumber-parallel目录下确实生成了所有Cucumber JSON报告(你提到普通报告能正常生成,这一步应该没问题)。 - 检查Donut插件的
sourceDirectory配置是否正确,确保指向了包含所有JSON报告的目录。
内容的提问来源于stack exchange,提问作者user2451016

