CCTech:自研流量录制回放平台介绍01(文末留言)

2022-09-20 15:15:06 浏览数 (1)

1. 背景介绍

关于流量录制回放目前是一个比较火的方向,也看过一些测试开发团队在关于流量录制回放的一些文章介绍以及案例,多数还是在现有开源工具的基础上做的一些贴合各自团队业务方向的二次开发,如:go replay、jvm sandbox repeater....

我对流量录制回放的一些个人理解:

  • 快速回归核心测试流程场景,解决大部分自动化&人工回归的效率...
  • 测试团队快速沉淀核心case,不断提高回归测试精准度...
  • 快速提高编写自动化测试脚本的效率,RD & QA相互协同...
  • 基于线上核心场景的流量,定时回放,快速发现问题...
  • QA在测试过程中可以进行抓包录制/线上导流量的方式,快速进行构造不同测试数据进行回放测试...
  • ....

基于以上的理解,产生了自研流量录制回放平台:FlowRepeater

2. 平台总体描述

  • 业务测试快速回归测试

基于线上流量的录制:转换为回放任务,无需人工准备自动化测试脚本和构建多余测试数据...

  • 接口自动化测试

单接口 场景流程:利用已录制的线上流量,定时回归改动的接口,确认接口改动是否和原功能对齐...

  • 接口测试case

一键转换成性能测试case:基于线上接口的请求量,快速筛选出接口,一键转换为jmx,提高接口case的复用度...

3. 平台功能列表

4. 技术方案

代码语言:javascript复制
# 平台后端
- flow-api:
    - 实现语言:python3.6-3.8.5
    - 框架:Django
    - 数据库:mysql>5.7
    - 消息队列:redis

- flow-worker:
    - 实现语言:python3.6-3.8.5
    - 框架:celery
    - 数据库:mysql>5.7
    - 消息队列:redis

# 平台前端
react   ant-design后管管理

5. 录制 & 回放流程

  • 录制流程
  • 回放流程

6. 功能模块介绍

  • 统计看板
  • 项目管理
  • 录制管理
  • 回放管理
  • 系统配置

6.1 统计看板

统计看板主要包含了四个维度的数据:录制任务数、回放任务数、当天API录入次数统计、回放失败任务列表...

其中,API录入次数统计的是所有开启统计开关的项目下、当天的录制流量数量;失败任务统计处,点击失败统计处,可以直接跳转到失败的任务详情。

6.2 项目管理

所有的任务都是依赖于项目纬度的。项目作为一个最大级别的单元。主要控制:

  • 录制host列表
  • 统计开关
  • 消息通知机器人开关 & 地址

统计开关:用于统计看板-API统计处的展示,关闭后,所有该项目下的录制任务流量都不会计入统计看板内...

通知开关:用于回放管理-回放任务任务完成时的通知,关闭后,所有该项目下的回放任务将不会生成通知...

录制域名:用于该项目下所有录制任务的流量域名级别过滤,默认为空,即录制所有host的流量...

告警地址:用于回放任务完成式的消息告警,目前支持企业微信机器人通知(后续封装钉钉、飞书等机器人配置)...

6.3 录制管理

录制管理是管理所有录制任务,录制管理分两类

  • 代理模式录制
  • ES模块录制

代理模式录制:在创建录制任务时选择代理录制;代理录制开启时,会自动选择配置范围内的一个端口开启代理服务器,点击查看流量即可看到代理的IP和端口号;然后点击查看流量进入到录制页面。安装完成后,即可进行正常的测试流量录制了...

ES模式录制:在创建录制任务时选择ES录制;ES录制分三个环境,对应三个不同环境的流量;开启ES录制后,录制任务会定时从不同环境的ES日志中捞取时间间隔内的流量并进行记录...

6.4 回放管理

回放管理包含三个类功能

  • 用例列表
  • 回放任务
  • 回放策略

用例列表:当录制任务录制到流量后,需要进行筛选、组合生成测试用例...

回放任务:回放任务将选择的测试用例一一进行回放,然后与录制的流量响应进行对比...

回放策略:回放策略主要分为三种:忽略、增加、替换

6.5 回放策略案例

忽略
  • 忽略是针对回放对比部分的,配置忽略策略后,在回放对比时,会自动忽略改key产生的差异...
  • 使用忽略模式时,对应的位置必须选择body...
  • key使用json patch的模式(见下文),然后value不需要填写.
代码语言:javascript复制
demo1
响应结果:{"data": {"timestamp": 1234, "value":1}} 
我们想忽略timestamp字段造成的对比差异,可以这样配置:
模式:忽略 位置:body key: /data/timestamp value:

demo2
响应结果:{"success": "true", "data": [{"timestamp": 1234, "value":1},{"timestamp": 5678, "value":2}]} 
对于数组模式的,需要一一配置:
模式:忽略 位置:body key: /data/0/timestamp value:

模式:忽略 位置:body key: /data/1/timestamp value:
替换
  • 替换模式是针对回放请求的,用于替换掉请求的参数/头/query...
  • 使用替换模式时,body指的时请求的body...

PS:注意使用替换模式时,请务必确保所要替换的字段存在于请求/响应中

  • 当位置选用body时,key使用json patch的模式(见下文),然后value不需要填写..
代码语言:javascript复制
demo1
请求body:{"data": {"timestamp": 1234, "value":1}}
想替换body某一字段时,同忽略模式一样,只是需要填写要替换的value值
比如替换timestamp为4567
模式:替换 位置:body key: /data/timestamp value: 4567

demo2
请求header: {"xxxxx":xxxx} 
替换请求header时,不需要任何特殊处理,比如请求头存在一个Auth字段,我们想要替换Auth字段的值:
模式:替换 位置:Header key: header value: 4567  
注意大小写问题即可。

demo3 
请求query:a=1&b=2&c=3
替换请求query时,也不需要其他处理 
比如替换query的a为4:

模式:替换 位置:Query key: a value: 4
新增
  • 新增模式也是针对回放请求
  • 新增模式和替换模式基本相同,只是新增模式不需要确保增加的key是否存在,会强制向所在位置加入配置的字段和值。( 同替换模式相同!!!
代码语言:javascript复制
data= {"baz": "qux","foo": "bar"}
key: /baz 
key: /foo

{"a":{"b":{"c":"foo"}}}
想要获取foo:

key: /a/b/c

结语

FlowRepeater目前在二期迭代当中,也正在考虑是否开源,如果你有想法可以评论区留言,如果要求开源也请在留言区写上开源,每一条评论作者都会留心。

作者简介:

ID:美好一点,CCTech成员,8年 测试工作经验,4年带测试团队(8-10人)经验,擅长服务端测试开发。

往期推荐:

CCTalk:帮助超过100位测试人复盘,发现巨大的误区

测试各类自学成长笔记

0 人点赞