Jacoco 代码覆盖率受 AspectJ 影响

Jacoco code coverage is affected by AspectJ

我们在我们的项目中使用 AspectJ 并且还使用 Jacoco 进行测试覆盖率报告,目前我们面临一个问题,由于 AspectJ 在编译阶段更改了字节码,这导致代码覆盖率报告不正确。一个例子是由于 AspectJ 添加了额外的 if-else 语句,然后分支覆盖显示大约 1/4 但实际上源代码中没有条件分支。有什么好的方法可以告诉 Jacoco 忽略 AspectJ 生成的所有代码吗?

非常感谢。

我正在复制我刚刚在 JaCoCo 邮件列表上写的答案:

如果您想避免从源代码编译 AspectJ,您有两种选择:

  1. 将 LTW 与织造剂一起使用。
  2. 将您的方面移动到单独的 Maven 模块中。使用普通的 Maven 编译器插件编译 Java 模块,使用 AspectJ Maven 编译方面模块。然后创建另一个只使用 AspectJ Maven 的模块,以便在 Java 模块上进行二进制编织,使用两个先前创建的工件作为依赖项。在这种情况下,您需要确保 JaCoCo 离线检测在二进制编织完成之前绑定到一个阶段。

不过,最简单的方法是单独测试您的方面以及没有方面的 Java 代码并测量那里的覆盖率而没有任何问题。

@RajeshTV:

如何使用 clover-aspectj-compiler 的说明在这里:

https://confluence.atlassian.com/display/CLOVER/Clover+AspectJ+Compiler

这些说明也适用于 OpenClover。只需下载:

接下来这样称呼他们:

java -cp "clover-4.2.0.jar:clover-aspectj-compiler-1.0.0.jar:aspectjrt.jar:aspectjtools.jar" com.atlassian.clover.instr.aspectj.CloverAjc -d <output directory> <list of files>

它将在指定目录中生成 *.class 个文件,并创建 clover.db 个数据库。

您必须从 Maven 构建中调用上面的命令,例如使用 exec:exec 目标。

请注意,clover-aspectj-compiler 没有专门的 Maven 插件来自动执行此操作,因此您的工作是编写整个管道。