我使用 jacoco 进行覆盖率报告。当我查看 jacoco 报告时,覆盖范围似乎不错。但在 Sonarqube 中,覆盖率很低,因为它说来自 lombok 的
@Data
注释未被测试覆盖。
编译的类被标记为
@Generated
但它不会被 Sonar 忽略。
如何排除分析中的
@Data
?
根据 JaCoCo 变更日志 - 从版本 0.8.0 开始,带有注释
@lombok.Generated
的方法将被自动过滤掉。
变更日志还指出:
直接读取 exec 文件并为此嵌入 JaCoCo 的工具(例如 SonarQube 或 Jenkins)只有在更新到此版本的 JaCoCo 后才会提供过滤功能。
直接读取exec文件(不是最终报告)并嵌入JaCoCo生成报告的工具只有更新到该版本的JaCoCo后才会提供过滤功能。因此,请关注/等待/等各个供应商,例如
我们作为 JaCoCo 项目的一部分开发的集成的相应版本 (0.8.0) 生成的报告(Ant 任务、Maven 插件和命令行界面)提供过滤功能。
截至今天(2018 年 1 月 30 日),https://jira.sonarsource.com/browse/SONARJAVA-2608 的修复应该包含在尚未发布的 SonarJava 插件版本 5.1 中。
一般来说,您不能只排除一两行,但是您可以做其他事情来获得 100% 的覆盖率。
使用
@Data
后覆盖率急剧下降的原因是它包含很多注释,如@ToString
、@EqualsAndHashCode
、@Getter
、@Setter
、@RequiredArgsConstructor
等。并且声纳开始寻找您的 bean/pojo 可能使用或不使用的所有这些方法。
有关
@Data
注释的详细信息 - https://projectlombok.org/features/Data
我只是假设,但是,如果您仅对 getter 和 setter 使用
@Data
注释,那么请使用 @Getter
和 @Setter
注释而不是 @Data
,我相信您会看到覆盖范围有所提高。
tl;dr:我的建议是忽略整个班级的报道。
理由:大多数数据类不包含“真实代码”。如果一个类仅由属性和
@Data
注释组成,那么您不会从覆盖范围中获得任何优势。如果你将逻辑放入类中,它可能不再是数据类 - 想想 SRP。
也就是说,我曾经编写过一个数据类测试器,试图涵盖所有情况。回想起来,这是不值得的。也许像 javabean-tester 这样的库也会有帮助。
最新版本的 Lombok (1.18.34) 还会自动向生成的代码添加 @Generate 注释。因此,使用最新版本的 JaCoCo 和 Lombok 将开箱即用,无需将 lombok 配置文件添加到项目中。