Qiitaの記事をもとに、MavenのJavaプロジェクトでJaCoCoのカバレッジレポートをSonarQubeへ取り込む方法を紹介します。

サンプルプロジェクト

1
2
git clone https://github.com/wenhan-sonar/maven-example
cd maven-example

プロジェクトには src/main/java/com/example/MyClass.java、src/test/java/com/example/MyClassTest.java、MavenとJaCoCoの設定を含む pom.xml があります。

JaCoCoレポートを生成する

JaCoCo Maven Pluginの prepare-agent でテスト実行時に計測し、report goalでXMLレポートを作成します。原文の設定例は次の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.11</version>
  <executions>
    <execution>
      <id>prepare-agent</id>
      <goals><goal>prepare-agent</goal></goals>
    </execution>
    <execution>
      <id>report</id>
      <phase>test</phase>
      <goals><goal>report</goal></goals>
    </execution>
  </executions>
</plugin>

テストとレポート生成を実行します。

1
mvn clean verify

実行後、target/jacoco.exec に計測データ、target/site/jacoco/jacoco.xml にXML形式のレポートが生成されます。

SonarQubeへ送信する

SonarQubeサーバーURL、認証トークン、プロジェクトキーを指定して解析を実行します。

1
2
3
4
mvn sonar:sonar \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=<your-token> \
  -Dsonar.projectKey=maven-example-01

成功ログに JaCoCo XML Report Importer と ANALYSIS SUCCESSFUL が表示されれば、レポートが取り込まれています。

SonarQubeで結果を確認する

プロジェクトのダッシュボードでカバレッジ率を確認できます。例の MyClass には coveredMethod() と uncoveredMethod() があり、テストでは前者だけを呼び出します。そのためカバレッジは50%となり、コードビューでは実行された行と未実行の行が色分けされます。

SonarQubeダッシュボードのカバレッジ率

コード行ごとのカバレッジ表示

JavaではJaCoCoやCobertura、JavaScript/TypeScriptではLCOV、.NETではVisual Studio Code CoverageやOpenCover、PythonではCoverage.py、PHPではClover XML、Goでは標準カバレッジ形式などを利用できます。基本的な連携は、レポートを生成し、SonarScannerにそのパスを指定する流れです。

まとめ

JaCoCoとSonarQubeを連携すると、CI/CDでテストカバレッジを継続して確認できます。行単位の可視化によって、どのコードがテストされていないかを把握しやすくなります。