我将如何添加注释以从 jacoco 代码覆盖率报告中排除方法?

How would I add an annotation to exclude a method from a jacoco code coverage report?

我在 Java 中有一些代码想从代码覆盖范围中排除。我该怎么做?我希望能够添加注释。有没有办法配置或扩展 jacoco(在 gradle 中使用)来使用它?

示例:

public class Something
{
    @ExcludeFromCodeCoverage
    public void someMethod() {}
}

I have some code in Java that I want to exclude from code coverage. How would I do this? I want to be able to add an annotation. Is there a way to configure or extend jacoco (as used in gradle) to use this?

截至今天,最新发布的 JaCoCo 版本 (0.7.9) 中没有此类功能。只能排除整个类。

在第 https://github.com/jacoco/jacoco/wiki/FilteringOptions#annotation-based-filtering 页(专供开发人员使用)上,这被记录为未来版本的想法。

官方 JaCoCo 文档包含有关如何获取最新未发布版本的信息以及 未发布更改列表 下一个版本 - http://www.jacoco.org/jacoco/trunk/doc/changes.html,其中包括各种过滤器,其中其中过滤由 Lombok 和 Groovy 生成并分别由注释 lombok.Generatedgroovy.transform.Generated 标记的方法。您可能会滥用它,但出于多种原因我不建议这样做。

Tl;dr

使用 Lombok 中的注释 @lombok.Generated

说明

Jacoco 与 Lombok 集成。默认情况下,Lombok 生成的代码被排除在 Jacoco 覆盖范围之外(请参阅 Jacoco 更新日志中的 版本 0.8.0)。您可以在您的方法中滥用 lombok.Generated,因为它被排除在覆盖率报告之外。

JaCoCo 的 0.8.2 版本中添加了新功能,它过滤掉了 类 和 @Generated 注释的方法。有关详细信息,请参阅以下文档:

Classes and methods annotated with annotation whose retention policy is runtime or class and whose simple name is Generated are filtered out during generation of report (GitHub #731).

JaCoCo 0.8.2 Release Notes

您可以在项目的根目录中将lombok.addLombokGeneratedAnnotation = true设置为lombok.config。之后,所有 Lombok 生成的代码将被 Jacoco 忽略。

在 Project Lombok 文档中查看更多内容:https://projectlombok.org/features/configuration

由于没有直接的答案,所以做了一些研究并发现了这个 PR。

https://github.com/jacoco/jacoco/pull/822/files

  private static boolean matches(final String annotation) {
    final String name = annotation
            .substring(Math.max(annotation.lastIndexOf('/'),
                    annotation.lastIndexOf('$')) + 1);
    return name.contains("Generated")
  }

您可以创建任何名称包含“已生成”的注释。我在我的代码库中创建了以下内容,以排除方法被包含在 Jacoco 报告中。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExcludeFromJacocoGeneratedReport {}

在您的方法中使用此注解使其免于覆盖,如下所示。

public class Something
{
    @ExcludeFromJacocoGeneratedReport
    public void someMethod() {}
}

按照@mohamed-anees-a 方法,我得到了这个 kotlin 版本:

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class ExcludeFromJacocoGeneratedReport