Jacoco代码覆盖率受AspectJ影响

时间:2015-08-14 03:31:50

标签: java code-coverage aspectj jacoco

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

非常感谢。

2 个答案:

答案 0 :(得分:1)

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

如果您想避免从源代码编译,可以使用AspectJ的两个选项:

  1. 将LTW与织造剂一起使用。
  2. 将您的方面移动到单独的Maven模块中。使用常规Maven编译器插件编译Java模块,使用AspectJ Maven编译Aspect模块。然后创建另一个只使用AspectJ Maven的模块,以便在Java模块上进行二进制编织,同时使用先前创建的工件作为依赖项。在这种情况下,您需要确保JaCoCo离线检测在二进制编织完成之前绑定到一个阶段。
  3. 最简单的方法是单独测试您的方面,以及没有方面的Java代码,并且没有任何问题地测量覆盖范围。

答案 1 :(得分:0)

@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插件来自动执行此操作,因此编写整个管道是你的工作。