前言
在近些年互联网快速迭代的开发模式下,接口自动化测试成为了服务端质量保证的重要手段。但随着系统复杂性逐渐增大,任何一行代码的改动或一个配置文件的修改都有可能引起整个系统的崩溃或者带来巨大的损失。仅仅依赖沉淀的自动化测试脚本或人工测试已经很难完全覆盖到业务的特殊场景。在此背景下,基于流量回放技术的自动化测试应运而生。
流量回放测试技术,就是用流量录制回放的方式把实际流量的镜像分发到测试服务器上,用来验证新的代码修改是否对原有系统造成影响以及新功能是否可用。本文将主要介绍流量回放技术在测试中的应用以及目前常用的流量回放相关工具,希望给未接触过流量回放技术或对流量回放技术有兴趣的同学有所帮助。
01
在测试中的应用
流量回放技术在测试中的应用非常广泛,以下介绍3种常见的应用方式:
1.Diff测试
基于流量回放技术进行新老代码的功能对比,简称为Diff测试,是流量回放技术比较广泛的应用之一。基本的思路就是从线上获取流量后,在不同的代码环境进行回放,对比接口的返回结果。
应用场景:
? 系统重构,保证新老版本功能逻辑一致
? 新功能提测,保证历史逻辑不受新代码影响
应用收益:
? 大幅提高回归测试效率
? 快速发现问题,尤其是难以预料的问题
2.性能&异常测试
在性能测试中,使用真实的流量而非测试人员自行构造的测试请求,更能贴近真实的线上情况,得到的测试数据也更加可信。同时,基于流量回放技术测试未上线的服务,也更容易发现系统崩溃等严重问题。
应用场景:
? 性能专项验证,测试性能提升是否符合预期
? 上线前性能卡点,确保新功能没有影响性能
? 异常流量验证,发现系统崩溃等严重问题
? 线上全链路压测,确保压测真实流量
应用收益:
? 还原真实线上流量,性能结果更加真实可信
? 快速发现导致系统崩溃的严重问题
3.功能测试&问题排查
在日常的功能测试或线上问题排查中,流量回放技术也能发挥很大的作用,比如从线上获取流量,针对特定流量进行筛选后,回放在测试环境,观察测试环境的返回或日志排查问题
应用场景:
? 功能测试,查找真实线上请求,转换为测试请求
? 问题排查,支持 业务多样化的测试场景
02
常用工具对比
目前开源的流量回放工具比较多,如何选择适合自己业务的工具呢?本文根据录制方式的不同,将流量回放工具大致分为以下三类,即基于应用进程录制、基于中间件录制和基于网络协议栈的录制,并单独介绍各工具的特点及适用范围,供读者参考。
1.基于应用进程
①.Sharingan
介绍:Sharingan是一个基于golang的流量录制回放工具,可以录制线上真实请求流量进行回放测试
原理:修改golang源码,在Socket Connect、Accept、Send、Receive、Close等阶段加钩子拦截并镜像流量
优点:
? 功能齐全,支持流量筛选/比例控制
? 支持http、mysql、redis、thrift等协议
? 流量回放自带diff/mock功能
不足:
? 需要根据golang定制版重新编译程序
? 只适合go语言开发的应用
2.基于中间件
①.ngx_http_mirror_module
介绍:nginx 1.13.4及后续版本内置ngx_http_mirror_module模块,提供流量镜像(复制)的功能
原理:在nginx内部接收到流量时,复制相同的流量至mirror环境
优点:
? 支持流量放大,配置简单,可转发至多份镜像
? 无需录制流量,实时转发
? 源站请求,直接原路返回;mirror请求的返回不作处理
不足:
?流量较大时严重影响线上Nginx性能
?只支持HTTP协议
②.JVM-SANDBOX-Repeater
介绍:JVM-SANDBOX-Repeater是JVM-Sandbox生态体系下的重要模块,它具备了JVM-Sandbox的所有特点,插件式设计便于快速适配各种中间件,封装请求录制/回放基础协议,也提供了通用可扩展的各种丰富API
原理:基于JVM的非侵入式运行期AOP解决方案
优点:
? 流量回放只是基本功能,可以扩展到沙箱的其他能力
? 通用的录制/回放能力,多协议的支持
? 可追踪内部调用链,方便debug
不足:
? 只适用于JAVA类应用
? 有一定上手难度,熟悉JAVA/JVM
? 对于线上JVM仍然会有性能影响
3.基于网络协议栈
①.Goreplay
介绍:GoReplay 是一个用golang编写的开源工具,用于捕获实时 HTTP 流量并将其回放到测试环境中
原理:利用gopacket库,基于libpacp抓包,并利用go的协程特性,实现回放速率的控制
优点:
? 安装部署简单,对业务应用无侵入,只占用机器带宽
? 支持过滤和修改流量,可实时转发流量
? 支持回放速率控制,可用于性能测试
不足:
? 目前只支持HTTP1.1及以下协议
? 无法解析二进制的数据交互协议,如Protobuf
②.TcpCopy
介绍:TCPCopy是一个开源的流量回放工具,支持多种类型流量的实时及离线回放
原理:复制在线的TCP类型的请求数据包,修改TCP/IP头部信息,发送给测试服务器,达到欺骗测试服务器的TCP程序的目的
优点:
? 业务无侵入,因为intercept的存在,实时导流对线上影响较小
? 基本tcp协议栈的协议都可以支持,几乎是目前支持协议最多的流量回放工具
? 基于ip层发送,流量更加真实
? 支持分布式架构,可以当作压测工具使用
不足:
? 部署难度大,需要同时部署tcpcopy和intercept,参数较复杂
? 录制和回放都是基于底层数据包,难以进行流量的筛选和定制
03
可能遇到的问题
应用流量回放技术到测试的过程中,会遇到很多问题和挑战,具体的问题要根据业务背景及技术而定,以下介绍几点比较通用性的问题和一些解决方案供读者参考:
1:如何保证测试环境数据和线上的一致性?
参考方案:可以考虑定时同步线上数据到测试数据库等
2:读/写接口区别,对于读接口,流量回放无副作用,不会产生脏数据;对于写接口,如何应对?
参考方案:对于读接口采用流量回放的方式进行对比,对于写接口,可以使用自动化测试用例的方式保证
3:接口有外部依赖,无法保证外部接口/服务返回的一致性?
参考方案:需要调用外部接口/服务时,采用mock的方法等外部依赖进行隔离
4:程序随机存在随机,有动态变化字段(如时间戳等),如何比较Diff结果?
参考方案:(1)增加程序开关,规避掉功能随机问题 (2)对比结果时过滤指定的特定字段,不进行对比 (3)进行降噪处理,自动识别不需要对比的字段
5:核心数据脱敏,录制敏感数据,一定要做好数据加密与脱敏
总结
流量回放技术已经在业界有了非常多成功的落地案例,希望通过本文的介绍,能够让更多读者在实际的测试工作中应用流量回放技术,实现测试效率和业务质量的双提升!
来源:微信公众号:360质量效能
出处:https://mp.weixin.qq.com/s/RejW_aEcNbKuoVd6tqDJEg
本文暂时没有评论,来添加一个吧(●'◡'●)