java化测试神器-流量回放平台
文章结构
- 基本介绍
- 使用流程
- 实现方案
- 总结
基本介绍
背景
目前公司正在进行php java化迁移工作。
Java化测试本质上是一次回归工作。在测试过程中,我们发现某些后端字段类型的变更,app OK,m站却出了问题。人工的测试难免有疏漏和不足。为了让java化后的接口返回和线上一致,避免对前端的影响,所以流量回放工具诞生了!
流量回放工具有以下几个优点:
- 可以抓取app、m站、小程序流量
- 支持流量的反复回放
- 可自设参数去抓精准流量
- 对比快且精准,基本上不会有纰漏
- 支持json respone和db的精准对比
目前遗憾的是无法抓取java流量进行对比
技术选型
发现bug示例
- 缺失返回类 – 全球购订单报关失败没有出来报关失败相关提示,商品上未出现双12佣金卡立减icon
- 额外返回类 – h5多返回了 发布心得的文案
- 返回不一致类 – 贝店oid返回不一致,后端处理oid丢失精度
- 服务器报500可以快速发现
- 网关层接收参数变更,导致网关层报错快速发现
使用流程
目前流量回放工具支持3种流量的回放,两种对比方式。
首先,我们先介绍下线上流量的抓取和回放。
一、线上流量抓取和回放
1.抓取线上流量
首先需配置bconf(该配置作用为设置抓取线上流量的百分比,如设置5则为抓取5%流量)
配置之后,会时时抓取对应接口流量,并存储在流量回放平台。
2.创建回放任务
Ps:仅支持GET接口,随机抓取线上流量在线上环境和预发环境上回放对比
二.自设流量
支持POST和GET接口,可设置指定账号,指定传参,自定义请求回放对比
流量抓取回放之后,就可以查看回放结果了。
线上和自设流量目前支持的是JSON对比。
JSON对比,可切换展示变化值和完整值,支持对比白名单和排序规则,详情中支持二次编辑并重复回放。
1.任务结果详情
2.JSON结果对比
红色为预发对比于线上缺少的内容,绿色为预发对比于线上新增的内容
3.其他BONUS功能
1.线上方式回放前预览测试流量在线上的返回结果
2.对比时设置白名单字段,不对比无需对比字段(如字段类型不一致无需对比)
3.设置排序规则解决数组乱序导致对比结果不直观问题
流量回放工具还支持以场景方式去录制回放,该录制方式支持入库数据结果比对。
实现方案
- 整体架构图
- 流量抓取核心逻辑
- php流量
在Rest_base_controller里设置抓取流量逻辑,并发送给rocketmq - java流量
因为java是多应用模式,并且如果流量抓取做在网关层,可能会影响到网关性能,所以决定使用dubbo 自定义filter机制,抓取流量,接入应用需要导入相关jar包(实现网关层调用各应用dubbo服务的流量抓取),目前还未支持。
- 流量录制回放核心逻辑
- 录制流程
线上流量 – 直接消费mq消息获取php抓取的流量
自设流量 – 根据前端获取的入参,构造请求在线上直接请求,并回传流量信息 - 回放流程
相关抽象方法如下:
createTask – db插入回放记录访问记录id
doTask – 根据获取的流量选择环境执行回放,catch异常回滚db
getSuspectObject – 进行对比相关操作,获取对比返回值更新记录db
finishTask – 所有相关数据更新db
- response对比核心逻辑
当初设计是后端进行对比,前端根据对比结果展示,但是前端对比的三方框架更加完善,支持排序、白名单等操作,所以后面采用后端返回json前端进行对比展示操作。
前端框架 github地址:https://github.com/benjamine/jsondiffpatch
总结
- 流量回放平台解决了大量切换环境、并且手动对比的重复冗余工作,并且实现了精确对比的目标,帮助开发测试人员发现一些靠肉眼手动无法发现的问题,让大量开发测试人员纷纷发出了“流量回放平台”真香的感叹,后期甚至可以针对java化测试工作完全脱离于APP,直接利用平台进行测试,减少大量人力(当然一些字段的定义还是去依赖APP去确定)
- 线上流量随机回放的应用可以帮助测试人员实现提前灰度的效果,自设流量可以帮助测试人员精准覆盖各种特殊场景的case,db的对比更能直接深入到db层定义插库代码的正常性。
思而不学则殆