测试人的福音:开源流量回放工具快速上手实践

笔者前段时间在参加测开大会时了解到了一款开源的自动化回归测试工具 AREX。主要是通过复制线上真实流量到测试环境进行回归测试,同时还做到了接口返回值的比对和写接口的验证,回放不会产生真实的数据或者调用,都是基于 Mock 数据的,也不用担心会产生脏数据,很大程度节约了测试用例编写和测试环境搭建的成本,感觉很有意思。本文主要参考 [AREX 官网文档](arextest.com/zh-Hans/doc... Installation),记录分享一下在 Mac 本地部署 AREX 以及流量回放功能的试用过程。

前置准备

  • 配置:下面是我的配置,适用于所有 Intel 芯片的 Mac,m 系列芯片暂未测试。
iMac 2019款 5K
CPU 3 GHz 六核 Intel Core i5
内存 16 GB 2667 MHz DDR4
操作系统 macOS Monterey 12.4
  • Docker,Docker Compose
  • Java 1.8,apache-maven-3.8.3
  • Chrome v115
  • Git
  • 网络:一个稳定的网络环境(科学上网)可以解决 95% 以上的报错问题

步骤一:部署 AREX

AREX 由 UI(前端)、Schedule Service(调度服务)、Storage Service(存储服务)、Report Service(报告分析服务)及 Mongodb、Redis 数据存储等多模块组成,官方目前提供了多种部署方式,本文使用最简单的 docker- compose 部署方案进行快速体验。

1.通过 git clone 命令拉取 AREX 仓库代码

bash 复制代码
git clone --depth 1 https://github.com/arextest/deployments.git
cd deployments

2. 通过 docker-compose 启动 AREX

复制代码
docker-compose up -d

首次安装需要下载相关镜像资源文件,可能要等待一段时间,具体时间取决于你的网络状况,当出现下图中的提示说明已经安装成功。

启动成功后可以使用 docker-compose ps 命令输出所有服务的名称、运行状况和端口等信息,使用 docker-compose logs 命令输出所有服务的日志。如果觉得终端命令比较麻烦的话,也可以使用 Docker Desktop 等图形化客户端进行管理,这里推荐一个 Mac 平台好用的 Docker 容器客户端 OrbStrack,号称比 Docker Desktop 更加快速、轻便且简单,亲测好用。

通过 OrbStrack 可以看到当前的容器中正在运行的 AREX 相关服务,官网文档对其各个功能及其原理做了详细的介绍,这里简单罗列出各个服务的基本功能。

服务名称 功能介绍
arex-ui AREX 前端是 AREX 工具的前端操作界面
arex-report-service 报告分析服务,负责在执行回放测试时收集测试结果及展示问题
arex-schedule-service 调度服务,负责向被测试服务发送用例回放请求,并在服务响应后触发结果比对及依赖比对
arex-storage-service 存储服务负责接收由 Agent 捕获的请求、应答及依赖的真实数据的存储,同时负责在回放期间,按照 Agent 要求返回已存储的数据
Mongodb AREX 默认配置的数据库,负责存储录制的数据和回放结果
Redis 负责在回放过程中缓存数据

步骤二:运行 AREX Agent

在 AREX 部署完成后,就可以通过容器中前端服务对外暴露的端口访问 AREX 前端站点了,这里我访问的是 http://localhost:8088/。

登录之后开始直接使用 AREX 常规接口测试的功能,这一部分基本上和 Postman 没什么区别,需要注意的是,由于是在浏览器里进行接口请求,因此想要成功发送 API 请求,还需要安装 Chrome 插件,安装成功后刷新页面,如果界面右下角插件状态变成绿色的✅,则说明插件已经成功安装,可以进行接口请求。

当然我更感兴趣的是 AREX 的特色功能录制回放测试 ,目前在 Replay 菜单页面中的应用项目列表为空,这是因为还没有应用接入。要想接入应用进行录制,需要用到 AREX Agent

AREX Agent 是实现服务录制回放的核心组件,主要原理是通过对入口调用和各个依赖调用的代码进行字节码增强,当代码被执行到时拦截调用过程,将调用的入参、返回值和异常录制下来,发送到存储服务。

在测试环境回放时会使用生产环境录制的真实数据模拟请求,AREX Agent 通过识别回放标识决定是否需要回放。如果需要回放,则不进行方法的真实调用,去拉取存储服务保存的调用响应数据进行返回。

  1. 拉取 arex-agent-java 项目源码进行编译:
bash 复制代码
git clone https://github.com/arextest/arex-agent-java.git  
cd arex-agent-java  
mvn clean install

编译成功后可得到一个包含两个 jar 包的 arex-agent-jar 新文件夹,其中的 apex-agent-0.3.8.jar 即为我们需要的 agent jar 包,需要注意的是该 jar 包依赖另一个 bootstrap jar 包,因此两个文件需要放在相同目录。

2. 注入 Agent

接着就可以对我们自己的项目注入 agent 启动。这里我用的项目是交流群里提供的一个演示项目 arex-community-test(群号是:656108079,需要文件的朋友可以加群),下载至本地后进行编译,即可在根目录的 target 文件夹中得到最终编译生成的项目 war 包 arex-agent-test-0.0.1-SNAPSHOT.war,再将刚刚生成的两个 agent jar 包拷贝至示例项目根目录,便可以执行 Agent 注入,启动项目。相关命令如下:

