从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下cobertura通过各种fork模式支持的问题。
所以,我的问题是,它是一个错误,还是cobertura插件是以这种方式设计的,它不适用于某些forkMode=never
?
答案 0 :(得分:1)
Cobertura旨在在JVM退出时输出覆盖率结果。
<forkMode>never</forkMode>
指示Maven不要分叉JVM来运行测试,而是重用当前的JVM。
在这种情况下,在Maven完成执行之前,可能无法输出覆盖率结果。
在Maven 2中,我不是100%肯定,但我认为cobertura插件使用的分叉生命周期(evilly)如何工作会导致分叉生命周期的JVM分支,或者有效的类加载器卸载同样的结果。
因此,在我看来,这是Maven 2的一个错误,覆盖范围恰好与<forkMode>never</forkMode>
一起使用。
注意: <forkMode>never</forkMode>
被认为是非常危险的,因为系统属性的范围不是每个类加载器的范围,以及其他问题。 <forkMode>once</forkMode>
通常是最好的选择(除非你有滥用内存的测试 - 某些版本的JUnit会将所有测试类实例保留在内存中,直到在运行结束时报告,因此如果每个测试类都持有重型对象GC将无法清除它们,直到测试运行结束。在这种情况下,将需要perclass / always forkMode)