maven-3 - Surefire 的 forkMode 'never' 是否可以在 Maven 3 下与 cobertura 一起使用?

标签 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下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/

相关文章:

jenkins - 无法执行目标 org.apache.maven.plugins :maven-deploy-plugin:2. 7:在项目上部署默认部署

java - 我可以在不安装的情况下向 maven 3 添加插件吗

Grails/Cobertura报告-有条件覆盖没有意义

java - 非法访问错误 :class <classname> cannot access its superinterface <interfacename>

python - 如何使用 nosetests 输出覆盖率 XML?

Jenkins:不可解析的父 POM:

java - 如何获取 pom 文件的完全解析模型?

maven - Hamcrest 1.3 和 JUnit 4.11 的 NoSuchMethodError

java - Maven surefire 和 JDK 11

maven - JaCoCo 报道缺失