测试基础 JACOCO 重启之后之前的覆盖率就消失了怎么办

狂天 · 2023年06月30日 · 最后由 zhou 回复于 2023年06月30日 · 4357 次阅读

我们 JACOCO 和被测服务绑定在一起,由于开发修完 BUG 得重新部署(也就是得重启服务),那 JACOCO 的 AGENT 也就被重启了。
重启之后之前测试执行的操作记录就都消失了。
怎么能让操作记录不消失,还能和服务重启后进行的操作合并呢?
就比如我重启前我执行了 10 个操作,类覆盖率是 20%,重启后我想还接着这 20% 继续测试,该怎么做呢?
我想到的方法就是把 JACOCO 的生成报告放到重启之前,这样至少能把重启前的测试覆盖率计算出来。
重启后就只能重新计算了,有没有办法可以使 JACOCO 覆盖率的累计,不受服务重启影响呢?

共收到 3 条回复 时间 点赞
怎么能让操作记录不消失

每次重启前将之前的覆盖率 dump 下来保存即可

服务重启后进行的操作合并

如果重启后,前面 20% 的类覆盖有修改,要怎么处理?

楼上正解。

jacoco 的报告生成主要基于覆盖率数据(dump 出来的 exec 文件)、class 文件及 java 文件。其中覆盖率数据是可以通过调用 jacoco agent 的接口来获取的。

所以这块的设计要把覆盖率数据的获取,和报告的生成进行抽离。覆盖率数据获取用一个定时任务之类的来做,定时获取或者主动上报。报告生成时则把指定时间内获取到的覆盖率数据进行合并,再结合 class 和 Java 文件进行生成。

至于楼上提到的类覆盖有修改,据我了解,jacoco 内部是会自动识别到类有变化,进而认为这段覆盖率数据无效,不标记到类中的。
因为覆盖率数据本质上就是 class 文件插桩后每个桩有没有跑到的标记。如果类的内容有修改,插桩就会发生变化,变化后这些标记和桩的位置就对不上了,只能认定为无效。此时需要基于更新后的类重新进行操作,生成基于新的类的桩的覆盖率数据才可以。

jacococli.jar 自带 merge 功能,可以通过这个命令去合并.exec 文件后再生成报告,不过某个类只要改过一行代码,内置的 classid 就变了。这个类就没法 merge 了。所以有的公司二开了 merge 逻辑,不再根据 classid 去 merge,吧里搜下吧,印象中看到过

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