在执行 JaCoCo 时获得“由于缺少执行数据文件而跳过 JaCoCo 执行”

我正在使用 Maven 3.0.3、 JUnit 4.8.1和 Jacoco 0.6.3.201306030806,并尝试创建测试覆盖率报告。

我有一个只有单元测试的项目,但我不能让报告运行,我反复得到错误: Skipping JaCoCo execution due to missing execution data file当我运行:

mvn clean install -P test-coverage

下面是我的彩球的配置:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.14.1</version>
<configuration>
<reuseForks>true</reuseForks>
<argLine>-Xmx2048m</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.14.1</version>
<configuration>
<reuseForks>true</reuseForks>
<argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
...
<profile>
<id>test-coverage</id>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.3.201306030806</version>
<configuration>
<destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile>
<datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile>
</configuration>
<executions>
<execution>
<id>prepare-unit-tests</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!-- prepare agent for measuring integration tests -->
<execution>
<id>prepare-integration-tests</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<phase>pre-integration-test</phase>
<configuration>
<propertyName>itCoverageAgent</propertyName>
</configuration>
</execution>
<execution>
<id>jacoco-site</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>

我所有的测试都成功运行:

[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-unit-tests) @ myproject ---
[INFO] argLine set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec
[INFO]
...
Tests run: 14, Failures: 0, Errors: 0, Skipped: 0


[INFO]
...
[INFO]
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-integration-tests) @ myproject ---
[INFO] itCoverageAgent set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec
[INFO]
[INFO] --- maven-failsafe-plugin:2.14.1:integration-test (default) @ myproject ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-failsafe-plugin:2.14.1:verify (default) @ myproject ---
[INFO] Failsafe report directory: /Users/davea/Dropbox/workspace/myproject/target/failsafe-reports
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO]
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:report (jacoco-site) @ myproject ---
[INFO] Skipping JaCoCo execution due to missing execution data file
[INFO]

知道我错过了什么配置吗?

202917 次浏览

执行过程说它把 jacoco 数据放在/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec 中,但是你的 maven 配置是在 ${ basedir }/target/cover-reports/jacoco-unit 中寻找数据。执行官。

Tdrury 说:

将您的插件配置改为:

<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.3.201306030806</version>
<executions>
<!-- prepare agent for measuring integration tests -->
<execution>
<id>prepare-integration-tests</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile>
</configuration>
</execution>
<execution>
<id>jacoco-site</id>
<phase>post-integration-test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile>
</configuration>
</execution>
</executions>
</plugin>

编辑: 刚刚注意到一件重要的事情,destFile 和 dataFile 似乎是区分大小写的,所以它应该是 destFile,而不是 destFile。

可能存在这样的情况,其他一些 argline 设置或 pom 插件可能会覆盖 Jacoco 执行顺序设置。

ArgLine 设置为 -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec

其中一个例子

           <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<forkCount>5</forkCount>
<reuseForks>true</reuseForks>
<argLine>-Dnet.sf.ehcache.disabled=true</argLine>
</configuration>
</plugin>

从这些插件中删除 argLine 后,Jacoco 开始正常工作。

Jacoco-maven-plugin: 0.7.10-SNAPSHOT

来自 准备人员的消息说:

在遇到 maven-surefire-plugin 的情况下,实现这一点的方法之一是 在后期属性评估中使用语法:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>@{argLine} -your -extra -arguments</argLine>
</configuration>
</plugin>

注意添加到 -your -extra -arguments@{argLine}

感谢 斯拉瓦 · 赛穆辛注意到变化和 在评论中报道

Jacoco-maven-plugin: 0.7.2-SNAPSHOT

准备人员表示:

[ org.JaCoCo: JaCoCo-maven-plugin: 0.7.2-SNAPSHOT: ready-agent ] 准备一个指向 JaCoCo 运行时代理的属性,该属性可以是 作为 VM 参数传递给测试中的应用程序 默认情况下,项目打包类型具有以下属性 名称已设置:

  • TestArgLine 用于打包 eclipse-test-plugin 和
  • ArgLine 否则。

注意,这些属性不能被 测试配置,否则无法附加 JaCoCo 代理 您需要自定义参数,请附加它们。例如:

<argLine>${argLine} -your -extra -arguments</argLine>

结果 在执行期间和默认情况下收集覆盖率信息 当进程终止时写入到文件中。

你应该在 maven-surefire-plugin插件配置中将下面一行改为(注意 <argLine>中的 ${argLine}) :

<argLine>-Xmx2048m</argLine>

<argLine>${argLine} -Xmx2048m</argLine>

