当前位置: 首页 > 知识库问答 >
问题:

jacoco仅显示同一模块中类的覆盖率

汪天宇
2023-03-14

我有一个很大的多模块Maven项目。Jacoco正在处理每个模块中的单元测试。我有一个单独的子模块来执行“合并”和“报告聚合”,这似乎是在生成数据。我甚至在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结果时,我发现它只报告当前模块中单个类的结果,而不报告其他模块中类的数据。因此,我假设我如何在单独的子模块中进行“合并”和“报告聚合”可能与此问题无关。

生成的“jacoco.exec”文件是二进制的,但我尝试从一个模块中“捕捉”一个,只是为了看看什么ascii文本是可见的,它只显示了一次看起来像文件名的任何事情,它是唯一的文件名报告在该模块的超文本标记语言覆盖报告中。

我不确定还能报告什么其他信息。

更新:

我想我现在可以非常清楚地看到,当surefire运行单元测试时,它使用当前模块中的检测类,但使用maven工件中的未检测类。这就是为什么我只看到当前模块中类的覆盖范围。

因此,似乎我需要一种方法来指定当前模块所依赖的每个模块的“target/generated classes/jacoco”文件夹在surefire使用的类路径之前。我没有办法做到这一点。

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

共有1个答案

南门魁
2023-03-14

记录某些类的代码覆盖率需要它的插装。目标仪表执行当前模块类的仪表。

所有测试还调用其他模块中的其他类

所以那些没有仪器的。如果我理解正确的话,那么就是那些你没有覆盖的。

如果您不对来自其他模块的类使用PowerMock,而只对当前模块中的类使用PowerMock,那么您可以将脱机插装与动态使用代理相结合。但在这种情况下,请确保代理将脱机插装的类显式排除在插装之外,否则代理将抛出非法状态异常:类。。。已检测到。

如果您对来自其他模块的类使用PowerMock,那么由于Maven在处理类路径和依赖项方面的严格性,这将变得更加复杂。我怀疑使用一个mvn comand可以轻松实现这一点,但似乎可以使用更多:

  1. 仪器和运行测试,但不要使用恢复仪器类
  2. 恢复类并生成报告

很遗憾,您没有提供完整的示例(https://stackoverflow.com/help/mcve)现在我没有时间准备完整的示例来测试这种方法

另请注意:无法简单地使用代理是因为PowerMock绕过任何代理并从磁盘读取类文件。

 类似资料:
  • 我运行的插件生成html,xml和报告,以衡量我的测试测试的代码覆盖率。 我在本地以及在中成功地生成了这些报告,我的所有单元测试结果都反映在中,它向我展示了覆盖范围。 我的既有模块中覆盖范围的结果,也有依赖模块的结果。我已经验证了这使用为。 我没有得到声纳中相关模块的覆盖结果。任何人都知道我做错了什么。 我的插件是这样的 我的目标是

  • 问题内容: 似乎有几个问题,这些问题已经很老了,并且从Java 8对Jacoco的支持开始发生了变化。 我的项目包含以下结构 我已经配置了这样的 主POM.xml Pom.xml B pom.xml 我正在执行此命令。我可以看到jacoco.exec正在生成,但是我看不到任何HTML报告正在验证数据。 请帮我解决一下这个。还有一点是,我的配置对项目是否正确? 更新资料 已确定的问题。 变成 现在,

  • 我在类BrickSortPar并行中有两个静态方法。它们完全由单元测试覆盖。但是我有一个静态块静态{...}列出了Jacoco仅75%的代码覆盖率。那意味着什么? 以下是确保上述方法的完整代码覆盖率的测试用例: 我在上面的测试课上遗漏了什么吗? 完整的课程可在: https://raw.githubusercontent.com/Fernal73/DSAlgos/master/src/test/j

  • Jacoco插件在jenkins报告中显示0%的覆盖率,但当我在本地系统中运行相同的命令时,Jacoco会正确生成报告。我正在使用以下命令: mvn-s xyz/settings.xml-f xyz/xyz/pom.xml清洁安装org.jacoco 所以当我在jenkins中运行这个命令时,它会生成错误的报告。我已经检查了它在工作区目录对应的项目在詹金斯。它显示每个项目的0%覆盖率。但是当我在本

  • 问题内容: 从不同的代码库执行业务测试时,我必须获得应用程序的代码覆盖率。 我使用:Maven作为我的构建Jbehave作为我的测试框架。测试是用Java编写的。 我的应用程序是部署在tomcat上的一组war文件。 应用程序代码库与测试代码库是分开的。 为了获得覆盖范围,我遵循以下步骤。 1使用maven编译测试代码。 2将应用程序类从其构建位置($ {app.code.dir} / targe

  • 我看到詹金斯插件中的代码覆盖率为零。我在客户端服务器模式下使用 Jacoco 0.8.7。客户端是詹金斯,服务器(此处存在jaco代理jar)是一个VM。当我使用旧版本的jaco 0.7.4时,这并没有发生。 Jenkins CI日志- Jenkins CI插件配置是这样的。使用ant和maven组合来转储exec文件。