surefire的forkMode“永远不会”在Maven 3下使用cobertura吗?

时间:2012-06-13 07:53:22

标签: maven-3 cobertura maven-surefire-plugin

从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

1 个答案:

答案 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)