持续集成 JACOCO 如何覆盖到被引用的代码?

狂天 · 2023年07月07日 · 最后由 狂天 回复于 2023年07月11日 · 5897 次阅读

我现在用 JACOCO 覆盖我们的接口代码。
比如:
@GetMapping("/pageList")
public ResultData pageList(PlanQueryPageData planQueryPageData) {
PlanQuery planquery = new PlanQuery;
ResultData result = planquery.search(planQueryPageData);
return result;
}
我请求了这个接口后,这个方法就标绿了(被 JACOCO 认为我已经覆盖)。
可是这个 PlanQuery 对象,它才是这个接口真正的处理方法。
而它是被引用过来的:import application.PlanQuery;
我想要去覆盖 PlanQuery 中的代码,该如何做呢?

共收到 7 条回复 时间 点赞

按照你的需要,你可以看 PlanQuery 这个类的覆盖报告呀,不用盯着 controller 的报告看

小狄子 回复

这个类是引的一个 POM 文件中配置的 JAR 包里面的,貌似看不了

狂天 回复

那说明你生成报告的时候输入的源代码范围不全。如果你们是 maven 多模块开发,想看到其他模块的有代码行的覆盖数据,那就也需要输入这部分的源代码才可以。jacoco 命令行中--sourcefile 参数可以写多个,分别指向各个模块下的 src/main/java

想获取外部引用 jar 包的覆盖率数据并生成报告,需要满足两个要求:

1、覆盖率数据有包含这部分代码的覆盖数据。用 agent 方式进行动态插桩,作用域是 java 虚拟机内运行的所有 class,应该没有问题。但如果是编译时插桩,只有当时编译的代码有增加覆盖率的桩,那没办法。

2、生成报告时,提供的 class 文件以及 java 文件有包含对应的内容。本质上覆盖率数据(ec 文件)只带有类名、类标识(类似于 md5 的东西,用于确认覆盖率数据和 class 文件匹配得上)以及各个覆盖率桩的覆盖情况标记,需要结合 class 文件才能生成覆盖率报表,还需要进一步结合 java 文件才能出现每一行的覆盖情况数据。

这两者都具备的话,就可以得到对应的覆盖率数据了。

小狄子 回复

好的大佬,明天上班试下

模式是用的 on-the-fly,第一点应该没问题。第二点的话我可以从外部 JAR 包中,把 CLASS 文件取出来,然后跟再拉下源代码就有 JAVA 文件就都齐了。明天尝试一下,感谢大佬。

陈恒捷 回复

大佬再请问下,我查看项目引用的其他服务的 JAR 包发现加一块得有 20 个。这块情况下该怎么考虑覆盖呀,我感觉它引用的服务太多了。我目前的考虑就是先覆盖同一服务但是不同项目的 JAR 包,比如上面的 PlanQuery。至于调用的其他服务的 JAR,等后面有时间再考虑观察对其他服务代码的覆盖情况。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册