1

从 maven 2 切换到 maven 3 后,我发现 cobertura 报告的测试覆盖率为 0%。我已经提出了关于使用哪些版本的 cobertura 和 surefire 的问题:哪些版本的 cobertura 和 surefire 插件在 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 从更改neveronce测试覆盖率后开始生成。所以,问题不在于插件版本不兼容本身,而是cobertura在maven 3下对surefire的各种fork模式支持的问题。

所以,我的问题是,它是一个错误,还是 cobertura 插件是这样设计的,它不适用于一些forkMode=never

4

1 回答 1

1

Cobertura 旨在在 JVM 退出时输出覆盖结果。

<forkMode>never</forkMode>指示 Maven 不要派生一个 JVM 来运行测试,而是重新使用当前的 JVM。

在这种情况下,可能直到 Maven 执行完成后才会输出覆盖结果。

在 Maven 2 中,我不是 100% 确定的,但我认为 cobertura 插件使用的分叉生命周期(邪恶)是如何工作的,导致分叉生命周期的 JVM 分叉,或者类加载器卸载有效地产生了相同的结果。

因此,在我看来,这是 Maven 2 的一个错误,覆盖范围恰好可以使用<forkMode>never</forkMode>

注意: <forkMode>never</forkMode>被认为是非常危险的,因为系统属性不是每个类加载器的范围,以及其他问题。<forkMode>once</forkMode>通常是最好的选择(除非您有滥用内存的测试 - 某些版本的 JUnit 将所有测试类实例保留在内存中,直到在运行结束时报告,所以如果每个测试类都持有重物,GC 将无法在测试运行结束之前清除它们。在这种情况下,将需要 perclass/always forkMode)

于 2012-08-14T12:18:18.117 回答