将JaCoCo从离线更改为在线,但仍未看到其他模块中的类的覆盖范围

时间:2017-02-22 19:57:09

标签: maven jacoco jacoco-maven-plugin

我有一个较大的Maven多模块项目构建。我开始使用PowerMock进行所有测试,并使用Jacoco 0.7.8和离线仪器。

尽管这些被称为“单元测试”,但是一个模块中的类测试确实在其他模块中调用了重要的代码。因此,当我们查看生成的报告时,我们会在与测试相同的模块中看到类的覆盖范围,但是我们没有看到测试期间执行的其他模块中的类的覆盖范围。

我的假设是,如果我能够将其更改为使用在线检测,则生成的覆盖率报告将包括当前模块之外的其他模块的类。

所以,我开始着手修复我们的CUT(被测试类)中的一个细节,这需要使用PowerMock而不是Mockito(这部分非常简单)。我在每个测试和相应的CUT中逐一修复了这个问题,但是现在我只在更大的版本中的单个模块中进行了这些更改。我验证了测试的有效性,并且我可以看到EclEmma的交互式覆盖(PowerMock的另一个限制)。

jacoco-maven-plugin在所有子模块使用的父pom中配置,目前使用离线检测。最后,我要更改此父pom中的配置以使用在线检测,但我决定暂时保留它并覆盖我已完成转换的每个模块中的配置,以便该模块使用在线仪器。我相信我已经“正确地”完成了这项工作,尽管我必须使用hack来覆盖子模块中的执行列表(请记住,一旦所有这些都被转换,我将删除它们。)< / p>

当我运行构建(“clean install”)时,我看到它执行“prepare-agent”,打印生成的“argLine”值,然后稍后执行surefire,然后执行“report”目标执行,打印jacoco.exec文件的路径,我看到它显示“Analyzed bundle 'my-module-name' with 1 classes”。这似乎表明存在问题。

由于构建现已完成,然后我在浏览器中打开了“target/site/jacoco/index.html”文件,我发现它只包含当前模块的覆盖范围,只包含单个类。

同样好奇的是我在表面上检查了生成的“jacoco.exec”文件。我注意到它肯定比我以前从使用离线仪器的其他模块看到的要大。我没有办法解释文件的格式,但我确实尝试简单地“cat”文件,只是为了看看我能看到什么。我看到了在我的测试正在执行的其他模块中表示类名的字符串。

因此,似乎在线检测至少是为其他模块中的类记录数据,但结果报告没有显示。

是否可以获得此保险?

以下是“effective-pom”输出的摘录:

  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
    <executions>
      <execution>
        <id>default-instrument</id>
        <phase>none</phase>
        <goals>
          <goal>instrument</goal>
        </goals>
      </execution>
      <execution>
        <id>default-restore-instrumented-classes</id>
        <phase>none</phase>
        <goals>
          <goal>restore-instrumented-classes</goal>
        </goals>
      </execution>
      <execution>
        <id>default-report</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>report</goal>
        </goals>
      </execution>
      <execution>
        <id>prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <executions>
      <execution>
        <id>default-test</id>
        <phase>test</phase>
        <goals>
          <goal>test</goal>
        </goals>
        <configuration>
          <argLine>@{argLine} -Xmx1024m</argLine>
          <includes>
            <include>**/*Test.java</include>
          </includes>
          <systemPropertyVariables>
            <running-unit-test>true</running-unit-test>
            <jacoco-agent.destfile>...\target/jacoco.exec</jacoco-agent.destfile>
          </systemPropertyVariables>
        </configuration>
      </execution>
    </executions>
    <configuration>
      <argLine>@{argLine} -Xmx1024m</argLine>
      <includes>
        <include>**/*Test.java</include>
      </includes>
      <systemPropertyVariables>
        <running-unit-test>true</running-unit-test>
        <jacoco-agent.destfile>...\target/jacoco.exec</jacoco-agent.destfile>
      </systemPropertyVariables>
    </configuration>
  </plugin>

请注意,用于脱机检测的执行具有阶段“none”,因此不使用它们,我还设置了“jacoco-agent.destfile”属性,该属性仅用于脱机仪器

0 个答案:

没有答案