jacoco 仅显示同一模块中 类 的覆盖率
jacoco only shows coverage for classes in the same module
我有一个有点大的多模块 Maven 项目。我在 Jacoco 处理的每个模块中都有单元测试。我有一个单独的子模块执行 "merge" 和 "report-aggregate",这似乎正在生成数据。我什至在 SonarQube 中使用生成的数据。我的大部分测试都使用 PowerMock,我使用的是离线检测。
但是,在仔细查看覆盖率数据后,我发现它遗漏了 classes 和我知道在测试期间正在执行的方法的覆盖率数据。我在每个模块中看到的模式是它只报告每个模块中单个 class 的覆盖率,实际上是当前模块中的 class。几乎所有测试还调出构建中其他模块中的其他 classes,并且从未报告这些 classes 的覆盖率。
以下插件配置在各子模块使用的父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 结果时,我发现它只报告当前模块中单个 class 的结果,而不报告 class 的数据es 在其他模块中。由此,我假设我在单独的子模块中如何做 "merge" 和 "report-aggregate" 可能与这个问题无关。
生成的 "jacoco.exec" 文件是二进制文件,但我尝试 "catting" 从一个模块中取出一个,只是为了查看可见的 ascii 文本,它只显示了一次看起来像文件名,并且它是该模块的 HTML 覆盖率报告中报告的唯一文件名。
我不确定我还能报告哪些其他信息。
更新:
我想我现在可以很清楚地看到,当 surefire 运行单元测试时,它使用来自当前模块的检测 classes,但使用来自 maven 工件的未检测 classes。这就是为什么我在当前模块中只看到 classes 的覆盖范围。
所以我似乎需要一种方法来指定当前模块所依赖的每个模块的 "target/generated-classes/jacoco" 文件夹添加到 surefire 使用的 class 路径之前。我没有办法做到这一点。
或者,我看到 "instrument" 目标有一个 "includes" 配置元素。我是否应该为当前模块所依赖的每个模块指定所有 "target/classes" 目录的路径?
某些 class 的代码覆盖率记录需要其检测。目标 instrument
执行当前模块 classes 的检测。
all of the tests also call out to other classes in other modules
所以那些没有检测的。如果我理解正确,那么正是您遗漏的内容。
如果您不对来自其他模块的 classes 使用 PowerMock,而只对当前模块中的 classes 使用 PowerMock,那么您可以将离线检测与 on-the-fly 结合使用使用代理。但在这种情况下,请确保 classes 离线检测被代理明确排除在检测之外,否则代理将抛出 IllegalStateException: Class ... is already instrumented
.
如果您对来自其他模块的 classes 使用 PowerMock,那么由于 Maven 在 class 路径和依赖项操作方面的严格性,这会变得更加复杂。而且我怀疑使用一个 mvn
命令是否可以轻松实现这一点,但是使用 more:
似乎是可能的
- 仪器和 运行 测试,但不要使用
restore-instrumented-classes
- 恢复 classes 并生成报告
很遗憾,您没有提供完整的示例 (https://whosebug.com/help/mcve),我现在没有时间准备完整的示例来测试这种方法。
附带说明:无法简单地使用代理是因为 PowerMock 绕过任何代理并从磁盘读取 class 文件。
我有一个有点大的多模块 Maven 项目。我在 Jacoco 处理的每个模块中都有单元测试。我有一个单独的子模块执行 "merge" 和 "report-aggregate",这似乎正在生成数据。我什至在 SonarQube 中使用生成的数据。我的大部分测试都使用 PowerMock,我使用的是离线检测。
但是,在仔细查看覆盖率数据后,我发现它遗漏了 classes 和我知道在测试期间正在执行的方法的覆盖率数据。我在每个模块中看到的模式是它只报告每个模块中单个 class 的覆盖率,实际上是当前模块中的 class。几乎所有测试还调出构建中其他模块中的其他 classes,并且从未报告这些 classes 的覆盖率。
以下插件配置在各子模块使用的父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 结果时,我发现它只报告当前模块中单个 class 的结果,而不报告 class 的数据es 在其他模块中。由此,我假设我在单独的子模块中如何做 "merge" 和 "report-aggregate" 可能与这个问题无关。
生成的 "jacoco.exec" 文件是二进制文件,但我尝试 "catting" 从一个模块中取出一个,只是为了查看可见的 ascii 文本,它只显示了一次看起来像文件名,并且它是该模块的 HTML 覆盖率报告中报告的唯一文件名。
我不确定我还能报告哪些其他信息。
更新:
我想我现在可以很清楚地看到,当 surefire 运行单元测试时,它使用来自当前模块的检测 classes,但使用来自 maven 工件的未检测 classes。这就是为什么我在当前模块中只看到 classes 的覆盖范围。
所以我似乎需要一种方法来指定当前模块所依赖的每个模块的 "target/generated-classes/jacoco" 文件夹添加到 surefire 使用的 class 路径之前。我没有办法做到这一点。
或者,我看到 "instrument" 目标有一个 "includes" 配置元素。我是否应该为当前模块所依赖的每个模块指定所有 "target/classes" 目录的路径?
某些 class 的代码覆盖率记录需要其检测。目标 instrument
执行当前模块 classes 的检测。
all of the tests also call out to other classes in other modules
所以那些没有检测的。如果我理解正确,那么正是您遗漏的内容。
如果您不对来自其他模块的 classes 使用 PowerMock,而只对当前模块中的 classes 使用 PowerMock,那么您可以将离线检测与 on-the-fly 结合使用使用代理。但在这种情况下,请确保 classes 离线检测被代理明确排除在检测之外,否则代理将抛出 IllegalStateException: Class ... is already instrumented
.
如果您对来自其他模块的 classes 使用 PowerMock,那么由于 Maven 在 class 路径和依赖项操作方面的严格性,这会变得更加复杂。而且我怀疑使用一个 mvn
命令是否可以轻松实现这一点,但是使用 more:
- 仪器和 运行 测试,但不要使用
restore-instrumented-classes
- 恢复 classes 并生成报告
很遗憾,您没有提供完整的示例 (https://whosebug.com/help/mcve),我现在没有时间准备完整的示例来测试这种方法。
附带说明:无法简单地使用代理是因为 PowerMock 绕过任何代理并从磁盘读取 class 文件。