对另一个插件 maven-failsafe-plugin进行必要的修改,并替换以下内容(同样,请注意 ${argLine}) :

<argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>

<argLine>${argLine} -Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>

我遇到了一个不同的问题,它返回了相同的错误。

Skipping JaCoCo execution due to missing execution data /target/jacoco.exec

事实是,这个错误由于很多很多原因被返回。 我们在 Stack Overflow 上尝试了不同的解决方案,但是发现这个 资源是最好的。它推翻了许多不同的潜在原因,为什么 Jacoco 可能返回相同的错误。

对于我们来说,解决方案是在配置中添加一个预备代理。

<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>

我想大多数用户会因为不同的原因体验它,所以看看上面提到的资源吧!

我知道这个问题很老套,但是如果像我这样的人来这里寻找答案,那么这可能会有帮助。我已经用这个克服了上面的错误。

1)从插件 maven-surefire-plugin 中删除下面的代码

 <reuseForks>true</reuseForks>
<argLine>-Xmx2048m</argLine>

2)加入以下目标:

<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>

由于项目中缺少测试,还可能导致“由于缺少执行数据文件而跳过 JaCoCo 执行”错误。例如,当您启动新项目时,根本没有 * Test.java 文件。

我的反应非常晚,但对于其他用户 在这种情况下,必须配置故障安全插件,以使用保存在 itCoverageAgent 变量中的命令行代理配置。 比如说

<configuration>
<argLine>${itCoverageAgent}</argLine>
</configuration>

在您的 maven 配置中,jacoco 在 ready-agent 阶段准备命令行参数,但是故障安全插件不使用它,因此没有执行数据文件。

我已经添加了一个带有1个 Domain 类的 Maven/Java 项目,它具有以下特性:

  • 单元或集成测试 与插件。
  • 臭虫。
  • 通过 雅科科测试覆盖率。

雅科科的结果呢?在测试并运行‘ mvn clean’之后,您可以在‘ target/site/jacoco/index.html’中找到结果。在浏览器中打开此文件。

好好享受吧!

我尽量使这个项目尽可能简单。该项目将来自这些职位的许多建议放在一个示例项目中。谢谢你们,贡献者们!

尝试使用:

mvn jacoco:report -debug

查看有关你的报告过程的细节。

我把我的 Jacoco 设置成这样:

<configuration>
<dataFile>~/jacoco.exec</dataFile>
<outputDirectory>~/jacoco</outputDirectory>
</configuration>

然后 mvn jacoco:report -debug使用默认配置显示它,这意味着 jacoco.exec不在 ~/jacoco.exec中。

因此,只需使用默认配置:

<execution>
<id>default-report</id>
<goals>
</goals>
<configuration>
<dataFile>${project.build.directory}/jacoco.exec</dataFile>
<outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
</configuration>
</execution>

一切正常。

有时执行是第一次运行,当我们执行 maven clean install 时,它不会在此之后生成。 问题是对 skipMain 和 Skip 属性使用 true 在主 pom 文件的 maven- 编译器-插件下。 如果它们是作为任何问题或建议的一部分介绍的,则删除它们。

我尝试了所有的答案,但只有以下的建议组合对我有效。为什么?我有非常具体的要求:

  1. 当从命令行运行 build 时,JaCoCo 生成报告: mvn clean verify(Maven 3.6.0)
  2. Intellij IDEA (2019.01)也运行我的测试
  3. 它在另一个 surefire插件定义的 javaagent的存在下工作

解决方案 -在 surefire配置中预置 argLine值,具有 surefire 常见问题(我的固定配置)中解释的“后期替换”特性 @{...}

如何使用 argLine 中其他插件设置的属性? Maven 为

${...} 因此,Surefire 永远不会在其 argLine 属性中看到占位符。 由于 Version 2.17使用了这些属性的替代语法,

@{...} 允许在执行插件时延迟替换属性,因此被其他插件修改过的属性将被正确拾取。

第一次尝试失败-jacocoprepare-agent目标配置中的 定义 jaCoCoArgLine属性-场景失败了我的第二个要求,IntelliJ IDEA 不能找出我在项目中使用的 jmock 的代理进行静态方法模拟

我挣扎了好几天。我尝试了这个帖子中建议的所有不同的配置。都不管用。最后,我发现只有重要的配置是 准备人员的目标。但你必须把它放在正确的阶段。我看到很多例子把它放在“ 集成前测试”中,这是一个误导,因为它只会在单元测试之后执行。所以单元测试不会被检测。

