我有一个有点大的多模块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使用的类路径中。我没有办法做到这一点。
或者,我看到“工具”目标有一个“包含”配置元素。我应该为每个当前模块所依赖的模块指定所有“目标/类”目录的路径吗?
我想我会用几个中期战略解决这个问题:1.虽然我们使用的是与离线仪器仪表PowerMock,接受模块“foo”的单元测试将只显示覆盖该模块,2.写单元不被覆盖类的其他模块的测试,3.更换迫使PowerMock的用途使用一个工厂,然后更改这些测试使用和的Mockito在线仪表的一种机制。 –