maven 构建中的代码覆盖率 - 由于缺少类目录而跳过 JaCoCo 执行

2022-09-03 07:31:38

如果我有一个项目,我能够让代码覆盖率正常工作,但现在我有一个多模块项目。

我的应用程序是在项目中构建的,我的所有集成测试都在一个单独的项目中运行,该项目使用作为上一个模块构建的工件。api

生成运行,但我没有收到代码覆盖率报告,而是收到信息消息:

Skipping JaCoCo execution due to missing classes directory

我的覆盖率报告文件已创建,但似乎插件需要运行测试的项目中的类。jacoco-it.execjacoco

有人可以告诉我,当课程位于另一个模块中时,我需要做些什么才能创建覆盖率报告吗?


答案 1

我已经设法通过反复试验获得了各种解决方法。

看起来jacoco插件很乐意在没有类的情况下创建exec文件,但是如果没有它们,它不会创建报告,我不明白jacoco内部是如何工作的,所以如果有人知道,你能解释一下吗?

我也不确定我所做的是否可靠,但它似乎确实报告了我的硒驱动测试的覆盖范围。

我自己想出的(可能的)解决方案是使用maven资源插件来复制从我的目标\cargo中的war文件中爆炸的类。目录到目录目标\类:

 <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <executions>
          <execution>
            <id>copy-resources</id>             
            <phase>pre-integration-test</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${basedir}/target/classes</outputDirectory>
              <resources>          
                <resource>
                  <directory>${basedir}/target/cargo/configurations/tomcat7x/webapps/calculator-api/WEB-INF/classes</directory>
                  <filtering>false</filtering>
                  <excludes>
                        <exclude>**/*Config*.*</exclude>
                        <exclude>**/*Initialiser*.*</exclude>
                  </excludes>
                </resource>
              </resources>              
            </configuration>            
          </execution>
        </executions>
    </plugin>

这似乎让jacoco插件很开心,我得到了我的代码覆盖率,尽管插件现在似乎忽略了我的排除列表。

有没有人知道这实际上是一个解决方案,它“似乎”有效,但我在网上找不到任何推荐的方法,我也不确定为什么在jacoco代理上设置的排除选项似乎不再有效。

我已经设法绕过了jacoco插件,而不是通过不使用资源插件复制它们来排除文件,但我仍然不明白jacoco是如何工作的。


答案 2

尽管用于依赖项的聚合报告,但在我的情况下它不起作用 - 我使用如下项目结构:jacoco:report-aggregate

project
└─ module-api   ⇦ API definition
└─ module-spec  ⇦ module with black box tests through the API
└─ module-impl1 ⇦ implementation 1 of the API
└─ module-impl2 ⇦ another implementation of the API
└─ module-test1 ⇦ some dependencies + impl1, apply the tests from spec
└─ module-test2 ⇦ some dependencies + impl2, apply the tests from spec

在本例中,生成了一个空报告。module-test1 和 module-test2 项目是使用 POM 打包类型,这也不适合在它们上运行,因为它需要 target/classes 目录中的类。report-aggregatereport

我的解决方案

我配置了jacoco插件,通过添加以下内容,将其在项目的目标/类目录中的类转储<classDumpDir>${project.build.outputDirectory}</classDumpDir>

这使得常规目标得以实现。完整的代码是:report

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.5</version>
  <configuration>
    <destFile>${project.build.directory}/coverage-reports/code-coverage.exec</destFile>
    <dataFile>${project.build.directory}/coverage-reports/code-coverage.exec</dataFile>
    <outputDirectory>${project.reporting.outputDirectory}/code-coverage</outputDirectory>
    <propertyName>jacocoArgLine</propertyName>
    <classDumpDir>${project.build.outputDirectory}</classDumpDir>
  </configuration>
  <executions>
    <execution>
      <id>prepare-jacoco-agent</id>
      <goals>
          <goal>prepare-agent</goal>
      </goals>
    </execution>
    <execution>
      <id>post-integration-test</id>
      <phase>post-integration-test</phase>
      <goals>
        <goal>report</goal>
      </goals>
    </execution>
  </executions>
</plugin>

请注意,检测的类来自所有依赖项,因此需要进行一些筛选以缩小报告范围。请参见: https://www.eclemma.org/jacoco/trunk/doc/prepare-agent-mojo.html


推荐