bash 复制代码
cd arex-community-test
mvn package -f pom.xml
java -javaagent:./arex-agent-0.3.8.jar -Darex.service.name=community-test -Darex.storage.service.host=localhost:8093 -jar ./target/arex-agent-test-0.0.1-SNAPSHOT.war

项目启动参数主要由四部分构成:

  • -javaagent 指定了 agent jar 包的文件路径
  • -Darex.service.name 声明了被测试服务应用的名称(用户自定义,最后会显示在 Replay 页面的应用列表中)
  • -Darex.storage.service.host 指定了 storage 存储服务的 host 地址(参考之前 AREX 容器中的 arex-storage-service 服务暴露的端口)
  • -jar 指定了测试服务应用的 jar 包文件路径

除了 Java 参数运行模式外,AREX 官方文档 还详细罗列了其他多种运行模式,感兴趣的同学可以自行参考。

当终端输出了以下日志时,说明项目已经成功注入 Agent 并启动,在日志中可以看到测试服务应用的名称、Agent 运行状况等详细信息。

现在就可以在 Replay 菜单中看到刚刚注册的应用 community-test 了。

录制回放功能体验

接下来试一下对该应用进行录制回放操作。根据官方介绍,AREX 的录制不用手动开启,在应用成功注册后,将自动录制所有时间段内的线上真实请求流量。现在我们访问一个应用接口来创建一个真实的线上流量,比如访问 http://localhost:8080/nettyTest/nettyTest,得到响应:

css 复制代码
{
 "responseStatusType": {
   "responseCode": 0,
   "responseDesc": "success",
   "timestamp": 1691481194807
},
 "body": {
   "inboundResponse": "Hello World!",
   "outboundResponse": "12345"
}
}

请求后再回到前端页面,在列表中点击该应用,可以在应用名称右上角看到一个红色数字上表,这里显示的是当天录制到的用例个数,点击后可以看到录制接口路径即为刚刚访问的 /nettyTest/nettyTest 路径,说明已经录制成功。

现在再对刚刚的这一次录制创建一个回放测试,点击右上角的 Start replay 按钮,在 Target Host 中根据提示输入你想要进行测试的地址和端口(通常是在生产环境录制,测试环境回放),这里有两点需要注意:

  1. 需要填写传输协议和端口号
  2. IP 需要填写真实的本机 IP 而非 localhost ,因为 Docker 容器的部署模式会影响 localhost 的解析。这一点在官方文档 FAQ 中有详细解释,感兴趣的同学可以了解一下。

回放创建完成后会自动生成一条回放报告,回放进度和结果会轮询刷新。当记录的 State 进度变更为 done 时即表示回放完成,可以看到本次回放 case (用例)总数为 1,失败数为 1。点击 Failed 数量 1 可以进入回放结果详情页。

点击用例,可以看到导致本次回放失败的原因是 responsestatustype.timestamp 节点的数据出现差异(value diff)。该字段是一个时间戳,在前后两次请求后出现差异属于合理情况。这种噪音字段的比对差异往往没有什么参考意义,还会提高使用者的排查成本,这时候就可以直接在 json 报文中右键点击该字段,选择 Ignore Key,将该节点排除在下次比对之外。

设置成功后点击 Rerun 按钮重新执行回放测试,等待回放结束后可以发现回放成功,即本次的测试环境回放数据与生产环境的真实数据在忽略配置后视为相同。这样就完成了一次完整的录制和回放链路测试。

总结

AREX 作为一款基于流量录制回放实现自动化回归测试的工具,很大程度上降低了测试用例编写和测试环境搭建的成本,而且作为一款开源软件,官网文档说明详细,社区活跃(群里大佬回复很及时),对新手非常友好。

本篇文章主要针对 Mac 用户对 AREX 本地快速部署和上手做简要分享,作为抛砖引玉,AREX 还具有其他很多功能例如动态类 Mock 配置、开发自测、固化用例、批量运行测试用例等功能,欢迎感兴趣的朋友们自行探索。

相关推荐
WeilinerL6 小时前
泛前端代码覆盖率探索之路
前端·javascript·测试
大话性能1 天前
MySQL 数据库的备份和恢复(Linux)
测试
大话性能1 天前
【Pycharm 必学技巧 02】智能补全,忽略大小写
测试
Xzh04233 天前
前后端学习的交界
java·ajax·maven·axios·测试
程序员二黑4 天前
Selenium元素定位总失败?这8种定位策略你必须掌握
单元测试·测试·ab测试
程序员二黑5 天前
自动化测试入门:从零开始搭建你的第一个WebUI项目
单元测试·测试·ab测试
从前慢,现在也慢5 天前
(3)Bug篇
学习·bug·测试
霍格沃兹_测试8 天前
软件测试 | 测试开发 | 一文带你了解K8S容器编排(上)
测试
mzhan0179 天前
Linux: network: 拔插网线 interface down/up测试的痛点
linux·服务器·测试·破坏性测试
昵称为空C9 天前
Jmeter 性能测试利器-1(入门指南)
后端·测试