1. ホーム
  2. maven

[解決済み] マルチモジュールのMaven + Sonar + JaCoCoがマージされたカバレッジレポートを提供するように設定する方法は?

2022-04-27 05:18:25

質問

この件に関しては、インターネットをくまなく検索してみました。多くの中途半端な答えがあり、次のようなMavenプロパティに関係しています。 ${sonar.jacoco.reportPath} または org.jacoco:jacoco-maven-plugin:prepare-agent または設定 maven-surefire-plugin argLine-javaagent .

なぜか、これらの回答は、単独でも、組み合わせても、私が求めているものが出てきません。 カバレッジレポートでは、そのクラスが DAO で使用されるエンティティなど、より上位のテストで使用されている場合、そのクラスがそれ自身のモジュール内のテストでは完全にカバーされていなくても、カバーされていると表示されます。

これを実現するための決定的なコンフィグはどこかにあるのでしょうか、お願いします。

解決方法は?

私も同じ状況でした。多くの人が同じ問題を抱えているようですが、誰もそれを解決する方法を完全に説明することを気にしないので、インターネット上に散らばる半分の答えは非常に迷惑なものでした。

その Sonarドキュメント を参照してください。 GitHubプロジェクトとその例 が参考になります。これを解決するために私が行ったのは、統合テストのロジックを通常のユニットテストに適用することでした(適切なユニットテストはサブモジュールに固有であるべきですが、これは常にそうとは限りません)。

親であるpom.xmlに、以下のプロパティを追加します。

<properties>
    <!-- Sonar -->
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.language>java</sonar.language>
</properties>

これは、Sonarが同じ場所(親プロジェクト内のターゲットフォルダ)にあるすべてのサブモジュールのユニットテストレポートをピックアップするようにします。また、Sonarは独自にレポートを作成するのではなく、手動で実行したレポートを再利用するように指示します。jacoco-maven-pluginを親pomのbuild/plugins内に配置し、すべてのサブモジュールで実行するようにするだけです。

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.0.201210061924</version>
    <configuration>
        <destFile>${sonar.jacoco.reportPath}</destFile>
        <append>true</append>
    </configuration>
    <executions>
        <execution>
            <id>agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
    </executions>
</plugin>

destFile は、レポートファイルをSonarが探す場所に配置し append は、ファイルを上書きするのではなく、ファイルに追加するようにします。これにより、すべてのサブモジュールのJaCoCoレポートが同じファイルにまとめられます。

Sonarはそのファイルを各サブモジュールについて調べます。これは、上記で指定したものであり、Sonarの複数モジュールファイルのユニットテスト結果を結合したものを提供します。