我的多模块Maven项目有些大。我在Jacoco处理的每个模块中进行了单位测试。我有一个单独的儿童模块进行"合并"one_answers"报告 - 聚集",这似乎正在生成数据。我什至在Sonarqube中使用生成的数据。我的大多数测试都使用PowerMock,我正在使用离线仪器。
但是,在仔细查看覆盖范围数据之后,我看到它正在遗漏我知道在测试中正在执行的类和方法的覆盖范围数据。我在每个模块中看到的模式是,它仅报告每个模块中单个类的覆盖范围,这是当前模块中实际上的类。几乎所有的测试也呼吁构建中其他模块中的其他类别,并且从未报告过这些类别的覆盖范围。
以下插件配置在每个子模块使用的父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结果时,我发现它仅报告当前模块中单个类的结果,而不是其他模块中类的数据。由此,我假设我如何在单独的子模块中进行"合并"one_answers"报告混合"可能与此问题无关。
生成的" jacoco.exec"文件是二进制文件,但我尝试从一个模块中" cat cat"一个模块以查看ASCII文本可见,并且仅显示一个看起来像文件名的任何事物,并且这是该模块的HTML覆盖报告中唯一报告的文件名。
我不确定我还能报告哪些其他信息。
更新:
我想我现在可以清楚地看到,当SureFire运行单元测试时,它会使用当前模块中的仪器类,但是从Maven the Maven trifacts中使用了未启发的类。这就是为什么我只看到当前模块中的课程的覆盖范围。
因此,似乎我需要一种方法来指定每个模块所依赖的每个模块的"目标/生成类/jacoco"文件夹,并将其固定到SureFire使用的类Pather。我看不到这样做的方法。
另外,我看到"仪器"目标具有"包含"配置元素。我是否应该为当前模块依赖的每个模块的所有"目标/类"目录指定路径?
录制某些类的代码覆盖范围需要其仪器。目标instrument
执行当前模块类别的仪器。
所有测试都会召集其他模块中的其他类别
所以那些没有仪器的人。如果我正确理解,那么正是您缺少覆盖范围的那些。
如果您不将PowerMock用于来自其他模块的类,而仅用于当前模块中的类,则可以将离线仪器与即时使用代理结合使用。但是在这种情况下,请确保代理商明确将仪器的类仪器脱机从仪器中排除在外,否则代理人将抛出IllegalStateException: Class ... is already instrumented
。
如果您将PowerMock用于来自其他模块的类,则由于Maven的严格性在使用类Path和依赖性的操作方面,这将变得更加复杂。而且我怀疑使用一个mvn
COMAND可以轻松实现这一点,但是使用更多信息:
- 仪器和运行测试,但不要使用
restore-instrumented-classes
- 还原类并生成报告
不幸的是,您尚未提供完整的示例(https://stackoverflow.com/help/mcve),我没有时间准备完整的示例来立即测试此方法。
作为旁注:无法简单地使用代理来自PowerMock绕过任何代理并从磁盘读取类文件的事实。