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


123

我正在使用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

这是我的pom的配置方式:

<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>

我所有的测试都成功运行。这是Maven的一些输出:

[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] 

任何想法,我缺少什么配置?



似乎您的pom中也有集成测试,这可能会分散注意力。另外,我们剥离了,destFile然后将其写入默认的target / jacoco.exec文件。
MarkHu '17

我已经在位置发布了答案。
Shivkumar Kawtikwar

Answers:


134

jacoco-maven-plugin:0.7.10-快照

jacoco:prepare-agent说:

在使用maven-surefire-plugin的情况下,执行此操作的方法之一是使用语法进行后期属性评估:

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

请注意,@{argLine}它已添加到中-your -extra -arguments

感谢Slava Semushin注意到更改并在评论中进行了报告

jacoco-maven-plugin:0.7.2-SNAPSHOT

jacoco:prepare-agent上显示:

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

  • tycho.testArgLine用于包装eclipse-test-plugin和
  • 否则为argLine。

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

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

结果覆盖信息在执行期间收集,默认情况下,过程终止时将其写入文件。

您应该maven-surefire-plugin从(注意${argLine}inside <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>

尽管如此,现在那里有这个问题,没有jacoco目标,构建失败。
安德里亚斯(Andreas)

工作了,但由于使用tycho,所以我不得不使用tycho.testArgLine。
Raffi Khatchadourian

1
现在,引用的链接有一些不同的建议要使用@{argLine}
Slava Semushin

2
正是这是我的问题。我在mvn命令中有自定义参数mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy"。我不是在明确声明maven-surefire-plugin并设置配置。我只是在Maven命令行中添加argLine占位符 mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy"。现在,将生成jacoco.exec文件,并在声纳中生成覆盖报告。
RenatoIvancic '18

1
有用 !!!问题是由于我在maven-surefire-plugin上添加了<argLine>配置,以增加用于集成测试的内存。配置<argLine> $ {argLine} --my--additional-arguments--here-- </ argLine >解决了问题
Massimo Da Ros

23

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

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>

我想大多数用户会因为不同的原因而体验它,所以请看一下前面提到的资源!


2
我想你把它钉了。人们可能会在Google上搜索“快速修复”,但最正确的答案是“事实是,由于许多很多原因而返回此错误”。只需找出那是什么。对我而言,这是父pom覆盖了maven-surefire-plugin中的<argLine>。
tuan.dinh

这个!谢谢。我收到了相同的消息,但是那是因为我的surefire插件仅在查找**/*Test.java测试类的名称时才查找命名的文件*Tests.java
Roger Worrell,

我有两个问题:1 .根本没有测试类,至少需要一个*Test.java类,并且有一个带有注解的测试方法,@Test以便Jacoco可以执行某些操作。2.在我的项目的Travis环境变量中,输入错误SONART_TOKEN=*****时应命名为SONAR_TOKEN=*****在此处查看Travis文档,搜索or define SONAR_TOKEN in your Repository Settings。我修复该问题后,构建成功运行。您可以查看有问题的gitbhub项目
Jose Quijada

15

在某些情况下,pom中的其他一些argline设置或插件可能会覆盖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开始正常工作。


解决了我的问题。很棒的地方!
user1974753

13

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


5

特鲁里怎么说:

将您的插件配置更改为:

<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。


5

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

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

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

2)添加以下目标:

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

3

刚才遇到了同样的问题。

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

然后,我尝试更改pom.xml其工作方式,但尝试失败。

最后,我简单地重命名HelloWorldTestsHelloWorldTest,就可以了!

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


2

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

  1. 当从命令行运行构建时,JaCoCo会生成报告:mvn clean verify(Maven 3.6.0)
  2. Intellij IDEA(2019.01)也运行我的测试
  3. 一切都javaagentsurefire插件中定义的另一个条件下起作用

解决方案 - 如“ 常见问题解答”我的固定配置)中所述,argLinesurefire配置中使用“后期替换” maven属性添加值@{...}surefire

如何使用argLine中其他插件设置的属性?Maven进行财产置换

在运行任何插件之前,pom.xml中的$ {...}值。因此,Surefire永远不会在其argLine属性中看到占位符。由于版本2.17对这些属性使用了替代语法,

@ {...}允许在执行插件时延迟替换属性,因此可以正确选择由其他插件修改的属性。

第一次尝试失败- 在目标配置中定义jaCoCoArgLine属性-该场景未能满足我的第二个要求,IntelliJ IDEA无法找出我在项目中用于静态方法模拟的jmockit代理prepare-agentjacoco


与JMockit一起使用时遇到相同的问题,并且能够使用此解决方案解决该问题。即在surefire插件中添加argLine
Karthik Rao

1

我添加了一个具有1个Domain类的Maven / Java项目,具有以下功能:

  • 使用Surefire和Failsafe插件进行单元或集成测试
  • Findbugs。
  • 通过Jacoco测试覆盖率。

Jacoco结果在哪里?测试并运行“ mvn clean”后,您可以在“ target / site / jacoco / index.html”中找到结果。在浏览器中打开此文件。

请享用!

我试图使该项目尽可能简单。该项目将来自这些职位的许多建议汇总到一个示例项目中。谢谢贡献者!


我尝试了您的git项目,但不清楚如何查看该报告。
Nagaraj Vittal,

Jacoco结果在哪里?测试并运行“ mvn clean”后,您可以在“ target / site / jacoco / index.html”中找到结果。在浏览器中打开此文件。
tm1701

您可能需要将存储库链接回stackoverflow。在您的演示中发现错误后,我很难再次找到问题。
Wolfgang Fahl,

而且仍然无法按预期工作:-(目标目录仅包含aggregate.exec,因为执行mvn全新安装时它的内容是……
Wolfgang Fahl

1

我挣扎了好几天。我尝试了此线程中建议的所有不同配置。它们都不起作用。最后,我发现只有重要的配置才是prepare-agent目标。但是您必须将其置于正确的阶段。我看到很多示例都将其放在“ pre-integration-test ”中,这具有误导性,因为它将仅在单元测试之后执行。因此,不会测试单元测试。

正确的配置应该只使用默认阶段(不要明确指定阶段)。通常,您不需要在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>

0

执行表示将jacoco数据放在/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec中,但是您的maven配置正在$ {basedir} / target / coverage-reports / jacoco-unit中查找数据。执行


1
正确,那么为什么插件会忽略我在配置中指定的内容?
戴夫

尝试将您的destfile配置移到prepare-agent执行的配置中。并非所有的Maven插件都会优雅地处理配置继承。
tdrury

0

我的回复很晚,但是对于其他用户,您必须配置故障保护插入才能使用保存在itCoverageAgent变量中的命令行代理配置。举个例子

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

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


0

尝试使用:

mvn jacoco:report -debug

查看有关您的报告流程的详细信息。

我像这样配置我的jacoco:

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

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

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

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

而且一切正常。


0

有时,执行是第一次运行,而当我们执行maven全新安装时,此后不会生成。问题是对主pom文件的maven-compiler-plugin下的skipMain和skip属性使用true。如果它们是作为任何问题或建议的一部分引入的,请将其删除。


0

在我的情况下,prepare代理的destFile配置不同,但是相应地,报告必须配置为dataFile,但是缺少此配置。一旦dataFile加入,它开始工作的罚款。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.