0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SonarQubeでテストカバレッジ(網羅率)を可視化する:実践ガイド

0
Posted at

この記事は、コード品質管理プラットフォーム 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%)が表示されます。
image.png

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() の行は赤色(カバレッジなし)でハイライト表示されます。

これにより、どの行のテストが不足しているかが一目瞭然となります。
image.png


まとめ

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)、OpenCoverCoverlet
Python Coverage.py (XML形式のレポート)
PHP PHPUnit (Clover XML形式のレポート)
Go Go Coverage Tool (標準形式のレポート)

どのツールを使用する場合でも、基本的には「カバレッジツールでレポートをXMLなどの指定された形式で出力」し、「SonarScannerのプロパティでそのレポートファイルのパスを指定」するという連携の流れは共通しています。

この可視化を通じて、「どのコードのテストが不足しているか」 という具体的な課題を把握し、より品質の高いソフトウェア開発を推進していきましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?