移动测试开发 在测试中的应用及常用工具对比
一、前言
在近些年互联网快速迭代的开发模式下,接口自动化测试成为了服务端质量保证的重要手段。但随着系统复杂性逐渐增大,任何一行代码的改动或一个配置文件的修改都有可能引起整个系统的崩溃或者带来巨大的损失。仅仅依赖沉淀的自动化测试脚本或人工测试已经很难完全覆盖到业务的特殊场景。在此背景下,基于流量回放技术的自动化测试应运而生。
流量回放测试技术,就是用流量录制回放的方式把实际流量的镜像分发到测试服务器上,用来验证新的代码修改是否对原有系统造成影响以及新功能是否可用。本文将主要介绍流量回放技术在测试中的应用以及目前常用的流量回放相关工具,希望给未接触过流量回放技术或对流量回放技术有兴趣的同学有所帮助。
二、在测试中的应用
流量回放技术在测试中的应用非常广泛,以下介绍 3 种常见的应用方式:
1、Diff 测试
基于流量回放技术进行新老代码的功能对比,简称为 Diff 测试,是流量回放技术比较广泛的应用之一。基本的思路就是从线上获取流量后,在不同的代码环境进行回放,对比接口的返回结果。
应用场景:
• 系统重构,保证新老版本功能逻辑一致
• 新功能提测,保证历史逻辑不受新代码影响
应用收益:
• 大幅提高回归测试效率
• 快速发现问题,尤其是难以预料的问题
2、性能&异常测试
在性能测试中,使用真实的流量而非测试人员自行构造的测试请求,更能贴近真实的线上情况,得到的测试数据也更加可信。同时,基于流量回放技术测试未上线的服务,也更容易发现系统崩溃等严重问题。
应用场景:
• 性能专项验证,测试性能提升是否符合预期
• 上线前性能卡点,确保新功能没有影响性能
• 异常流量验证,发现系统崩溃等严重问题
• 线上全链路压测,确保压测真实流量
应用收益:
• 还原真实线上流量,性能结果更加真实可信
• 快速发现导致系统崩溃的严重问题
3、功能测试&问题排查
在日常的功能测试或线上问题排查中,流量回放技术也能发挥很大的作用,比如从线上获取流量,针对特定流量进行筛选后,回放在测试环境,观察测试环境的返回或日志排查问题
应用场景:
• 功能测试,查找真实线上请求,转换为测试请求
• 问题排查,支持 业务多样化的测试场景
三、常用工具对比
目前开源的流量回放工具比较多,如何选择适合自己业务的工具呢?本文根据录制方式的不同,将流量回放工具大致分为以下三类,即基于应用进程录制、基于中间件录制和基于网络协议栈的录制,并单独介绍各工具的特点及适用范围,供读者参考
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,参数较复杂
• 录制和回放都是基于底层数据包,难以进行流量的筛选和定制
四、可能遇到的问题
应用流量回放技术到测试的过程中,会遇到很多问题和挑战,具体的问题要根据业务背景及技术而定,以下介绍几点比较通用性的问题和一些解决方案供读者参考:
1:如何保证测试环境数据和线上的一致性?
参考方案:可以考虑定时同步线上数据到测试数据库等
2:读/写接口区别,对于读接口,流量回放无副作用,不会产生脏数据;对于写接口,如何应对?
参考方案:对于读接口采用流量回放的方式进行对比,对于写接口,可以使用自动化测试用例的方式保证
3:接口有外部依赖,无法保证外部接口/服务返回的一致性?
参考方案: 需要调用外部接口/服务时,采用 mock 的方法等外部依赖进行隔离
4:程序随机存在随机,有动态变化字段(如时间戳等),如何比较 Diff 结果?
参考方案:(1)增加程序开关,规避掉功能随机问题(2)对比结果时过滤指定的特定字段,不进行对比(3)进行降噪处理,自动识别不需要对比的字段
5:核心数据脱敏,录制敏感数据,一定要做好数据加密与脱敏
五、总结
流量回放技术已经在业界有了非常多成功的落地案例,希望通过本文的介绍,能够让更多读者在实际的测试工作中应用流量回放技术,实现测试效率和业务质量的双提升!