添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在本文中,我们将了解如何从 JaCoCo 测试覆盖率报告中排除某些类和包。 通常,排除的候选对象可以是配置类、POJO、DTO 以及生成的字节码。这些不带有特定的业务逻辑,将它们从报告中排除以提供更好的测试覆盖率视图可能很有用。 我们将在 Maven 和 Gradle 项目中探索各种排除方式。

2. 例子

让我们从一个示例项目开始,其中我们已经包含了测试所涵盖的所有必需代码。 接下来,我们将通过运行 mvn clean package mvn jacoco:report 生成覆盖率报告:

在这里,此报告显示我们已经拥有所需的覆盖率,并且应该从 JaCoCo 报告指标中排除错过的指令。

3. 排除使用插件配置

可以 使用标准 * 和 ? 排除类和包 插件配置中的 通配符语法:

  • * 匹配零个或多个字符
  • ** 匹配零个或多个目录
  • ? 匹配单个字符
  • 3.1. Maven 配置

    让我们更新 Maven 插件以添加几个排除模式:

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

    在这里,我们指定了以下排除项:

  • com.blogdemo 包下任何子包中的 排除 POJO 类
  • com.blogdemo 包下任何子包中名称以 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/blogdemo/**/ExcludedPOJO.class",
                    "com/blogdemo/**/*DTO.*",
                    "**/config/*"
    

    上面,我们使用闭包来遍历类目录并消除与指定模式列表匹配的文件。因此,使用 ./gradlew jacocoTestReport 或*./gradlew clean test 生成报告将按预期排除所有指定的类和包。 值得注意的是,JaCoCo 插件绑定到此处的 测试*阶段,该阶段在生成报告之前运行所有测试。

    4. 使用自定义注解排除

    从 JaCoCo 0.8.2 开始,我们可以通过使用具有以下属性的** 自定义注解 来注解类和方法来排除它们:**

  • 注解的名称应包括 Generated
  • 注解的保留策略应该是 RUNTIME CLASS
  • 首先,让我们创建我们的注解:

    @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 会忽略所有使用此注解进行注解的构造,并且它们不会显示在报告中。 最后,我们可以在应用上面显示的所有排除技术后看到报告: