获取"由于缺少执行数据文件而跳过JaCoCo执行"在执行JaCoCo时

时间:2013-08-07 15:22:50

标签: maven junit 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

以下是我的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] 

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

18 个答案:

答案 0 :(得分:97)

jacoco-行家-插件:0.7.10-SNAPSHOT

来自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注意到更改并reporting in the comment

jacoco-行家-插件: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}内的<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>

答案 1 :(得分:16)

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

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

事实是,出于许多原因,这个错误被返回了。 我们在Stack Overflow上尝试了不同的解决方案,但发现这个resource是最好的。它揭示了Jacoco可能返回相同错误的许多不同潜在原因。

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

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

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

答案 2 :(得分:10)

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开始正常工作。

答案 3 :(得分:8)

由于缺少执行数据文件,人们也可以获得&#34;跳过JaCoCo执行&#34;由于项目中缺少测试而导致的错误。例如,当您启动新项目并且根本没有* Test.java文件时。

答案 4 :(得分:4)

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

1)从插件maven-surefire-plugin

中删除下面的代码
 <reuseForks>true</reuseForks>
 <argLine>-Xmx2048m</argLine>

2)添加以下目标:

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

答案 5 :(得分:3)

Fdrury说:

将您的插件配置更改为:

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

答案 6 :(得分:3)

刚才遇到了同样的问题。

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

然后,我尝试更改pom.xml以使其正常运行,但尝试失败。

最后,我只需将HelloWorldTests重命名为HelloWorldTest,就可以了!

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

答案 7 :(得分:2)

我添加了一个带有1个Domain类的Maven/Java project,其中包含以下功能:

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

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

享受!

我试图让项目尽可能简单。该项目在示例项目中将这些帖子中的许多建议放在一起。 谢谢你,贡献者!

答案 8 :(得分:0)

我遇到了同样的问题。我将 Jacoco 版本从 0.6 更新到 0.8 并更新了surefire插件。以下命令在 site/jacoco/ 文件夹中生成了 Jacoco 报告:

mvn clean jacoco:prepare-agent install jacoco:report

我的maven配置如下:

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

在使用maven-surefire-plugin或maven-failsafe-plugin时,请勿使用forkCount为0或将forkMode设置为never,因为这将阻止使用javaagent设置执行测试,并且不会记录任何覆盖率

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

这是我的gist

答案 11 :(得分:0)

如果项目的路径在某处有空格,例如:

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

答案 12 :(得分:0)

在我的情况下,prepare代理的配置不同destFile,但是相应地,报告必须配置dataFile,但是缺少此配置。添加dataFile后,它就可以正常工作。

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

  1. 从命令行运行mvn clean verify(Maven 3.6.0)时,JaCoCo会生成报告
  2. Intellij IDEA(2019.01)也可以运行我的测试
  3. 这一切都在javaagent插件中定义的另一个surefire存在的情况下完成

解决方案-如argLine {{3}中所述,在surefire配置中将@{...}值附加“后期替换” maven属性surefire }(FAQ

  

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

     

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

     

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

首次尝试失败-prepare-agent目标配置jacoco中的my fixed configuration属性-该方案未能满足我的第二个要求,IntelliJ IDEA无法确定我使用的jmockit代理在项目中进行静态方法模拟

答案 15 :(得分:0)

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

答案 16 :(得分: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>

一切正常。

答案 17 :(得分:0)

我的回复很晚,但对其他用户而言 在您的情况下,您必须配置故障保护插件以使用保存在itCoverageAgent变量中的命令行代理配置。 例如

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

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