如何在本地快速复现线上问题
背景:在软件开发过程中,线上问题的复现和定位是开发日常的一个活动。然而令开发人员头疼的是,由于线上环境与本地环境的配置和数据存在差异(如数据库中的数据、缓存中的数据等),线上的问题往往无法快速在本地测试环境中进行复现,排查困难度大大增加。以下为作者观点:
面对这种问题,我是用AREX这款自动化回归测试工具来进行快速复现。AREX的基本原理是在生产环境中录制流量和数据,在测试环境回放并自动比对接口服务内的外部请求差异,接口返回报文的差异,并结合精准测试工具找到代码更改和结果差异的关联,完成完整的自动化验证测试。借助AREX的Mock机制,录制过程中AREX将自动对该条真实请求所有的外部依赖进行 Mock,在本地完美还原线上生产数据环境,这样就可以顺利完成在本地环境的复现,快速排查问题。
具体步骤如下:
-
往生产环境发送带有force-record=true标志的请求,AREX录制生产数据,并记录应答报文头中的RecordID (AREX-Detail-ID)
-
往Local开发环境,准备好对应的代码及AREX Agent的配置,开启Debug模式
-
用AREX往Local环境发送RecordID为AREX-Detail-ID的请求报文,Local 服务收到报文进入Debug状态
-
Local的应用挂载AREX Agent,依赖数据会从AREX数据库获取并加载
-
开发可以开始随心所欲的复现生产问题,快速复现定位
如下是实战演示。
步骤一:部署AREX服务
git clone https://github.com/arextest/deployments.git
cd deployments
docker-compose up
步骤二:为被测应用配置AREX Agent后启动
AREX Agent是实现流量录制的核心组件,因此在使用录制功能前,需要先为被测应用配置AREX Agent。
首先,编译AREX Agent:
git clone git@github.com:arextest/arex-agent-java.git
mvn clean install
编译成功后可在 arex-agent-java 文件夹得到一个名为 arex-agent-jar 的新文件夹,其中包含两个 jar 包。
在被测的 Java 应用启动中加入 Java Agent 配置:
其中环境变量完整配置如下:
JAVA_TOOL_OPTIONS='-javaagent:E:/github-arex/arex-agent-java/arex-agent-jar/arex-agent-0.1.0.jar'
程序参数完整配置:
-Darex.service.name=arex-community-test6 -Darex.storage.service.host=10.5.153.1:8093 -Darex.enable.debug=true -Dspring.datasource.url=jdbc:mysql://10.5.153.1:13306/community?useUnicode=true&characterEncoding=utf-8 -Dspring.datasource.username=arex_admin -Dspring.datasource.password=arex_admin_password -Dspring.redis.host=10.5.153.1 -Dspring.redis.port=16379
启动时可以观察输出或者查看日志:
可以看到打印信息中有 ArexJavaAgent installed ,表示 Agent 安装成功。
同时可以看到 Java 打印出命令行参数信息,比如 Agent 地址信息、Storage 服务的地址信息等,如上图箭头所示。
步骤三:强制录制生产环境中出现问题的请求
AREX对生产环境接口的常规请求如下图所示,应答报文中都是常规的数据。
当生产环境某条用例出现问题时,在 AREX 中构造出该请求用例的所有配置,并点击 action.record 开启强制录制,如下图:
点击强制录制按钮后,Header List 中会新增 arex-force-record 字段,值为 true 。点击 Save 进行保存。
保存后发送请求,可以看到响应报文 Headers 中新增了 arex-record-id , 值为 AREX-172-20-0-4-708656889122(由 AREX Agent 随机生成的唯一值),说明这个请求已经成功录制下来,并且该请求在生产环境所依赖的数据都已经存储在 AREX 中了。
步骤四:本地回放进行Debug操作
录制完成后,即可在本地进行回放。
新建请求,地址变更为本地测试环境,在报文头中,增加 arex-record-id 字段, 值设置为之前生成的 AREX-172-20-0-4-708656889122,点击保存后发送请求。
现在就可以在你的 IDEA 环境中,就问题进行单步调试。如下图:
调试完成后可以看到此 AREX 请求的应答报文:
应答报文中出现 arex-replay-id,值为 AREX-172-20-0-4-708658384473
(由 AREX Agent 随机生成的用来分析的 ID)。
以上就是通过AREX流量录制功能在本地快速复现线上问题并进行Debug操作的完整流程。
最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
全套资料获取方式:
相关文章
- mysql高性能分页语句_如何优化Mysql千万级快速分页
- TortoiseGit进行squash后冲突,如何撤销
- 如何能成为测试老大?先搞懂项目中的敏捷开发模式
- 零基础如何自学Python,怎样才能快速上手!(内附教程)
- 新手如何快速学会 Python ?
- 零基础如何快速入门python
- Kubernetes 服务部署最佳实践(二) 如何提高服务可用性
- 不同项目下如何进行快速的对接(其中一种方法)
- 如何使用Docker实现分布式Web自动化!
- 快速技巧:如何在 Ubuntu 13.10 下启用 VLC 桌面通知
- 产品迭代发布如何更快速?阿里持续集成与持续交付实践之路全解析
- [快速技巧]如何设定你的 Ubuntu 14.04 自动关机
- Centos 中如何快速定制二进制的内核 RPM 包
- 如何加速编译linux内核模块?
- ShardingSphere 如何实现系统的扩展性
- 【快应用】视频如何根据网络状态播放和暂停
- 如何快速体验鸿蒙全新声明式UI框架ArkUI?
- 如何使用阿里云机器学习PAI的离线周期性调度功能
- 鉴权完成后如何拿到SpringSocial的用户信息
- 边缘重生将如何改变云计算
- SaaS创业,如何离成为独角兽更近一点?
- SwiftUI 学习方法之 01 如何快速入门
- SwiftUI 布局之List如何元素图标靠右布局(教程含源码)
- SwiftUI Toolbar如何设置自定义颜色和形状按钮 (教程含源码)
- 如何快速实现一个基于Nginx的网站监控场景 – 操作篇
- 【Caffeine缓存】如何使用Caffeine存入缓存和查询缓存?本地缓存之王Caffeine简单快速上手
- 运营商如何开源节流
- BI团队如何高效应对快速扩张的公司的需求 —— 阿里云MVP赵玮主题分享【2】
- 浅析async await错误处理问题及如何不使用try catch优雅地进行错误处理
- Getting Started功能让您快速熟悉如何接入HMS Core
- 如何快速高效学习计算机
- 如何快速地在Unity中实现血条跟随效果
- 如何快速搭建博客
- 如何调节tomcat初始内存
- [ZT] 几大酒店集团美国Co-Brand信用卡比较(三)如何选择最适合你的酒店联名信用卡
- CAD中如何快速进行防排烟计算?CAD防排烟计算步骤
- Linux - 如何启动进程