この記事では、Javaプロジェクトのコードカバレッジレポートを生成するためにhttps://www.jacoco.org/jacoco/trunk/doc/maven.html[JaCoCo Mavenプラグインを使用する方法を説明します。
テスト済み
-
Maven 3.5.3
-
JUnit 5.3.1
-
jacoco-maven-plugin 0.8.2
1. JaCoCo Mavenプラグイン
1.1次のJaCoCoプラグインを `pom.xml`ファイルに宣言します。
pom.xml
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.2</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <!-- attached to Maven test phase --> <execution> <id>report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin>
Mavenのテスト段階でJaCoCoの「レポート」目標を実行します。
ユニットテスト
2.1メッセージを返す単純なJavaコードと空の文字列チェック。
MessageBuilder.java
package com.mkyong.examples; public class MessageBuilder { public String getMessage(String name) { StringBuilder result = new StringBuilder(); if (name == null || name.trim().length() == 0) { result.append("Please provide a name!"); } else { result.append("Hello " + name); } return result.toString(); } }
2.2上の単位テスト。
TestMessageBuilder.java
package com.mkyong.examples; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class TestMessageBuilder { @Test public void testNameMkyong() { MessageBuilder obj = new MessageBuilder(); assertEquals("Hello mkyong", obj.getMessage("mkyong")); } }
2.3
mvn test`を実行すると、JaCoCoコードカバレッジレポートが
target/site/jacoco/** `に生成されます
ターミナル
$ mvn clean test [INFO]-------------------------------------------------------[INFO] T E S T S[INFO]-------------------------------------------------------[INFO]Running com.mkyong.examples.TestMessageBuilder[INFO]Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s - in com.mkyong.examples.TestMessageBuilder[INFO][INFO]Results:[INFO][INFO]Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO][INFO][INFO]--- jacoco-maven-plugin:0.8.2:report (report) @ maven-code-coverage ---[INFO]Loading execution data file D:\maven-examples\maven-code-coverage\target\jacoco.exec[INFO]Analyzed bundle 'maven-code-coverage' with 1 classes[INFO]------------------------------------------------------------------------[INFO]BUILD SUCCESS[INFO]------------------------------------------------------------------------[INFO]Total time: 4.164 s[INFO]Finished at: 2018-11-14T16:48:39+08:00[INFO]------------------------------------------------------------------------
2.4 `target/site/jacoco/index.html`ファイルを開き、コードカバレッジレポートを見直してください:
-
グリーン - コードがテストされたり、カバーされています.
-
赤 - コードはテストされないか、またはカバーされません.
-
イエロー - コードの一部がテストされたり、カバーされています.
3.単体テストの改善
3.1赤線のテストをもう1つ追加する。
TestMessageBuilder.java
package com.mkyong.examples; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class TestMessageBuilder { @Test public void testNameMkyong() { MessageBuilder obj = new MessageBuilder(); assertEquals("Hello mkyong", obj.getMessage("mkyong")); } @Test public void testNameEmpty() { MessageBuilder obj = new MessageBuilder(); assertEquals("Please provide a name!", obj.getMessage(" ")); } }
レポートを再度確認します。
ターミナル
$ mvn clean test
target/site/jacoco/index.html
3.2条件がある場合、黄色の線についてもう1つテストを追加します。
TestMessageBuilder.java
package com.mkyong.examples; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class TestMessageBuilder { @Test public void testNameMkyong() { MessageBuilder obj = new MessageBuilder(); assertEquals("Hello mkyong", obj.getMessage("mkyong")); } @Test public void testNameEmpty() { MessageBuilder obj = new MessageBuilder(); assertEquals("Please provide a name!", obj.getMessage(" ")); } @Test public void testNameNull() { MessageBuilder obj = new MessageBuilder(); assertEquals("Please provide a name!", obj.getMessage(null)); } }
レポートを再度確認します。
ターミナル
$ mvn clean test
target/site/jacoco/index.html
最後に、すべての回線が100%カバレッジテストされます。
4.よくある質問
4.1ラインカバレッジが最小90%を満たさなければならないことを確認します。
pom.xml
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco.version}</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>jacoco-report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> <!-- Add this checking --> <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.9</minimum> </limit> </limits> </rule> </rules> </configuration> </execution> </executions> </plugin>
`jacoco:check`ゴールはMavenの検証フェーズに添付されています。
ターミナル
$ mvn clean verify [INFO]Analyzed bundle 'maven-code-coverage' with 1 classes[WARNING]Rule violated for package com.mkyong.examples: lines covered ratio is 0.8, but expected minimum is 0.9
-
注** 詳細はhttps://www.jacoco.org/jacoco/trunk/doc/check-mojo.html[JaCoCoチェック]の例:
4.2デフォルトのJaCoCo出力フォルダを更新するには?
pom.xml
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco.version}</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>jacoco-report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> <!-- default target/jscoco/site/** --> <configuration> <outputDirectory>target/jacoco-report</outputDirectory> </configuration> </execution> </executions> </plugin>
ソースコードをダウンロードする
$ git clone https://github.com/mkyong/maven-examples.git $ cd maven-code-coverage
$ mvn clean test# 'target/site/jacoco/index.html’のレポートを表示する
参考文献
-
https://en.wikipedia.org/wiki/Java code coverage__tools[Wikipedia:
Javaコードカバレッジツール]。 JaCoCo Javaコードカバレッジライブラリ
-
リンク://maven/jacoco-java-code-coverage-maven-example/[JaCoCo in
Eclipse IDE]
リンク://タグ/コードカバレッジ/[コードカバレッジ]リンク://タグ/jacoco/[jacoco] maven