自动化测试之流量回放技术
流量回放近几年一直是大家热衷讨论的话题,具体的效果智者见智。文章作者也是在技术工程领域有丰富的实践经验,推荐一看。
本篇背景是另外一同事朋友,最近在利用流量回放技术应用在服务端接口自动化测试方面,还在各部门全力推进阶段,未来效果暂且不好说,但这部分内容确实各大公司,测试技术大会等等的热词,由于我没参与但我很感兴趣,所以邀请普及一篇,后边应该还会带来实战篇,本公众号坚持原创和干货分享,欢迎长期关注,一同成长,如果你有好的实战分享也欢迎投稿。
前言
在日常的测试工作中我们或多或少总会遇到下列问题:
1)服务架构升级或重构,需要验证原始接口逻辑,对原有的一堆接口做回归
2)对于业务逻辑复杂的场景,每个迭代版本都需要大量的时间用于回归测试
3)编写自动化用例时复杂场景造数麻烦,日常自动化维护成本高
4)构造压测模拟数据麻烦
…等等
那么从服务的所有环境来看,仅线上环境拥有场景丰富、数据真实、覆盖全面的条件,那么我们将线上环境的请求数据获取下来,在指定的环境中模拟用户请求基本上可解决或者优化上面的这些问题。因此有必要需要对流量回放这项技术探究一下,首先从资料总结和自身搭建讲演来讲,总结流量回放的大概流程可为:流量录制 - 数据持久化 - 回放计划 - 环境维护 - 流量回放 - 结果比对。其次,所谓工欲善其事,必先利其器,下面我们看一些常用的流量回放分类以及工具的优缺点。
工具分类
根据流量录制的位置大致可分为:基于web服务器录制、基于应用层录制、基于网络协议栈录制。
web服务器录制
方案:在服务上定制化代码
优点:请求类型比较多样
缺点:不通用,维护成本高,会占用大量线上资源
应用层录制
方案:在网关或基于AOP切面进行录制
优点:对代码无侵入、实现相对比较快捷简单
缺点:会占用线上部分资源、可能会对业务有影响
常用工具:Nginx插件-ngx_http_mirror_moudle、Java-sandbox
网络协议栈录制
方案:直接监听网络端口,复制数据包方式录制
优点:基本对应用无影响
缺点:比较偏向底层实现成本较高
常用工具:goReplay、tcpCopy、tcpReplay
常用工具介绍
ngx_http_mirror_module
流量请求到nginx后,nginx正常转发请求到目标应用,同时复制流量到mirror服务后不再管控。
优点:
原生模块支持,在nginx 1.13.4版本后内置该模块
支持配置多份镜像放大流量
配置比较简单,nginx-server将流量复制到mirror后无交集,达到对真实流量无影响目的
缺点:
修改配置后需要执行“nginx -s reload”命令使变更生效,线上环境不建议这么做
实际业务中经由nginx转发的模块较多,无法筛选指定请求
只支持录制http流量
mirror为子请求,当mirror未结束时,主请求的内存无法释放,可导致nginx性能下降甚至阻塞
TcpCopy
项目地址:https://github.com/session-replay-tools/tcpcopy
流转示意图:
TcpCopy主要有tcpcopy和intercept两个模块组成,tcpcopy模块运行在线上机器,主要负责捕获在线请求并修改请求头中的目标地址和 源地址,然后使用raw socket输出技术发送数据包到目标服务器。目标服务器上根据配置的信息将响应数据包路由到intercept辅助服务器。intercept辅助将提取的响应头信息发送给tcpcopy。tcpcopy利用收到的信息修改捕获的数据包属性并发送至目标服务器。
优点:
使用线上的真实数据
适合高并发场景
对目标服务器基本无干扰
支持复制基于TCP任意层协议的流量
缺点:
由于只做数据包复制未做流量异常鉴别,可能导致异常数据进入目标服务器
无法对应用层的数据进行筛选和修改
可能会丢失数据包导致请求丢失
GoReplay
项目地址:https://github.com/buger/goreplay
GoReplay是基于Go语言实现与Tcpdump一样都是依赖pcap库,主要监听网络接口流量来录制流量,支持在线和离线方式回放流量
优点:
轻量程序基本无需配置,环境准备简单
程序资源消耗少,无侵入应用运行环境
提供不限制语言的插件机制,方便拓展
缺点:
社区版仅支持录制http协议,且与核心逻辑耦合,应用面不广泛
大公司使用少,整体成熟度不高
Jvm-sandbox-repeater
项目地址:https://github.com/alibaba/jvm-sandbox-repeater
使用jvm-sandbox沙箱技术,通过Java agent或者attach方式挂载到Java应用上。repeater模块根据配置的规则录制或回放数据,console模块主要负责触发和数据交互。
优点:
通过字节码增强的方式可以直接录制Java方法、子调用
对业务代码0侵入
模块功能丰富
缺点:
对服务运行环境有一定侵入
在挂载瞬间会占用较多的机器资源,当业务量大时可能会导致服务夯住
当前功能不完善,需要代码开发能力
总结
通过技术方案可以方便我们利用线上真实流量验证压测、自动化、回归等场景,根据自己实际的需求选择合适的工具,但一切以不影响线上服务的稳定可用为前提。也期待后续会有更多的更完善的流量回放方案。
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
好文推荐
转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!
面试经:一线城市搬砖!又面软件测试岗,5000就知足了…
面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…
什么样的人适合从事软件测试工作?
那个准点下班的人,比我先升职了…
测试岗反复跳槽,跳着跳着就跳没了…
自动化测试之流量回放技术相关推荐
- 干货|app自动化测试之Appium WebView 技术原理
混合应用测试或微信小程序测试,都会涉及到 WebView 组件,这节内容将分析一下 WebView 的技术原理.首先通过日志分析查看 Appium 的运行过程. WebView日志分析 要想查看 Ch ...
- app自动化测试之Appium WebView 技术原理
混合应用测试或微信小程序测试,都会涉及到 WebView 组件,这节内容将分析一下 WebView 的技术原理.首先通过日志分析查看 Appium 的运行过程. WebView日志分析 要想查看 Ch ...
- Android自动化测试之MonkeyRunner录制和回放脚本
Android自动化测试之MonkeyRunner录制和回放脚本(十一) 分类: 自动化测试 Android自动化 2013-02-22 10:57 7346人阅读 评论(2) 收藏 举报 andro ...
- Android自动化测试之MonkeyRunner MonkeyDevice MonkeyImage API使用详解 脚本编写 脚本录制回放
MonkeyRunner 系列文章 MonkeyRunner简介 MonkeyRunner 三大模块 MonkeyRunner API MonkeyDevice API MonkeyImage API ...
- 流量回放:保证业务技术升级的神器
流量回放:将某个时间段的对A的所有请求,通过某种手段录制下来,然后在B应用上重新请求,这个过程为流量回放. 流量回放可以做什么 可以做真实数据的覆盖测试 可以做流量压测 RPC怎么做支持流量回放 所有 ...
- 哔哩哔哩「会员购」在流量回放上的探索
作者 沈佳伟 哔哩哔哩会员购架构师 背景 「哔哩哔哩会员购」是B站的电商业务.随着业务规模不断扩大,系统设计也越来越复杂.当在具有一定应用规模和业务复杂度的系统上进行业务快速迭代时对系统的鲁棒性,兼容 ...
- Android自动化测试之Monkey命令使用及monkey脚本编写
系列文章 Android自动化测试环境部署及adb sdkmanager avdmanager Monitor DDMS工具使用及命令详解 Android自动化测试之Monkey使用及monkey脚本 ...
- 流量回放开源代码Java_流量回放框架 jvm-sandbox-repeater 的实践
一. 前言 你是否和我一样遇到过以下的问题? 1)服务重构,一堆接口需要回归,让人头疼 2)每次迭代,都要花很多精力来进行回归测试 3)线上 bug,线下复现不了 4)接口自动化用例写辛苦,维护更辛苦 ...
- diff测试与流量回放测试
一.Diffy 简单来理解,Diffy是一个开源的自动化测试工具,是一种自动Diff测试技术.它能够自动检测基于Apache Thrift或者基于HTTP的服务.通过同时运行新/老代码,对比运行结果, ...
最新文章
- 基础二维计算几何板子[预备知识]
- 在 PHP 中养成 7 个面向对象的好习惯
- 字符串补充知识及列表类型
- python学习框架图-Python学习—框架篇之初识Django
- 巧用Java8中的Stream,让集合操作6到飞起!!!
- c语言万年历附加功能,万年历(c语言,多功能).doc
- Hibernate使用原生SQL适应复杂数据查询
- oracle 11g segment,11g视图dba_segments中增加了一个有用的segment_subtype字段!
- 用计算机信息术语感恩老师,【感谢老师的对联师恩难忘的对联】_感谢师恩、感恩老师的对联—经典用语大全...
- python进阶学习路线(全)
- 湿度和温度对计算机设备的影响,简述环境温度的变化对机房设备的影响
- 并行计算与集群技术(2)
- Google缩进40%搜索结果,微信公众号/今日头条开放搜索引擎
- 简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试、 β测试?
- Linux下设置火狐主页的方法
- 计算机论文答辩代码讲解,计算机专业毕业论文答辩的程序讲解
- C语言的3种打桩方法总结
- 面向对象划分--ERP销售订单、生产工单、料号
- 盒子科技研发部刘恒:聚合支付系统演进
- 神经网络与深度学习(四)线性分类
热门文章
- Q8BERT: Quantized 8Bit BERT
- GX Works3 (二):FX5U的基于以太网MC协议的梯形图编程基础
- 码上日志_19_08
- labview自动保存报表_基于LabVIEW的数据存储及报表设计方法
- 期货买量和卖量是什么意思(期货交易量是什么意思)
- html播放pps格式文件,.pps是什么格式
- 色域映射--L,a,b的线性先后压缩
- 10款经典Java游戏项目合集,附源码课件
- 如何使用Arduino摇杆模块(Joystick Shield)
- python容器开发_python学习之容器化管理docker