先ほど、OpenCloverを使ってMavenのシンプルなプロジェクト構成でカバレッジを取るエントリを書きました。
OpenCloverでカバレッジを取得する(Maven Simple Project編) - CLOVER
今度は、マルチプロジェクト構成でのカバレッジ取得を行いたいと思います。
シンプルなプロジェクト構成となにが変わるか?
最初に作ったシンプルなMavenプロジェクト構成の場合と異なるのは、カバレッジレポートを作成する際には各モジュールのカバレッジを
集約(aggregate)する必要があります。
サンプル構成
今回のサンプルは、次のようなMavenのマルチモジュール構成とします。
pom.xml module-calc/pom.xml module-message/pom.xml
各サブモジュールは、ふつうにテスト対象コード、テストコードで構成します。
まず、親となるpom.xmlの構成は次のように。
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.littlewings</groupId> <artifactId>openclover-multiple</artifactId> <packaging>pom</packaging> <version>0.0.1-SNAPSHOT</version> <modules> <module>module-calc</module> <module>module-message</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <reporting> <plugins> <plugin> <groupId>org.openclover</groupId> <artifactId>clover-maven-plugin</artifactId> </plugin> </plugins> </reporting> <build> <plugins> <plugin> <groupId>org.openclover</groupId> <artifactId>clover-maven-plugin</artifactId> <version>4.2.0</version> <executions> <!-- あとで --> </executions> </plugin> </plugins> </build> </project>
OpenCloverの設定は、親pom.xmlで行うこととします。executionsの設定については、また後で。
このあたりの構成は、OpenCloverのMaven Pluginのサンプル構成を参考にするとよいと思います。
openclover / clover-maven-plugin / source / src / it / multiproject — Bitbucket
openclover / clover-maven-plugin / source / src / it / multiproject / pom.xml — Bitbucket
openclover / clover-maven-plugin / source / src / it / multiproject / jar1 / pom.xml — Bitbucket
よって、各サブモジュールにはOpenCloverの設定は入れません。
各サブもジュールのpom.xmlの設定は、次のようにしておきます。
※アーティファクト名以外は同じなので、2つ目については省略します
module-calc/pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>openclover-multiple</artifactId> <groupId>org.littlewings</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>module-calc</artifactId> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.0.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.8.0</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.19</version> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-surefire-provider</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.0.1</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>
各ソースコードは、このように。
module-calc
module-calc/src/main/java/org/littlewings/example/modulecalc/CalcService.java
package org.littlewings.example.modulecalc; public class CalcService { public int add(int a, int b) { return a + b; } public int minus(int a, int b) { return a - b; } public int multiply(int a, int b) { return a * b; } }
テストコード。
module-calc/src/test/java/org/littlewings/example/modulecalc/CalcServiceTest.java
package org.littlewings.example.modulecalc; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; class CalcServiceTest { @Test public void add() { CalcService calcService = new CalcService(); assertThat(calcService.add(1, 2)).isEqualTo(3); } @Test public void multiply() { CalcService calcService = new CalcService(); assertThat(calcService.multiply(2, 3)).isEqualTo(6); } }
module-message
module-message/src/main/java/org/littlewings/example/modulemessage/MessageService.java
package org.littlewings.example.modulemessage; public class MessageService { public String format(String prefix, String message, String suffix) { return prefix + message + suffix; } public String format(String message) { return format("★", message, "★"); } }
テストコード。
module-message/src/test/java/org/littlewings/example/modulemessage/MessageServiceTest.java
package org.littlewings.example.modulemessage; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; class MessageServiceTest { @Test public void format() { MessageService messageService = new MessageService(); assertThat(messageService.format("Hello World")).isEqualTo("★Hello World★"); } }
これで、準備はOKです。
全体のカバレッジを取る
では、プロジェクト全体でカバレッジを取ってみましょう。
OpenCloverのMaven Pluginの設定は、とりあえず次のように「mvn test」に引っかけるようにしています。
<plugin> <groupId>org.openclover</groupId> <artifactId>clover-maven-plugin</artifactId> <version>4.2.0</version> <executions> <execution> <id>clover-instrument</id> <phase>generate-sources</phase> <goals> <goal>instrument</goal> </goals> </execution> <execution> <id>clover-test</id> <phase>test</phase> <goals> <goal>aggregate</goal> <goal>clover</goal> </goals> </execution> </executions> </plugin>
シンプルなプロジェクト構成の時は、これで「mvn test」を実行するとカバレッジレポートが作成されました。
今度は…
$ mvn clean test
本来は「target/site/clover」ディレクトリ配下にレポートができるのですが、そうはいかないようです。
$ find target/site/clover -type f | wc -l 1
サブモジュールの方については、レポートができています。
$ find module-calc/target/site/clover -type f | wc -l 152
index.htmlを開けば、サブモジュールについてはカバレッジレポートを参照することができます。
ただ、この設定では「mvn verify」をやっても全体のレポートは作ってくれません。
これで動かすためには、ゴールを変更した方が良さそうです。
openclover / clover-maven-plugin / source / src / it / multiproject / goals.txt — Bitbucket
こちらを参考に、設定はそのままで次のようにして実行。
$ mvn clean verify clover:instrument clover:aggregate clover:clover
これで、集約したレポートができあがります。
$ find target/site/clover -type f | wc -l 163
個別のモジュールのレポートも生成されています。
$ find module-calc/target/site/clover/ -type f | wc -l 152
なお、サブモジュール単体でレポートを作成したい場合は、次のように。
$ mvn -pl module-calc -am test
また、設定についてですが、こちらに倣って
このように設定して
<plugin> <groupId>org.openclover</groupId> <artifactId>clover-maven-plugin</artifactId> <version>4.2.0</version> <executions> <execution> <id>main</id> <phase>verify</phase> <goals> <goal>instrument</goal> <goal>aggregate</goal> </goals> </execution> <execution> <id>site</id> <phase>pre-site</phase> <goals> <goal>instrument</goal> <goal>aggregate</goal> </goals> </execution> </executions> </plugin>
次を実行してもOKです。
$ mvn clean verify clover:instrument clover:aggregate clover:clover
これでも、集約したレポートが生成されます。