【问题标题】:Maven runs unit tests twice with clover pluginMaven 使用 clover 插件运行单元测试两次
【发布时间】:2013-03-25 14:53:12
【问题描述】:

我的 pom.xml 中有这个插件代码。如果我删除这个插件,那么 Maven 将不会运行两次单元测试。我只是想知道这个插件的哪一部分使单元测试运行两次。

<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-clover2-plugin</artifactId>
    <version>3.0.4</version>
    <configuration>
        <licenseLocation>/location/to/clover.license</licenseLocation>
        <generateXml>true</generateXml>
        <generateHtml>true</generateHtml>
    </configuration>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>instrument</goal>
            </goals>
        </execution>
        <execution>
            <id>main</id>
            <phase>verify</phase>
            <goals>
                <goal>instrument</goal>
                <goal>aggregate</goal>
                <goal>clover</goal>
            </goals>
        </execution>
        <execution>
            <id>site</id>
            <phase>pre-site</phase>
            <goals>
                <goal>instrument</goal>
                <goal>aggregate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

【问题讨论】:

    标签: maven clover


    【解决方案1】:

    clover 插件使用检测的类路径将生命周期分叉到test 阶段。

    您的标准生命周期将运行测试(通常在test 阶段使用surefire,但在该阶段可能有多个执行或其他测试插件调用测试)

    然后三叶草出现并要求他们再次运行。

    现在是我的标准警告:

    • 代码覆盖修改字节码,该字节码以 JVM 规范下的合法方式执行。
    • 此类转换可能会导致在更新覆盖图时添加同步点。
    • 此类额外的同步点可能会限制 JVM 能够执行的操作的重新排序。
    • 还有其他与线程无关的更改,但解释起来相当复杂。

    如果您只在打开覆盖率的情况下运行测试用例,则不能相信 100% 的通过率,因为覆盖率可以掩盖错误

    相反,如果您从未在覆盖打开的情况下运行,那么 JVM 架构中的任何更改都会突出您不知道的新错误。

    • 测试通过和不打开覆盖 => 可能没问题

    • 打开覆盖时测试通过,关闭时失败 => 注意,这里有错误

    • 在关闭覆盖的情况下通过测试,打开时失败 => 如果测试不是计时关键,则此处出现错误,但如果测试在生产环境中运行,错误可能仅在 -server 完全优化热路径时显示

    • 无论是否开启覆盖,测试都失败 => 错误

    “斯蒂芬的黄金法则:Just run the damn tests twice

    【讨论】:

    • 这是 Clover 特有的吗?还是所有检测工具都必须这样做?
    • 并非特定于 Clover。我的建议是运行测试两次,但人们可以而且确实忽略了这个建议(后果自负)。 JavaCoCo 可能是最容易配置的,只运行一次测试......尽管我提到了所有风险
    【解决方案2】:

    您使用的 clover2:instrument 目标的工作方式是分叉并行构建生命周期。多亏了这一点,在构建过程中产生的所有工件(类、jar 等)都放在 /target/clover 目录中或具有 -clover.jar 后缀。这可确保您将“正常”代码(即未检测)与检测代码分开。

    如果您不需要这种分离(例如您运行“mvn test”而不是“mvn deploy”),那么我建议使用 clover2:setup 而不是 clover2:instrument。

    http://docs.atlassian.com/maven-clover2-plugin/latest/setup-mojo.html

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 2013-03-10
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多