从 Maven 2 切换到 Maven 3 后,我发现 cobertura 报告的测试覆盖率为 0%。我已经提出了关于使用哪个版本的 cobertura 和 Surefire 的问题:What versions of cobertura and surefire plugins work together under maven3?
但是,我更深入地调查了问题,并发现配置片段的哪些部分不起作用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire.plugin.version}</version>
<configuration>
<forkMode>never</forkMode>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<argLine>-Xmx512m -XX:MaxPermSize=256m</argLine>
</configuration>
</plugin>
将 forkMode 从 never
更改为 once
后,开始生成测试覆盖率。所以,问题不是插件版本不兼容本身,而是maven 3下surefire by cobertura的各种fork模式的支持问题。
所以,我的问题是,这是一个错误,还是 cobertura 插件的设计方式使其无法与某些 forkMode=never
一起使用?
最佳答案
Cobertura 旨在在 JVM 退出时输出覆盖率结果。
<forkMode>never</forkMode>
指示 Maven 不要 fork JVM 来运行测试,而是重新使用当前的 JVM。
在这种情况下,覆盖率结果可能要等到 Maven 执行完成后才能输出。
在 Maven 2 中,我不是 100% 确定,但我认为 cobertura 插件使用的 fork 生命周期(邪恶的)工作方式导致了 fork 生命周期的 JVM fork ,或者类加载器卸载有效地导致了相同的结果。
因此,在我看来,覆盖范围恰好与 <forkMode>never</forkMode>
一起工作是 Maven 2 的一个错误。 .
注意: <forkMode>never</forkMode>
被认为是相当危险的,因为系统属性的范围不是每个类加载器的范围等。 <forkMode>once</forkMode>
通常是最好的选择(除非您的测试滥用内存 - 某些版本的 JUnit 将所有测试类实例保留在内存中,直到运行结束时报告,因此如果每个测试类都持有重对象,GC 将无法在测试运行结束之前清除它们。在这种情况下,将需要 perclass/always forkMode)
关于maven-3 - Surefire 的 forkMode 'never' 是否可以在 Maven 3 下与 cobertura 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11010428/