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]
どのような構成が不足していますか?
Maven-surefire-pluginの場合にこれを行う方法の1つは、プロパティの評価を遅らせるために構文を使用することです。
<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:prepare-agent は次のように言っています:
[org.jacoco:jacoco-maven-plugin:0.7.2-SNAPSHOT:prepare-agent]できるJaCoCoランタイムエージェントを指すプロパティを準備します。テスト対象のアプリケーションにVM引数として渡されます。デフォルトでは、プロジェクトのパッケージタイプに応じて、次の名前のプロパティが設定されます。
- タイプeclipse-test-pluginをパッケージ化するためのtycho.testArgLineおよび
- それ以外の場合は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でさまざまなソリューションを試しましたが、これは resource が最適であることがわかりました。 Jacocoが同じエラーを返す可能性のある多くの異なる潜在的な理由を分解します。
私たちにとっての解決策は、構成に準備エージェントを追加することでした。
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
ほとんどのユーザーはさまざまな理由でそれを経験していると思いますので、前述のリソースをご覧ください!
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
に設定
例の1つ
<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の実行のスキップ」エラーが発生する可能性があります。たとえば、新しいプロジェクトを起動し、* Test.Javaファイルがまったくない場合。
私はこの質問がかなり古いことを知っていますが、私のような誰かが答えを探してここに来たら、これが役立つかもしれません。これで上記のエラーを克服することができました。
1)プラグインmaven-surefire-pluginから以下のコードを削除します
<reuseForks>true</reuseForks>
<argLine>-Xmx2048m</argLine>
2)以下の目標を追加します。
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
F 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>
編集:ちょうど1つの重要なことに気づきました、destFileとdataFileは大文字と小文字を区別するようですので、destfileではなくdestFileであることになっています。
Maven/Javaプロジェクト を追加し、次の機能を備えた1つのドメインクラスを追加しました。
Jacocoの結果はどこにありますか? 「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
にありません。エラーには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>
そして、すべてが正常に動作します。
私はすべての答えを試しましたが、次のアドバイスの組み合わせだけがうまくいきました。どうして?非常に具体的な要件がありました。
mvn clean verify
(Maven 3.6.0)javaagent
プラグインで定義された別のsurefire
の存在下で動作しますSolution-argLine
構成にsurefire
値を追加し、surefire
_ faq _で説明されているように、「遅延置換」mavenプロパティ@{...}
を追加します ( my fixed configuration )
ArgLineの他のプラグインによって設定されたプロパティを使用するにはどうすればよいですか? Mavenは、
プラグインが実行される前のpom.xmlの$ {...}値。そのため、SurefireはargLineプロパティにプレースホルダーを表示しません。バージョン2.17では、これらのプロパティに代替構文を使用しているため、
@ {...}は、プラグインの実行時にプロパティの遅延置換を許可するため、他のプラグインによって変更されたプロパティが正しく取得されます。
最初の試行に失敗しました- define jaCoCoArgLinejacoco
のprepare-agent
ゴール設定のプロパティ-シナリオは2番目の要件IntelliJ IDEAに失敗しました静的メソッドのモックのプロジェクトで使用しているjmockitのエージェントを見つけられない
実行では、jacocoデータを/Users/davea/Dropbox/workspace/myproject/target/jacoco.execに配置しますが、Maven構成は$ {basedir}/target/coverage-reports/jacoco-unitのデータを探しています。 exec。
実行が最初に実行されることもありますが、Mavenのクリーンインストールを実行しても、その後生成されません。この問題は、skipMainにtrueを使用し、メインpomファイルのmaven-compiler-pluginの下のプロパティをスキップしていました。問題や提案の一部として導入された場合は削除してください。
私の応答は非常に遅いですが、他のユーザーの場合あなたの場合、itCoverageAgent変数に保存されたコマンドラインエージェント構成を使用するためにフェイルセーフプラグを構成する必要があります。例えば
<configuration>
<argLine>${itCoverageAgent}</argLine>
</configuration>
Maven構成では、jacocoはprepare-agentフェーズでコマンドライン引数を準備しますが、フェイルセーフプラグインはそれを使用しないため、実行データファイルはありません。
私は何日も苦労しました。このスレッドで提案されているさまざまな構成をすべて試しました。それらのどれも動作しません。最後に、重要な設定のみが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>