JaCoCoの紹介

1概要

  • コードカバレッジ** は、自動テスト中に何行のコードが実行されたかを測定するために使用されるソフトウェアメトリックです。

この記事では、Javaプロジェクト用のコードカバレッジレポートジェネレータである JaCoCo を使用する際の実際的な側面について説明します。

2 Mavenの設定

JaCoCoを使いこなすには、このhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.jacoco%22%20AND%20a%3A%を宣言する必要があります。 22jacoco-maven-plugin%22[mavenプラグイン]私たちの pom.xml ファイル内:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.7.201606060606</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

以前に提供されたリンクは常にあなたに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エージェントが自動的に起動します。したがって、対象ディレクトリ - target/jacoco.exec. バイナリ形式 でカバレッジレポートが作成されます。

明らかに私たちは片手で出力を解釈することはできませんが、他のツールやプラグインはできます

良いニュースは、読みやすいコードカバレッジレポートをいくつかのフォーマットで生成するために jacoco:report 目標を使用できることです。 HTML、CSV、およびXML

生成されたレポートがどのように見えるかを見るために target/site/jacoco/index.html pageを見てみましょう。

カバレッジ

  • Palindrome.java ** というレポートで提供されているリンクをたどると、各Javaクラスのより詳細なビューにドリルスルーできます。

画像、幅= 644、高さ= 232

EclEmma Eclipse plugin のおかげで、 ゼロ設定 でEclipse内のJaCoCoを使ってコードカバレッジを簡単に管理できることに注意してください。

4レポート分析

私たちのレポートは、21%の命令カバレッジ、17%のブランチカバレッジ、3/5 巡回複雑度 などを示しています。

レポートでJaCoCoによって示されている38の命令は、通常のJavaコード命令とは対照的に バイトコード命令 を参照しています。

JaCoCoレポートは、枝に色、線に背景色のダイヤモンドを使用してコードカバレッジを視覚的に分析するのに役立ちます。

  • 赤いひし形 は、その間にブランチが実行されていないことを意味します。

テストフェーズ

  • 黄色のひし形 は、コードの一部が隠されていることを示しています。

枝は行使されていない。

  • 緑色のひし形 は、その間にすべての支店が行使されたことを意味します。

テスト。

同じカラーコードが背景色にも適用されますが、ラインカバレッジに適用されます。

JaCoCoは主に3つの重要な指標を提供します。

  • 行カバレッジ は、実行されたコードの量を反映しています

テストによって呼び出されたJavaバイトコード命令の数に基づきます。

  • 支店のカバレッジ は、支店の行使支店の割合を示しています

コード - 通常は if/else および switch ステートメントに関連します。

  • 循環的な複雑さ は、

線形結合によってコード内のすべての可能なパスをカバーするために必要なパスの数。

簡単な例を挙げると、コード内に if または switch ステートメントがない場合、コード全体をカバーする実行パスは1つだけでよいため、循環的複雑度は1になります。

一般に、循環的な複雑さは、コード全体を網羅するために実装する必要があるテストケースの数を反映しています。

5概念の内訳

JaCoCoは Javaエージェント として動作し、テストの実行中に** バイトコードのインスツルメンテーションを担当します。 JaCoCoは各命令を詳しく調べ、各テスト中にどの行が実行されるかを示します。

カバレッジデータを収集するために、JaCoCoはその場でコード計測にhttp://asm.ow2.org/[ASM]を使用し、http://docs.oracle.com/javase/7/docs/technotes/guidesからイベントを受け取ります/jvmti/[ JVM Tool Interface ]プロセス内:

jacocoの概念

JaCoCoエージェントをサーバーモードで実行することもできます。この場合は、 jacoco:dump を目標としてテストを実行し、ダンプ要求を開始します。

JaCoCoデザインの詳細については、http://www.eclemma.org/jacoco/trunk/doc/implementation.html[公式文書リンク]を参照してください。

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 を実行してカバレッジレポートを公開しましょう。

coverage

ご覧のとおり、コード内のすべての行/ブランチ/パスは完全にカバーされています。

coverage

現実のプロジェクトでは、そして開発がさらに進むにつれて、コードカバレッジスコアを追跡する必要があります。

JaCoCoは、満たすべき 最小要件 を宣言する簡単な方法を提供します。そうでなければビルドは失敗します。

これを行うには、 pom.xml ファイルに次の check 目標を追加します。

<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.50</minimum>
                    </limit>
                </limits>
            </rule>
        </rules>
    </configuration>
</execution>

ご想像のとおり、ここでは回線カバレッジの最小スコアを50%に制限しています。

jacoco:check の目標は 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. 結論

この記事では、JaCoCo Mavenプラグインを使用してJavaプロジェクトのコードカバレッジレポートを生成する方法を説明しました。

ただし、 100%のコードカバレッジは、テスト中に実行されたコードの量を反映しているだけなので、必ずしも有効なテスト を反映しているわけではありません。前回の記事では、通常の コードカバレッジ と比較してテストの有効性を追跡するためのより洗練された方法として、** 突然変異テスト について話しました。

この記事で提供されている例は、リンクされた GitHubプロジェクト で確認できます。