Jacoco 報告中的排除

    一、簡介

    在本文中,我們將看到如何從 JaCoCo 測試覆蓋率報告中排除某些類和包。

    通常,排除的候選對象可以是配置類、POJO、DTO 以及生成的字節碼。這些不包含特定的業務邏輯,將它們從報告中排除以提供更好的測試覆蓋率視圖可能會很有用。

    我們將探索 Maven 和 Gradle 項目中的各種排除方法。

    2. 例子

    讓我們從一個示例項目開始,其中所有必需的代碼已經被測試覆蓋。

    接下來,我們將通過運行mvn clean packagemvn jacoco:report生成覆蓋率報告:

    Jacoco

    在這裡,此報告顯示我們已經擁有所需的覆蓋範圍,並且應該從 JaCoCo 報告指標中排除遺漏的指令。

    3. 排除使用插件配置

    可以使用標準 * 和 ?**插件配置中的通配符語法:**

    • * 匹配零個或多個字符
    • ** 匹配零個或多個目錄
    • ?匹配單個字符

    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
    • com.baeldung包下的任何子包中DTO結尾的所有類
    • 在根或子包中的任何位置聲明的config

    3.2.搖籃配置

    我們也可以在 Gradle 項目中應用相同的排除項。

    首先,讓我們更新的JaCoCo配置build.gradle並指定排除列表,使用相同的圖案,如前面:

    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/*"
     ])
     }))
     }
     }

    上面,我們使用閉包來遍歷類目錄並消除與指定模式列表匹配的文件。因此,使用./gradlew jacocoTestReport./gradlew clean test生成報告將按預期排除所有指定的類和包。

    值得注意的是,JaCoCo 插件綁定到test階段,它在生成報告之前運行所有測試。

    4. 排除自定義註解

    從 JaCoCo 0.8.2 開始,我們可以通過使用具有以下屬性的自定義註釋來註釋它們來排除類和方法:

    • 註釋的名稱應包括Generated
    • 註解的保留策略應該是runtimeclass.

    首先,讓我們創建註釋:

    @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

    基本上,此屬性將[email protected]註釋添加到所有使用 Lombok 註釋註釋的類的相關方法、類和字段,例如Product類。因此,JaCoCo 會忽略所有使用此批註進行批註的構造,並且它們不會顯示在報告中。

    最後,我們可以在應用上述所有排除技術後看到報告:

    Jacoco

    六,結論

    在本文中,我們研究了從 JaCoCo 測試報告中指定排除項的各種方法。

    最初,我們在插件配置中使用命名模式排除了幾個文件和包。然後,我們看到瞭如何使用@Generated排除某些類和方法。最後,我們研究瞭如何使用配置文件從測試覆蓋率報告中排除所有 Lombok 生成的代碼。

    與往常一樣, Maven 源代碼Gradle 源代碼可在 Github 上獲得。