MavenマルチモジュールプロジェクトでJacocoを使ってカバレッジをまとめて集計

この記事では複数のモジュールから構成されるMavenプロジェクトで、Jacocoを用いテストカバレッジをまとめて集計する方法を紹介します。

Jacocoでカバレッジを取得する

JacocoとはJavaのテストカバレッジ集計ツールです。Mavenプロジェクトの構成が単体のモジュールからなる場合、pom.xml へJacocoプラグインを設定するだけでカバレッジの集計を行ってくれます。おおまかにはjacoco:prepare-agentjacoco.execという実行ファイルを生成、jacoco:reportではこの実行ファイルを用いて集計結果をhtmlなどで生成するという流れです。

<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
<executions>
<!--実行ファイル jacoco.execの生成-->
    <execution>
        <id>prepare-agent</id>
        <goals>
            <goal>prepare-agent</goal>
        </goals>
    </execution>
<!--execファイルからレポートを生成-->     
    <execution>
        <id>report</id>
        <phase>prepare-package</phase>
        <goals>
            <goal>report</goal>
        </goals>
    </execution>
</executions>
</plugin>

www.baeldung.com

マルチモジュールプロジェクトでまとめてカバレッジ集計

マルチモジュールのMavenプロジェクトの場合、前項の設定を各モジュールの子pomで設定すると、出力されるレポートが各モジュールに散らばってしまうという問題があります。ここではマルチモジュールの構成として、以下のようなプロジェクトを考えます。

parent/
┣ pom.xml
┣ child1/pom.xml
┗ child2/pom.xml

子pomの設定

各子pomに以下の設定を追加します。jacoco:prepare-agentにより各子モジュールの target/ 以下に jacoco.exec を生成します。シングルモジュールプロジェクトの際に設定していたjacoco:reportがないことに注意してください。これはレポート出力を親pomで一括で実行するためです。

<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
<executions>
<!--実行ファイル jacoco.execの生成-->
<!--子ではまだレポートは生成しない-->     
    <execution>
        <id>prepare-agent</id>
        <goals>
            <goal>prepare-agent</goal>
        </goals>
    </execution>
</executions>
</plugin>

親pomの設定

次に親pomの設定を行います。親pomでは子pomで生成した *.exec の実行ファイルからレポートを出力します。dependency内のgroupId, artifactId, versionは子pomで設定している値を入力し、各子モジュールを指定します。これにより、各子で生成したjacoco.execを参照することが可能となります。

次に子で実行していなかった jacoco:report に対応するコマンドの設定を親pomで行います。 親pomでは jacoco:reportに代わり、jacoco:report-aggregateを設定することで、プロジェクト全体のカバレッジレポートをまとめて集計することができます。

    <dependencies>

        <!--child1 の pom.xmlの設定を入力-->     
        <dependency>
            <groupId>com.chari_ngo.sample</groupId>
            <artifactId>child1</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

        <!--child2 の pom.xmlの設定を入力-->     
        <dependency>
            <groupId>com.chari_ngo.sample</groupId>
            <artifactId>child2</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

<!--各モジュールのexecファイルから統合されたレポートを生成-->     
    <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.4</version>
                <executions>
                    <execution>
                        <id>report-aggregate</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>report-aggregate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

カバレッジの出力

pomの設定が完了したら、mvnコマンドを実行することでカバレッジを集計することができます。 parent/target/site/jacoco-aggregate にhtmlファイルとしてカバレッジレポートが生成されます。

$ mvn clean test jacoco:report-aggregate