jacoco覆盖率统计,merge差异化代码和reset指定方法的疑问与请教

最近做精准化测试碰到几个技术难点,想请教一下:

  • 1、jacoco merge功能,在两次部署之后的 exec 往一个上面 merge,但是当我第二次部署的代码有变动的时候,变动的类的classId会变,这个时候jacoco就不会进行merge了,那个上次的覆盖率信息就会丢失,这个情况要怎么处理?
    image
    • 有尝试过通过类名去做merge,但是由于代码的变更,探针数据也会变更,因为依然会merge失败,并且即使强行merge成功了,探针的位置也不尽相同,统计的覆盖率也肯定会有问题。
  • 2、jacoco的reset功能会把内存中所有的覆盖率信息都重置,现在有个需求就是只重置指定方法的覆盖率信息,用来调式某个方法修改后的反复测试,这个又要怎么实现?

这两个都是merge相关的。当代码发生变更的时候,代码行的统计会全部错位,使用自带merge是不行的。

你需要分析覆盖率数据,在dump的结果上重新转换成自己的覆盖率格式,里面包含最原始的代表代码的数据,以及对应的新老版本代码行数据。也就是kv结构。k中要有代码唯一性标记,v中带有代码行和是否覆盖的数据。

代码唯一性是类+方法+代码块三个元素组成。

非常感谢思寒的回复~
类和方法都比较好确定,就是代码块这里是通过探针数组来记录覆盖率信息的,要确定代码块就要确定探针和方法行的对应关系,这块目前没有思路。是要去研究agent插桩的原理做修改吗?

是的,不过代码块不容易理解,你可以用代码内容代替。这样可以简化难度,块内代码在dump的结果里是有的。

只有深入探针原理才能用好jacoco的,主要是字节码插桩技术。

这个已经实现了嘛? 我现在也遇到了这个问题,需求和这位朋友是一样的,请问这位朋友 搞成功了嘛?能分享下嘛?