1. 序章

この記事では、JaCoCoテストカバレッジレポートから特定のクラスとパッケージを除外する方法を説明します。

一般に、除外の候補は、構成クラス、POJO、DTO、および生成されたバイトコードです。 これらには特定のビジネスロジックがないため、テストカバレッジをより適切に把握するために、レポートから除外すると便利な場合があります。

MavenプロジェクトとGradleプロジェクトの両方でさまざまな除外方法を検討します。

2. 例

必要なすべてのコードがすでにテストでカバーされているサンプルプロジェクトから始めましょう。

次に、 mvn cleanpackageまたはmvnjacoco:report を実行して、カバレッジレポートを生成します。

ここで、このレポートは、必要なカバレッジがすでにあることを示しています。欠落した指示は、JaCoCoレポートのメトリックから除外する必要があります。

3. プラグイン構成の使用を除く

クラスとパッケージは標準の*および?を使用して除外 ワイルドカード構文プラグイン構成:

  • *0個以上の文字に一致
  • **0個以上のディレクトリに一致します
  • ? 単一の文字に一致します

3.1. Maven構成

Mavenプラグインを更新して、いくつかの除外されたパターンを追加しましょう。

<plugin> 
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>com/baeldung/**/ExcludedPOJO.class</exclude>
            <exclude>com/baeldung/**/*DTO.*</exclude>
            <exclude>**/config/*</exclude>
        </excludes>
     </configuration>
     ...
</plugin>

ここでは、次の除外を指定しました。

  • com.baeldungパッケージの下のサブパッケージのExcludedPOJOクラス
  • com.baeldungパッケージのサブパッケージにあるDTOで終わる名前のすべてのクラス
  • ルートまたはサブパッケージの任意の場所で宣言されたconfigパッケージ

3.2. Gradle構成

Gradleプロジェクトでも同じ除外を適用できます。

まず、 build.gradle のJaCoCo構成を更新し、前と同じパターンを使用して除外のリストを指定しましょう。

jacocoTestReport {
    dependsOn test // tests are required to run before generating the report
    
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                "com/baeldung/**/ExcludedPOJO.class",
                "com/baeldung/**/*DTO.*",
                "**/config/*"
            ])
        }))
    }
}

上記では、クロージャを使用してクラスディレクトリをトラバースし、指定されたパターンのリストに一致するファイルを削除します。 その結果、 ./ gradlewjacocoTestReportまたは./gradlewclean test を使用してレポートを生成すると、指定されたすべてのクラスとパッケージが期待どおりに除外されます。

JaCoCoプラグインは、レポートを生成する前にすべてのテストを実行するtestフェーズにバインドされていることに注意してください。

4. カスタムアノテーションを除く

JaCoCo 0.8.2以降、次のプロパティを持つカスタムアノテーションでクラスとメソッドにアノテーションを付けることにより、クラスとメソッドを除外できます。

  • 注釈の名前には、Generatedを含める必要があります。
  • アノテーションの保持ポリシーは、ランタイムまたはクラスである必要があります。

まず、アノテーションを作成しましょう。

@Documented
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Generated {
}

これで、カバレッジレポートから除外する必要のあるクラスまたはメソッドに注釈を付けることができます。

まず、このアノテーションをクラスレベルで使用しましょう。

@Generated
public class Customer {
    // everything in this class will be excluded from jacoco report because of @Generated
}

同様に、このカスタムアノテーションをクラス内の特定のメソッドに適用することもできます。

public class CustomerService {

    @Generated
    public String getCustomerId() {
        // method excluded form coverage report
    }
    
    public String getCustomerName() {
        // method included in test coverage report
    }
}

5. Lombokで生成されたコードを除く

Project Lombok は、Javaプロジェクトの定型的で反復的なコードを大幅に削減するための人気のあるライブラリです。

最後に、プロジェクトのルートディレクトリにあるlombok.configファイルにプロパティを追加して、Lombokで生成されたすべてのバイトコードを除外する方法を見てみましょう。

lombok.addLombokGeneratedAnnotation = true

基本的に、このプロパティは、lombok。@Generated アノテーションを、Lombokアノテーションでアノテーションが付けられたすべてのクラスの関連するメソッド、クラス、およびフィールドに追加します。 Productクラス。 その結果、JaCoCoは、この注釈で注釈が付けられたすべての構成を無視し、レポートには表示されません。

最後に、上記のすべての除外手法を適用した後、レポートを確認できます。

6. 結論

この記事では、JaCoCoテストレポートから除外を指定するさまざまな方法について説明しました。

最初に、プラグイン構成で命名パターンを使用して、いくつかのファイルとパッケージを除外しました。 次に、 @Generated を使用して、特定のクラスとメソッドを除外する方法を確認しました。 最後に、構成ファイルを使用して、Lombokで生成されたすべてのコードをテストカバレッジレポートから除外する方法を確認しました。

いつものように、MavenソースコードGradleソースコードはGithubで入手できます。