173

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

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

4

20 回答 20

173

jacoco-maven-plugin: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注意到评论中的变化和报告

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}<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>
于 2014-05-12T09:48:02.440 回答
31

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

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>

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

于 2016-12-06T23:20:05.793 回答
23

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

于 2017-10-10T07:32:35.283 回答
18

可能存在一些其他 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 开始正常工作了。

于 2014-02-07T16:38:23.847 回答
8

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

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

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

2)添加以下目标:

<execution>
<id>default-prepare-agent</id>
<goals>
   <goal>prepare-agent</goal>
</goals>
</execution>
于 2017-03-05T18:52:23.983 回答
5

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

于 2013-09-25T14:33:18.610 回答
5

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

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

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

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

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

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

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

于 2019-05-11T15:02:48.987 回答
5

刚刚遇到同样的问题。

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

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

最后,我只是重命名HelloWorldTestsHelloWorldTest,它工作!

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

于 2020-01-05T03:30:29.073 回答
4

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

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

这是我的要点

于 2020-11-24T09:36:01.893 回答
3

我挣扎了好几天。我尝试了此线程中建议的所有不同配置。它们都不起作用。最后,我发现只有重要的配置是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>
于 2019-08-18T18:53:59.943 回答
1

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

/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>
于 2020-08-18T20:19:36.310 回答
1

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

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

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

享受!

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

于 2018-05-10T12:47:53.493 回答
1

我知道这已经晚了,但仅适用于遇到此问题且似乎没有任何解决方法的其他人(就像我一样)。确保在您的 pom 中,您对 jacoco inside 的配置plugins不在 inside pluginManagement。maven 的某种默认设置似乎是放在plugins里面pluginManagement。在您尝试添加像 jacoco 这样的详细配置之前,这几乎不会引起注意。为了添加这些,您需要将它们添加到 之外pluginManagement,否则它们将被有效地忽略。有关详细信息,请参阅下面的我的 poms。

我的旧 pom(给出了“跳过 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>

我的新 pom(现在可以编译一份工作 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>
于 2021-08-30T17:11:56.843 回答
1

尝试使用:

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>

一切正常。

于 2019-01-29T06:31:27.530 回答
1

我遇到了同样的问题。我将 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>
于 2021-05-12T13:13:42.007 回答
0

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

于 2013-08-08T20:56:46.583 回答
0

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

于 2019-01-31T08:12:07.587 回答
0

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

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

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

于 2017-12-02T10:08:14.963 回答
0

在我的例子中,prepare 代理的destFile配置不同,但相应的报告必须配置为 a dataFile,但缺少此配置。添加后dataFile,它开始正常工作。

于 2020-03-27T05:36:17.073 回答
0

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

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

转动这个系统参数来false解决这个问题。

于 2021-12-20T16:32:12.220 回答