jacoco的merge命令主要用来合并dump生成的exec文件,具体实施场景为分布式集群环境时由于覆盖请求负载到不同的机器上产生多个exec文件后我们再做merge操作,从而获取到代码的整体覆盖率,具体操作如下图所示:
命令如下:
java -jar jacococli.jar merge [ ...] --destfile [--help] [--quiet]
示例:
java -jar jacococli.jar merge 1.exec 2.exec --destfile /var/merged.exec
https://www.jacoco.org/jacoco/trunk/doc/cli.html
但是官方明确了,只有相同代码生成的exec文件才能做merge操作,那么如下场景我们需要怎么做呢?
这里先插一句:其实jacoco的report命令本身支持传入多个exec文件,他会将其进行合并,所以可以省略merge这个步骤
比如说:
项目发测了,第一轮测试dump生成了exec文件
后面又进行了两轮测试,从而生成了三份exec文件,而我想查看本次整体测试的代码覆盖率怎么办呢,jacoco官方不知道这样搞,那我们只能自己搞搞了,我们需要找出为啥不能合并,一层层剥开它的壳
1.下载jacoco官网源码,找到merge的测试类,加一个测试方法,简单指定了合并后文件目录,需要合并的exec文件目录
2.debug模式运行,前面解析命令的可以不用看,我们直接看核心方法
解析完命令后,这里加载我们需要合并的exec文件,大体逻辑器,先加载一个文件解析文件里面的类id,类名和探针,存放在一个map里面,然后将后面的类和探针进行合并,最终生成合并后的数据集合
这里是逐个类进行解析,这里获取到了类的id,类的全限定名和类里面的探针,核心逻辑就在这里了
我们看看最后合并操作
合并前会classid,类全限定名以及探针数量的对比,其中一项失败就会导致整个类合并失败,看到这里想必大家有所了解了
那么classId是什么呢?classid讲解 Currently ids are created with a CRC64 checksum of the raw class file,我们修改类里面的代码这个id肯定是不同的
如果我们去掉这个id的对比,如果类发生了变化,探针对应的顺序就会错乱,导致A方法的探针跑到B方法
盗图可耻图片来源如果有侵权请大佬联系我删除
所以这种方案是行不通的,是否有新的方案,我再思考下。