开源测试工具 jacoco 增量覆盖率计算工具

raoweijian · 2018年07月18日 · 最后由 异彩飞天 回复于 2020年01月19日 · 5638 次阅读

简介

目前我们在做单元测试管理平台。开发希望能比较直观地看到新增/修改代码的覆盖情况。
jacoco 原生是没有该功能的。所以为了统计增量覆盖率,写了这个脚本工具
这个工具是在 jacoco 的覆盖率报告基础上,计算出增量覆盖率,并且对 jacoco 的覆盖率报告做一些修改,方便看到哪些行是新增的。

github 地址

https://github.com/raoweijian/jacoco-diff

比较

在写这个工具之前,我看过一个类似的介绍: https://testerhome.com/topics/6196
但是看完还是感觉不知道怎么应用到我们目前的项目里。所以干脆自己写一个。

原理

首先明确一下我们的需求:

  1. 能跟指定版本进行对比,得到增量覆盖率数据。
  2. 在 jacoco 的覆盖率报告里,能清晰地标识出新增行。

为了实现第一点,首先要获取到哪些代码行是新增或者修改的。由于我们团队目前都用 git 管理代码,所以直接通过 git 去获取是比较方便的。
有一个库,实现了 python 和 git 的交互:https://github.com/gitpython-developers/GitPython

第二点,我采用的方案是在行首增加一个蓝色的钻石(风格与 jacoco 原生的黄色、红色、绿色钻石一致)。虽然含义与原生的钻石不相关,但是
看起来会比较自然。因为背景色是有其他含义的,所以不能使用背景色。思来想去还是感觉加个钻石比较合适。
具体的实现,是通过修改 css class,添加背景图案。具体可以看 github 上的源码。

结果展示

命令行提示

图片

覆盖率报告

新增的行首增加蓝色钻石标志,与其它钻石不冲突

图片

用法

# 假设工程路径为 ~/project/test_project
cd ~/project/test_project

# 执行单测,生成 jacoco 覆盖率报告
mvn clean test

# 使用本工具,计算增量覆盖率,并修改覆盖率报告
python main.py -d ~/project/test_project -m sub_module -o HEAD~1

参数说明

-h, --help 打印帮助信息

-d, -dir 工程根目录

-o, -old_version 指定对比的版本号, 如果该参数没有给出,默认与前一个版本进行对比 (HEAD~1)。该参数支持 git commit hash 或者 HEAD~n 的格式。

-m, -module 需要处理的子模块 (如果指定的工程没有子模块,需要自行修改一些代码)

共收到 14 条回复 时间 点赞

写了个类似的东西用在精准测试上😁https://github.com/AngryTester/jacoco

AngryTester 回复

看来增量覆盖率是刚需

不错不错,需要这,感谢楼主开源精神

CC 回复

多谢支持😁

仅楼主可见

diff.git 乱码了,麻烦楼主更新下。

AngryTester 回复

你统计了如果是独立以 jar 包引入的 sdk 的覆盖率了吗?

仅楼主可见

感谢楼主分享,这种统计增量数据好处理吗?除了增量行覆盖率根据报告可以计算出,增量分支和方法等纬度的覆盖率好计算吗?

7楼 已删除

请问楼主,最终的结果,只会留下过滤之后的新增文件吗?

流浪豆 4 年 半的个人测试经历 中提及了此贴 03月14日 14:47
AngryTester 回复

我试了试,前面的操作步骤都正常,到最后生成的增量报告里没有数据呢?能把步骤写的在详细些吗?

jack 回复

你用楼主的 jacoco-diff 正常了吗?我一运行就报错~Q1175426782

jack 回复

我的也没有数据,你后来解决了这个问题吗?

请问楼主,你这是 target/后面的东西也一并提交到了 git 吗?

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