正确的配置应该只使用默认的阶段(不要显式地指定阶段)。通常情况下,你不需要在 Maven-surefire-plugin附近聚集。

  <plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>post-integration-test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>

刚才遇到了同样的问题。

我有一个名为 HelloWorld的类,我为它创建了一个名为 HelloWorldTests的测试类,然后我得到了输出 Skipping JaCoCo execution due to missing execution data file.

然后,我试图改变我的 pom.xml使其工作,但尝试失败。

最后,我简单地将 HelloWorldTests重命名为 HelloWorldTest,它起作用了!

所以我猜,默认情况下,jacoco 只能识别名为 XxxTest的测试类,这表明它是 Xxx的测试类。因此,只需将您的测试类重命名为这种格式就可以了!

在我的例子中,准备代理在配置中有一个不同的 destFile,但是因此报告必须配置为 dataFile,但是这个配置丢失了。一旦添加了 dataFile,它就开始正常工作了。

如果项目的路径在任何地方都有空格,则会发生这种情况,例如:

/home/user/my projects/awesome project

如果是这种情况,从目录名中删除这些空格,例如:

/home/user/my-projects/awesome-project

或者将项目移动到沿途没有空格的目录。

关于插件配置,我只需要如下的基本配置:

<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>

当使用 maven-surefire-plugin 或 maven-faulsafe-plugin 时,不能使用 forkCount 为0或者将 forkMode 设置为 never,因为这样会阻止 javaagent 集的测试执行,并且不会记录覆盖率。

档号: https://www.eclemma.org/jacoco/trunk/doc/maven.html

这是我的 大意

我也有同样的问题。我将 Jacoco 的版本从0.6升级到0.8,并同时更新了 surefire 插件。下面的命令在 site/Jacoco/文件夹中生成 Jacoco 报告:

mvn clean jacoco:prepare-agent install jacoco:report

我的最佳配置如下:

<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>PACKAGE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.0</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<forkedProcessExitTimeoutInSeconds>60</forkedProcessExitTimeoutInSeconds>
<forkCount>1</forkCount>
</configuration>
</plugin>
</plugins>

我知道这是晚了,但只是对于任何人谁有这个问题,似乎没有修复它(像我一样)。请确保在您的 pom 中,您在 plugins内部的 jacoco 配置不是在 pluginManagement内部依次进行的。Maven 的默认设置似乎是将 plugins放在 pluginManagement中。除非您尝试添加诸如 Jacoco 之类的详细配置,否则几乎不会注意到这一点。为了添加它们,您需要在 pluginManagement之外添加它们,否则它们将被有效地忽略。详细信息请参阅下面的图片。

我的旧泡沫(给“跳跃 Jacoco...”的信息) :

<project>
...
<build>
<pluginManagement>
<plugins>
...
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

我的新诗(现在正在编写一份 Jacoco 工作报告) :

<project>
...
<build>
<pluginManagement>
<plugins>
...
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

我遇到了类似的错误,因为跳过了测试执行。

我使用类似的系统参数 -Dmaven.test.skip.exec=true运行我的构建

将这个系统参数转换为 false就解决了这个问题。

Jacoco 执行数据文件是在准备代理目标运行时生成的 Jacoco.exec文件。当它没有生成或者配置中没有设置正确的路径时,您将收到错误消息。因为 Jacoco 用它来构建测试覆盖率。这通常发生在使用 Jacoco maven 插件和 surfire 或故障保护时。为了确保生成 jacoco.exec 文件,必须在 pom.xml 文件中添加 argline,而不是在 surfire 配置中,而是在 pom.xml 文件中的 properties 标记中。

<properties>
<argLine>-Xmx2048m</argLine>
</properties>
         

我刚从 properties标签中删除了以下两行

<jacoco.ut.reportPath>${project.basedir}/../target/jacoco.exec</jacoco.ut.reportPath>
<sonar.jacoco.reportPaths>${project.basedir}/target/jacoco.exec</sonar.jacoco.reportPaths>

缺省情况下,mvn install -Psonar在目标目录中创建 Jacoco.exec,因此在我的示例中不需要显式路径。

对于遇到类似问题的其他人,这里有另一个可能的解决方案:

我们的项目是在一个传统的中文版本的 Windows 中运行,当我们检查 prepare-agent部分在文档日志中,我们发现它试图读取我们放在桌面上的项目文件夹,通过 \桌面\...\project\...而不是 \Desktop\...\project\...。我觉得路径中的 UTF-8符号让 Jacoco 变得很奇怪。我们把项目转移到其他地方,问题就解决了。

译者: 也检查 prepare-agent日志,因为在此期间准备了 jacoco.exec