2017-02-17 41 views
1

我有一个有点大的多模块Maven项目。我在Jacoco处理的每个模块中都有单元测试。我有一个单独的子模块做“合并”和“报告聚合”,这似乎是生成数据。我甚至在SonarQube中使用生成的数据。我的大多数测试都使用PowerMock,而我正在使用脱机工具。jacoco只显示同一模块中的类的覆盖率

但是,在仔细观察覆盖率数据之后,我发现它正在遗漏覆盖范围数据,以了解我在测试期间执行的类和方法。我在每个模块中看到的模式是,它只报告每个模块中的单个类的覆盖范围,这是实际在当前模块中的类。几乎所有的测试都会调用构建中其他模块中的其他类,并且这些类的覆盖率从不报告。

以下插件配置在各子模块使用的父POM:

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

当我检查每个模块生成的HTML结果,我发现,它仅报告在单一流的成果当前模块,而不是其他模块中类的数据。从这个角度来看,我会假设我如何在单独的子模块中进行“合并”和“报告聚合”可能与此问题无关。

生成的“jacoco.exec”文件是二进制文件,但我试图从一个模块中“捕捉”一个文件,以查看哪些ascii文本是可见的,并且只显示了一个看起来像文件名的文件,它是该模块的HTML覆盖率报告中唯一报告的文件名。

我不确定我可以报告的其他信息。

更新

我想我可以看到很清楚,现在当万无一失运行单元测试,它采用了仪表类从目前的模块,但桩的类都是从行家文物。这就是为什么我只看到当前模块中的类的覆盖率。

因此,看起来我需要一种方法来指定当前模块所依赖的每个模块的“target/generated-classes/jacoco”文件夹,该文件夹被保存到了surefire使用的类路径中。我没有办法做到这一点。

或者,我看到“工具”目标有一个“包含”配置元素。我应该为每个当前模块所依赖的模块指定所有“目标/类”目录的路径吗?

回答

0

记录某些类的代码覆盖率需要使用其工具。目标instrument执行当前模块的类的检测。

所有测试的其他模块

,以便不仪器的那些还调用其他类。如果我正确理解,那么你正是错过了覆盖面。

如果您不使用PowerMock作为来自其他模块的类,但仅适用于当前模块中的类,那么您可以将脱机检测与动态使用代理结合使用。但在这种情况下,请确保脱机检测的代码被代理明确排除在仪器上,否则代理将抛出IllegalStateException: Class ... is already instrumented

如果使用PowerMock针对来自其他模块类,那么这变得更加复杂,因为在类路径和相关操作的方面的Maven的严格。我怀疑,这可以用一个mvn COMAND可以轻松实现,但似乎有可能使用更多:

  1. 仪器和运行测试,但不使用restore-instrumented-classes
  2. 恢复类和生成报告(S)

可惜你没有提供完整的示例(https://stackoverflow.com/help/mcve)和我没有时间来准备完整的例子,现在来测试这种方法。

补充说明:不能简单地用剂来自于PowerMock绕过任何代理,并从磁盘中读取类文件的事实。

+0

我想我会用几个中期战略解决这个问题:1.虽然我们使用的是与离线仪器仪表PowerMock,接受模块“foo”的单元测试将只显示覆盖该模块,2.写单元不被覆盖类的其他模块的测试,3.更换迫使PowerMock的用途使用一个工厂,然后更改这些测试使用和的Mockito在线仪表的一种机制。 –

相关问题