この記事は、コード品質管理プラットフォーム SonarQube を活用するための技術解説シリーズの一部です。
SonarQubeをより深く活用したい方は、以下の関連記事もぜひご覧ください。
この記事は、SonarQube を利用してプロジェクトのテストカバレッジ(網羅率) 情報を連携し、コード品質の管理を強化したいと考えているエンジニア向けに書かれています。
今回は、GitHubのサンプルプロジェクト(wenhan-sonar/maven-example)を題材に、JaCoCoで生成したカバレッジレポートをSonarQubeに反映させる具体的な手順を、実行可能なコマンドとログを含めて解説します。
1. サンプルプロジェクトの確認
本記事で利用するプロジェクトは、以下のGitHubリポジトリをクローンしたものとします。
$ git clone https://github.com/wenhan-sonar/maven-example
$ cd maven-example
重要なファイルパス
| ファイル | 役割 | 内容 |
|---|---|---|
src/main/java/com/example/MyClass.java |
プロダクションコード | 2つのメソッドを持つクラス。 |
src/test/java/com/example/MyClassTest.java |
単体テストコード |
MyClass のテスト。 |
pom.xml |
ビルド設定 | Maven、JaCoCo、SonarQubeの設定ファイル。 |
2. JaCoCoの設定とレポート生成
カバレッジ計測には JaCoCo (Java Code Coverage) を使用します。
2.1. pom.xml の設定
サンプルの pom.xml には、すでに以下の重要な設定がされています。これにより、テスト実行時にカバレッジデータが生成されます。
<project ...>
...
<properties>
<sonar.jacoco.reportPaths>${project.build.directory}/jacoco.exec</sonar.jacoco.reportPaths>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
...
<build>
<plugins>
<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>
</plugins>
</build>
...
</project>
2.2. カバレッジレポートの実行
この設定に基づき、テストを実行して カバレッジレポート を生成します。
# clean: クリーンアップ
# verify: テストを実行し、JaCoCoエージェントがカバレッジデータを収集
$ mvn clean verify
実行ログの確認:
ログの最後に、JaCoCoレポートが生成されたことが確認できます。
[INFO] --- jacoco:0.8.11:report (report) @ sonarscanner-maven-basic ---
[INFO] Loading execution data file /path/to/maven-example/target/jacoco.exec
[INFO] Analyzed bundle 'Example of basic Maven project' with 2 classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
これにより、target/jacoco.exec にバイナリのカバレッジデータが生成され、target/site/jacoco/jacoco.xml にXMLレポートが生成されます。
3. SonarQubeへの連携実行
次に、生成されたカバレッジレポートをSonarQubeに送信して分析をトリガーします。
3.1. 必要なパラメーター
以下のプレースホルダーを、ご自身の環境に合わせて置き換えてください。
| パラメーター | 説明 | 例 |
|---|---|---|
sonar.host.url |
SonarQubeサーバーのURL | http://localhost:9000 |
sonar.login |
認証トークン(またはユーザー名とパスワード) | xxxxxxxxxxxxxxxx |
sonar.projectKey |
SonarQubeに登録するプロジェクトキー | maven-example-01 |
3.2. 分析コマンドの実行
pom.xml で設定されている Maven Sonarプラグイン を利用して分析を実行します。
# JaCoCoレポート生成後、続けて実行
$ mvn sonar:sonar \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=<Your SonarQube Token> \
-Dsonar.projectKey=maven-example-01
3.3. 連携成功ログ
SonarQubeへの分析結果送信が成功すると、ログに JaCoCoレポートを検出した 旨のメッセージが表示されます。
[INFO] Sensor SurefireSensor [java]
[INFO] Parsing /path/to/maven-example/target/surefire-reports
...
[INFO] Sensor JaCoCo XML Report Importer [jacoco]
[INFO] Importing 1 report(s).
[INFO] Coverage XML report file: /path/to/maven-example/target/site/jacoco/jacoco.xml
[INFO] Sensor JaCoCo XML Report Importer [jacoco] (done) | time=XXXms
...
[INFO] Analysis report uploaded in XXXms
[INFO] ANALYSIS SUCCESSFUL
4. SonarQube上での確認
分析が完了し、SonarQubeサーバーにアクセスすると、プロジェクトダッシュボードにカバレッジの結果が反映されていることを確認できます。
4.1. ダッシュボードのメトリクス
プロジェクトのトップ画面で、カバレッジ率(例:50.0%)が表示されます。

4.2. コードごとのカバレッジ詳細
カバレッジ率が50%になる理由を、サンプルコードを使って確認しましょう。
src/main/java/com/example/MyClass.java の内容:
package com.example;
public class MyClass {
public String coveredMethod() {
return "covered"; // (A) テストで実行される
}
public String uncoveredMethod() {
return "uncovered"; // (B) テストで実行されない
}
}
src/test/java/com/example/MyClassTest.java の内容:
package com.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MyClassTest {
@Test
void testCoveredMethod() {
MyClass myClass = new MyClass();
assertEquals("covered", myClass.coveredMethod());
// uncoveredMethod() は呼び出されていない
}
}
SonarQubeのコードビューでは、coveredMethod() の行は緑色(カバレッジあり)、uncoveredMethod() の行は赤色(カバレッジなし)でハイライト表示されます。
これにより、どの行のテストが不足しているかが一目瞭然となります。

まとめ
SonarQubeとJaCoCoを連携させることで、CI/CDパイプライン内でコードの品質とテスト網羅率を継続的に監視できるようになります。
今回の手順ではJava言語のJaCoCoを例に挙げましたが、SonarQubeは特定の言語やツールに依存せず、多くのカバレッジツールからのレポート取り込みをサポートしています。
SonarQubeがサポートする主要なカバレッジツール(一例)
プロジェクトの言語に応じて、以下の主要なカバレッジツールがサポートされています。
| 言語 | 主要なカバレッジツール |
|---|---|
| Java | JaCoCo (本記事で使用)、Cobertura |
| JavaScript/TypeScript | LCOV (Jest, Istanbulなどの出力形式) |
| .NET (C# / VB.NET) | Visual Studio Code Coverage (.coveragexml)、OpenCover、Coverlet |
| Python | Coverage.py (XML形式のレポート) |
| PHP | PHPUnit (Clover XML形式のレポート) |
| Go | Go Coverage Tool (標準形式のレポート) |
どのツールを使用する場合でも、基本的には「カバレッジツールでレポートをXMLなどの指定された形式で出力」し、「SonarScannerのプロパティでそのレポートファイルのパスを指定」するという連携の流れは共通しています。
この可視化を通じて、「どのコードのテストが不足しているか」 という具体的な課題を把握し、より品質の高いソフトウェア開発を推進していきましょう!