在部署 jacoco 的过程中发现,项目涉及多模块时,jacoco 只能采集到启动模块的覆盖率数据,其他几个模块都采集不到,想知道这样的问题,咋解决
MultiSourceFileLocator,可以添加多个目录,这样的话,就是把多模块混在一起生成报告了。 IReportGroupVisitor,groupVisitor.visitBundle 多个 bundleCoverage,可以生成多模块的报告。
首先你得清楚下其他的模块是否是对应到你的启动的服务中。因为多模块的项目可能对应的是多个服务。如果 jacoco 里面都有其他模块的数据。那么只是你报告生成逻辑的问题
跟运维一起搞了下,这个只能对单元测试有用,业务测试完成以后再去做数据收集的时候,业务这是的这部分数据还是收集不到
你要确定一下是 dump 的 exec 的问题还是生成报告的问题。 我说的是 jacoco 的 api,通过 api 自己写代码去生成报告
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();
以上代码供参考