测试覆盖率 基于 metersphere 和 supper-jacoco 测试覆盖率落地实践

祝sw · 2023年12月29日 · 最后由 tester 回复于 2024年01月04日 · 4525 次阅读

一、背景及目标
背景
1、技术研发流程为测试 提供冒烟用例 - 开发根据用例自测 - 提测 - 开始测试,这一套流程,但是中间开发是否真实执行冒烟,测试并不知晓,而且测试提供冒烟用例是否符合标准也没法进行量化
2、公司产品属于 saas 产品,但是针对一些客户需要做定制化处理,这种场景,开发往往给出的是测试不用介入,修改代码少,但是真实修改了多少,会不会引起其他问题,测试是完全不知道的
3、自动化体系逐渐成熟,但是在代码层面,自动化完成效果无法进行量化,可能 a 测试人员编写了 100 条自动化用例,但是每个多个用例调用同一接口,场景单一,不好具体量化自动化完成
目标
基于上述背景,决定引用覆盖率工具,让测试更加了解代码,对工作流程有着更好的量化
每次需求提测,能获取到与基线分支对比,新增了多少代码,在开发冒烟后,获取到开发是否真实执行了冒烟,并统计冒烟覆盖率,同样在测试时,获取到测试覆盖率,并根据覆盖率数据,补充遗漏测试点
通过全量测试覆盖率,统计自动化真实情况,覆盖多少代码

二、怎么做
当前测试团队,使用的是基于开源测试平台 metersphere 的二开,做了很多定制化的处理,团队各种测试工具,肯定都是集成在一起使用更加方便快捷。

1、增量测试覆盖率版本问题如何解决
全量测试覆盖率比较好解决,但是版本测试增量覆盖率就比较麻烦,首先一个版本的标准是什么,怎么去创建这个版本,怎么维护,我司测试用例及版本维护用的是禅道,每次测试版本,需要在禅道上创建一个测试单关联到对应用例及 bug,如果在测试平台再去创建一个版本,创建虽然不麻烦,但是还是要多一步操作,而且不能保证每个人去执行能不能保持统一,做测试工具的应该都会碰到一个问题就是,做出来容易推广难,做出来的东西肯定是最大限度减低人工操作成本。
我这边给出的方案是,metersphere 去拉取禅道测试单,这样就可以覆盖率版本问题,而且既然已经关联测试单了,对应的用例,bug 等数据也可以进行统计,一举两得
最后的实现的就是 metersphere 定时同步测试单,拉取测试单的信息,并统计 bug 等数据,还可以顺道做下汇总图


2、怎么打通 gitlab,测试平台,supper-jaoco,k8s?
相信很多人都使用过 supper-jacoco,包的单个部署应用 supper-jacoco 是很简单的,把 supper-jacoco 启动起来,项目运行时带上 javaagent 命令就 ok 了,使用方法还是很简单的,但是要想把这一套使用的真实项目中,每个版本去统计,就相对没那么容易了,每一个版本都人工去操作,这样这个工具想推广真是难上加难,而且都靠人工来操作,出现错误的几率就比较高。时间久了就没人去用了。而且现在一般公司测试环境维护都是使用的 k8s,jacoco 运行时,需要把对应的 jacoco-cli 包跟具体项目放在一起,然后打包为一个镜像,放在 k8s 上去运行。
我这边的处理是
1、将 jacoco-cli 包放在 oss 上,gitlab 流水线打包时,将 jacoco-cli 拉下来,在开发打包的 dockerfile 中,将 jacoco-cli 包跟项目的包打在同一个镜像中

2、第一步解决后,就比较简单了,我们使用的是 rancher 来管理 k8s,在镜像启动时,配置对应的 javaagent 命令即可,再把 supper-jacoco 服务在 k8s 起来,这样,每次打包部署后,就可以直接去拉取覆盖率文件了

3、第 2 步的问题解决后,难点就是开始统计覆盖率和覆盖率结果的收集,supper-jacoco 每次需要传入 git 地址,微服务目录,基准分支,当前分支,uuid 等信息,我这边在 metersphere 上创建一张表,用来维护 git 项目信息,项目部署容器 ip,分支,地址等(这一步可以做成一个功能在页面上,但是变动比较小就没进行开发),这样在测试平台选择版本时,就可以选择对应的项目,填写版本,就可以进行覆盖率收集了


三、流程汇总


四、落地效果
测试落地 4 个月,开始覆盖了收集有 20 多个版本,平均冒烟行覆盖超 45%,平均测试覆盖超 75%,详细统计每个服务测试自动化覆盖了多少,目前已形成测试门禁,冒烟增量行覆盖必须超 45%,测试增量行覆盖超 75%,每个版本平均可以根据测试覆盖率补充 2-5 条测试用例。而是使用成本低,只需要在提测前输入几项信息即可拿到想要的数据。

最佳回复

jacoco 的覆盖率数据重置,使用什么方案比较合适呢

这篇文章讲的还能研究落地一下,其他那些假大空看的云里雾里

哇~求大佬后续出技术方案讲解~~
1、自动获取线网版本作为基线版本,无需反复填写 git 地址等信息,很方便!
2、实现了 k8s、物理机对接 jacoco,能够应对更多公司使用场景~
3、可视化的精准覆盖率报告可以很好的完成统计、报告,nice

共收到 6 条回复 时间 点赞

这篇文章讲的还能研究落地一下,其他那些假大空看的云里雾里

jacoco 的覆盖率数据重置,使用什么方案比较合适呢

哇~求大佬后续出技术方案讲解~~
1、自动获取线网版本作为基线版本,无需反复填写 git 地址等信息,很方便!
2、实现了 k8s、物理机对接 jacoco,能够应对更多公司使用场景~
3、可视化的精准覆盖率报告可以很好的完成统计、报告,nice

最近也在考虑容器环境的问题,请教楼主几个问题:
1、被测服务部署在容器中,jacoco 监听的 port 是否要对外映射
2、被测服务部署容器 ip 重启部署后有可能会变,如何解决
3、编译部署与覆盖率获取时点不一致造成的代码差异,会有影响吗

tester 回复

1、被测服务开启覆盖率收集的时候,会通过 javaaget jacoco-cli 的包启动一个覆盖率收集端口,这个 port 肯定是要对外映射的,要不 supper-jacoco 拉不到对应的覆盖率数据
2、ip 会随时变更,我们当前处理是,每个服务对应的有一个域名,k8s 中有自己的 dns 解析,通过域名解析到对应的 serviceIp,然后 k8s 有自己的负载均衡策略,自动发现服务 podID,我这边每次都请求对应的域名可以找到对应被测服务的 podIp
3、部署后加上 javaagent 后,覆盖率其实就已经开始收集了,supper-jacoco 做的事是获取 diff 代码,获取并处理这个覆盖率数据,所有时间点不一样完全不影响的,部署时覆盖率已经在收集了,不会有影响的。

祝sw 回复

感谢楼主详细的回复,我也实战一下,多谢

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