【关键导读】结合jvm-sandbox-repeater+diffy二次开发实系统新老版本回归对比测试html
一、总体执行方案
针对repeater-console进行了二次开发,使得侵入应用服务录制请求信息到数据库存储,进而经过访问开放的回归测试api,实现将录制的流量回放到diffy的代理入口,完成diff测试的目的git
二、Jvm-sandbox-repeater
官方地址:https://github.com/alibaba/jvm-sandbox-repeatergithub
repeater的能够应用到哪些场景?docker
业务快速回归数据库
-
基于线上流量的录制/回放,无需人肉准备自动化测试脚本、准备测试数据api
线上问题排查服务器
-
录制回放提供"昨日重现"能力,还原线上真实场景到线下作问题排查和Debug架构
-
动态方法入参/返回值录制,提供线上快速问题定位app
压测流量准备dom
-
0成本录制HTTP/Dubbo等入口流量,做为压测流量模型进行压测
实时业务监控
-
动态业务监控,基于核心接口数据录制回流到平台,对接口返回数据正确性进行校验和监控 目前对repeater的应用主要是业务快速回归,基于线上流量的录制存储
-
业务实施:
step0 安装sandbox和插件到应用服务器 curl -s http://sandbox-ecological.oss-cn-hangzhou.aliyuncs.com/install-repeater.sh | sh step1 修改repeater.properties,启用远程拉取配置
step2 在NDP修改应用启动参数,指定录制应用名和环境,-Dapp.name=${录制应用名} -Dapp.env=${录制环境} ,这个会在录制的信息中存储这两个字段信息
step3 attach模式字节码加强到业务应用 attach模式下,录制应用名和录制环境这两个参数都会被默认为unknown。 # 启动命令 ~/sandbox/bin/sandbox.sh -p ${被录制应用进程号} -P ${repeater启动端口} # 关闭命令 ~/sandbox/bin/sandbox.sh -S ${被录制应用进程号}
step4 根据本身配置的协议,HTTP/Java/Dubbo进行请求录制,如录制成功在repeater.log会打出具体的TraceId,若是是本地模式同时在~/.sandbox-module/repeater-data/record/文件中会写入TraceId关联的录制数据 若是# 是否开启脱机工做模式repeat.standalone.mode=false,会将录制信息推送到远端服务进行存储
具体的数据库表信息,存储以下:
2.1 Jvm-sandbox-repeater架构分析图
三、repeater-console
基于开源简单二次开发,变动功能:
-
经过配置中心实现配置动态变动
-
根据录制信息实现回放diffy对比测试
3.1 动态配置变动
jvm-sandbox-repeater配置能够经过远端服务拉取的方式:
# 配置文件拉取地址 repeat.config.url=http://xxxx/facade/api/config/%s/%s
xxxx为repeater-console服务
3.1.1 录制回放配置字段说明
这个配置的解读,主要依赖com.alibaba.jvm.sandbox.repeater.plugin.domain.RepeaterConfig类以及调用到这个类中方法的逻辑的说明。
3.1.2 动态配置实现
基于配置中心提供的注解@ConfigNotify("repeater_config"),添加RepeatConfigListener,实现动态配置
3.2 回放diffy对比测试
提供api可对外访问执行回归diff测试:http://xxxx/facade/api/regress/test,参数名为appName和env,选择运行指定应用和环境下的录制请求
1)动态配置访问的diffy服务:String proxy = difyDomainConfigListener.getDiffyConfig().getString(appName);根据不一样应用获取指定的diffy服务,由于diffy服务在启动时与应用服务是绑定的,1个应用服务目前只能对应单独的diffy
2)启动回归执行会当即返回,采用异步后台运行的方式;
3.3 diffy对比测试
3.3.1 diffy原理及部署
如下为原理图,很是清楚的说明了diffy的对比测试的原理,在此不过多阐述
采用rancher实现diffy容器化部署,以下所示:
CMD配置启动参数:
-candidate=xxx1:8080 -master.primary=xxx2:8080 -master.secondary=xxx3:8080 -service.protocol=http -serviceName=httpDNS-Service -proxy.port=:8880 -admin.port=:8881 -http.port=:8888 -summary.email=xxx
3.3.2 diffy回放测试效果
整体回放对比结果:
单个请求diff结果:
四、总结一下
1)基于diffy的对比实践中遇到一个问题,若是response data中list是随机的,那么就会出如今稳定版本及其副本对比时,也会有差别,若是降噪,会把实际须要对比的response data也给降噪掉,若是不降噪,那么久有可能每个请求都是有差别的,进而没有达到diff快速回归的效果(面对这种服务暂时没有好的解决办法)
2)基于diffy的对比接口,为了保证不对线上业务产生影响以及脏数据,目前实施的都是读接口以及幂等写接口
3)JVM-sandbox-repeater在这个方案中只是使用了录制功能,应该要结合repeater的回放、mock等部分,完成录制回放及mock应用体系化测试
能够参考学习的资料:
JVM-sandbox-repeater github开源:https://github.com/alibaba/jvm-sandbox-repeater
JVM-sandbox-repeater:https://testerhome.com/topics/20868
docker diffy:https://hub.docker.com/r/diffy/diffy
diffy github开源:https://github.com/twitter/diffy
【延伸阅读】