一、简介

在本文中,我们将了解如何从JaCoCo测试覆盖率报告中排除某些类和包。

一般来说,排除的候选对象可以是配置类、POJO、DTO 以及生成的字节代码。这些没有特定的业务逻辑,将它们从报告中排除以提供更好的测试覆盖率视图可能很有用。

我们将探索 Maven 和 Gradle 项目中的各种排除方式。

2. 示例

让我们从一个示例项目开始,其中测试已经涵盖了所有必需的代码。

接下来,我们将通过运行 mvn clean packagemvn jacoco:report 生成覆盖率报告:

在此,此报告显示我们已经具备所需的覆盖范围,并且应将遗漏的指令从 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 包下任何子包中的 POJO 类
  • com.baeldung 包下任何子包中名称以 DTO 结尾的所有类
  • 在根包或子包中的任何位置声明的 配置

3.2.等级配置

我们还可以在 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/*"
            ])
        }))
    }
}

上面,我们使用闭包来遍历类目录并消除与指定模式列表匹配的文件。因此,使用 ./gradlew jacocoTestReport./gradlew clean test 生成报告将按预期排除所有指定的类和包。

值得注意的是,JaCoCo 插件绑定到此处的 测试 阶段,该阶段在生成报告之前运行所有测试。

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

基本上,此属性将 [email protected] 注释添加到所有用 Lombok 注释注释的类(例如 Product 类)的相关方法、类和字段中。因此,JaCoCo 会忽略所有用此注释注释的构造,并且它们不会显示在报告中。

最后,我们可以看到应用上面显示的所有排除技术后的报告:

六,结论

在本文中,我们研究了从 JaCoCo 测试报告中指定排除项的各种方法。

最初,我们在插件配置中使用命名模式排除了几个文件和包。然后,我们了解了如何使用 @Generate 来排除某些类和方法。最后,我们研究了如何使用配置文件从测试覆盖率报告中排除所有 Lombok 生成的代码。

与往常一样, Maven 源代码Gradle 源代码可在 Github 上获取。