问答 jacoco 无法采集多模块项目数据

咸吃萝卜淡操心 · 2021年01月25日 · 最后由 乱舞 回复于 2021年01月25日 · 6757 次阅读

在部署 jacoco 的过程中发现,项目涉及多模块时,jacoco 只能采集到启动模块的覆盖率数据,其他几个模块都采集不到,想知道这样的问题,咋解决

共收到 7 条回复 时间 点赞
仅楼主可见

MultiSourceFileLocator,可以添加多个目录,这样的话,就是把多模块混在一起生成报告了。
IReportGroupVisitor,groupVisitor.visitBundle 多个 bundleCoverage,可以生成多模块的报告。

首先你得清楚下其他的模块是否是对应到你的启动的服务中。因为多模块的项目可能对应的是多个服务。如果 jacoco 里面都有其他模块的数据。那么只是你报告生成逻辑的问题

cp 回复

跟运维一起搞了下,这个只能对单元测试有用,业务测试完成以后再去做数据收集的时候,业务这是的这部分数据还是收集不到

你要确定一下是 dump 的 exec 的问题还是生成报告的问题。
我说的是 jacoco 的 api,通过 api 自己写代码去生成报告

cp 回复

dump 数据里只有启动模块的数据 其他模块的数据没有

首先分析一下 exec 是否包含其他模块的覆盖率统计,也就是监测的服务是否包含了其他模块代码。
然后看报告是否需要按照模块来进行统计,如果只想看到,不介意各模块的包在同一层目录统计,用 MultiSourceFileLocator 就可以

 MultiSourceFileLocator sourceLocator = new MultiSourceFileLocator(4);
for(File sourceDirectory : sourceDirectorys){
    sourceLocator.add( new DirectorySourceFileLocator(sourceDirectory, "utf-8", 4));
}
visitor.visitBundle(bundleCoverage,sourceLocator);

如果对按模块统计有需求,需要上 MultiReportVisitor

final IBundleCoverage module1BundleCoverage = analyzeStructure(classDirectorys.get(0));
MultiReportVisitor mrv = new MultiReportVisitor(visitors);
IReportGroupVisitor irgv = mrv.visitGroup(appName);
irgv.visitBundle(module1BundleCoverage, new DirectorySourceFileLocator(sourceDirectorys.get(0) , "utf-8", 4));
irgv.visitBundle(module1BundleCoverage2, new DirectorySourceFileLocator(sourceDirectorys.get(1), "utf-8", 4));
mrv.visitEnd();

以上代码供参考

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