JaCoCoの紹介
1. 概要
Code coverageは、自動テスト中に実行されるコードの行数を測定するために使用されるソフトウェアメトリックです。
この記事では、JaCoCo(Javaプロジェクト用のコードカバレッジレポートジェネレーター)の使用に関するいくつかの実用的な側面について説明します。
2. Mavenの構成
JaCoCoを起動して実行するには、pom.xmlファイルでこのmaven pluginを宣言する必要があります。
org.jacoco
jacoco-maven-plugin
0.7.7.201606060606
prepare-agent
report
prepare-package
report
これまでに提供されたリンクは、常にMaven中央リポジトリ内のプラグインの最新バージョンに移動します。
3. コードカバレッジレポート
JaCoCoのコードカバレッジ機能を検討する前に、コードサンプルを用意する必要があります。 文字列が同じ逆方向と順方向を読み取るかどうかをチェックする単純なJava関数を次に示します。
public boolean isPalindrome(String inputString) {
if (inputString.length() == 0) {
return true;
} else {
char firstChar = inputString.charAt(0);
char lastChar = inputString.charAt(inputString.length() - 1);
String mid = inputString.substring(1, inputString.length() - 1);
return (firstChar == lastChar) && isPalindrome(mid);
}
}
今必要なのは、単純なJUnitテストだけです。
@Test
public void whenEmptyString_thenAccept() {
Palindrome palindromeTester = new Palindrome();
assertTrue(palindromeTester.isPalindrome(""));
}
JUnitを使用してテストを実行すると、JaCoCoエージェントが自動的に起動するため、ターゲットディレクトリのbinary formatにカバレッジレポートが作成されます–target/jacoco.exec.
当然のことながら、出力を単独で解釈することはできませんが、他のツールやプラグインでは次のことができます。 Sonar Qube。
幸いなことに、jacoco:reportの目標を使用して、読み取り可能なコードカバレッジレポートをいくつかの形式で生成できます。 HTML、CSV、およびXML。
たとえば、target/site/jacoco/index.htmlページを見て、生成されたレポートがどのように表示されるかを確認できます。
レポートで提供されるリンク–Palindrome.javaをたどると、各Javaクラスのより詳細なビューをドリルスルーできます。
EclEmma Eclipse pluginのおかげで、Eclipse内のJaCoCoを使用してzero configurationでコードカバレッジを簡単に管理できることに注意してください。
4. レポート分析
私たちのレポートは、21%の命令カバレッジ、17%のブランチカバレッジ、cyclomatic complexityの3/5などを示しています。
レポートでJaCoCoによって示される38の命令は、通常のJavaコード命令とは対照的にbytecode instructionsを参照します。
JaCoCoレポートは、分岐の色と線の背景色のひし形を使用して、コードカバレッジを視覚的に分析するのに役立ちます。
-
Red diamondは、テストフェーズ中にブランチが実行されていないことを意味します。
-
Yellow diamondは、コードが部分的にカバーされていることを示しています–一部のブランチは実行されていません。
-
Green diamondは、テスト中にすべてのブランチが実行されたことを意味します。
同じ色コードが背景色に適用されますが、ラインカバレッジに適用されます。
JaCoCoは、主に3つの重要なメトリックを提供します。
-
Lines coverageは、テストによって呼び出されたJavaバイトコード命令の数に基づいて実行されたコードの量を反映します。
-
Branches coverageは、コード内で実行されたブランチの割合を示します。通常、if/elseおよびswitchステートメントに関連します。
-
Cyclomatic complexityは、線形結合によってコード内のすべての可能なパスをカバーするために必要なパスの数を与えることにより、コードの複雑さを反映しています。
簡単な例を挙げると、コードにifまたはswitchステートメントがない場合、コード全体をカバーするために必要な実行パスは1つだけなので、循環的複雑度は1になります。
一般に、循環的複雑度は、コード全体をカバーするために実装する必要があるテストケースの数を反映しています。
5. コンセプトの内訳
JaCoCoはJava agentとして実行され、テストの実行中はinstrumenting the bytecodeを担当します。 JaCoCoは各命令を詳しく調べ、各テスト中にどの行が実行されるかを示します。
カバレッジデータを収集するために、JaCoCoはその場でコードインストルメンテーションにASMを使用し、プロセスのJVM Tool Interfaceからイベントを受信します。
JaCoCoエージェントをサーバーモードで実行することもできます。この場合、jacoco:dumpを目標としてテストを実行し、ダンプ要求を開始できます。
JaCoCo設計の詳細については、official documentation linkをたどることができます。
6. コードカバレッジスコア
JaCoCoがどのように機能するかについて少し理解できたので、コードカバレッジスコアを改善しましょう。
100%のコードカバレッジを実現するには、最初のレポートに表示されていない部分をカバーするテストを導入する必要があります。
@Test
public void whenPalindrom_thenAccept() {
Palindrome palindromeTester = new Palindrome();
assertTrue(palindromeTester.isPalindrome("noon"));
}
@Test
public void whenNearPalindrom_thanReject(){
Palindrome palindromeTester = new Palindrome();
assertFalse(palindromeTester.isPalindrome("neon"));
}
これで、コード全体をカバーするのに十分なテストがあると言えますが、それを確認するために、Mavenコマンドmvn jacoco:reportを実行してカバレッジレポートを公開しましょう。
ご覧のとおり、コード内のすべての行/ブランチ/パスは完全にカバーされています。
実際のプロジェクトでは、開発がさらに進むにつれて、コードカバレッジスコアを追跡する必要があります。
JaCoCoは、満たす必要があるminimum requirementsを宣言する簡単な方法を提供します。そうしないと、ビルドが失敗します。
これを行うには、pom.xmlファイルに次のcheckゴールを追加します。
jacoco-check
check
PACKAGE
LINE
COVEREDRATIO
0.50
ご想像のとおり、ここではラインカバレッジの最小スコアを50%に制限しています。
jacoco:checkの目標はboundからverifyであるため、Mavenコマンド–mvn clean verifyを実行して、ルールが尊重されているかどうかを確認できます。 ログには次のように表示されます。
[ERROR] Failed to execute goal org.jacoco:jacoco-maven-plugin:0.7.7.201606060606:check
(jacoco-check) on project mutation-testing: Coverage checks have not been met.
7. 結論
この記事では、JaCoComavenプラグインを使用してJavaプロジェクトのコードカバレッジレポートを生成する方法を説明しました。
ただし、100% code coverage does not necessary reflects effective testingは、テスト中に実行されたコードの量のみを反映するため、注意してください。 前回の記事では、通常のcode coverageと比較して、テストの有効性を追跡するためのより洗練された方法としてmutation testingについて説明しました。
リンクされたGitHub projectで、この記事で提供されている例を確認できます。