在这篇文章中,我们将通过一个实现了书店生成订单功能的简单应用,演示如何使用 AREX 流量回放功能。
AREX 是一款开源的测试工具,提供测试用例管理和无代码侵入的流量回放功能。
本文带来关于 AREX 的实践分享,主要集中在流量回放功能,被测应用是在官方提供的 community-test
应用上进行了一定的功能扩充,实现了一个简单的书店生成订单功能,为特定用户生成某本书的订单,过程中会根据营销政策计算书本价格,也会调用扣库存服务扣除对应书本的库存。
该服务提供两个接口:order
(生成订单)和 updateInventory
(扣库存),其中 order
执行过程中会调用 updateInventory
。
结论
文档比较长,先给出试用结论:
- 用例管理方面:整体类似 Postman,提供了 Postman 的大部分功能,如:脚本、环境变量、WorkSpace 等,本文演示中不涉及。
- 无代码侵入的流量回放功能:其核心原理可以参考官方提供的介绍。
- 接入方便,基本是无成本的
- 数据采集和自动 Mock 能力非常强,支持 Http 服务、数据库、Redis、本地缓存、当前时间的全自动 Mock,通过配置也可以支持内存数据的 Mock
- 写服务支持良好,例如下单服务,在测试时对所有的依赖都进行了 Mock,所以完全不需要担心生成脏订单,而且重要的是,即使进行了 Mock,也可以对订单结果进行验证(例如写到订单库的数据,看测试结果时会拿回放时的 SQL 和采集的测试用例里的 SQL 进行比对)
- 验证点比较完善,测试时不只是对服务响应进行验证,还会对输出数据进行验证,像写到数据库、Redis 里的数据,发送给外部服务的请求也都可以进行验证
- 美中不足: 对于功能比较复杂的应用,由于结果验证是全比对的,为了比较好的体验,需要进行一些配置对结果降噪。
快速安装
AREX 支持两种使用模式,下面分别进行介绍。
Standalone 模式
Standalone 模式指的是 AREX 在本地环境中独立运行,也可以称之为命令行模式,使用非常简单。从:https://github.com/arextest/arex-standalone/releases 下载 arex-standalon-all.zip
文件后直接运行 arex-cli.bat(sh)
即可,启动后会列出当前机器上正在运行中的 Java 服务,选择对应的服务,工具会自动将 Agent attach 到目标服务上,如下:
有以下几个主要命令:
- ls:列出目标服务上已经采集的用例, 刚启动还没有任何数据,需要给服务发送一些请求后再执行该命令。
- replay:将采集的用例在当前服务上进行回放,并给出回放的结果,执行结果会展示在一个弹出的网页上。
点击 Detai 按钮会显示对应用例的执行结果,也能看到运行过程中采集的所有数据,以扣库存接口为例,流程中相关的数据都进行了采集。
接口的响应:
访问 DB 更新库存:
访问 DB 获取书本的详细数据:
如果执行失败又不能简单判断失败原因,可以点击 Debug 按钮,直接进行代码的 Debug,这个功能可以理解成把采集到的请求发送给本地服务,从而可以在 IDE 中进行代码 Debug。在请求执行时,应用本身依赖的服务、DB等也不会产生真正的访问,而是用采集的数据进行 Mock。
- watch: replay 的补充命令,可以查看历史执行情况。
Standalone 模式使用很简单,但不单独支持一些比较复杂的功能,例如 Mock 本地缓存、时间等功能。 因此这个模式更适合给开发在提测前进行一次快速本地验证或发现问题后的本地 Debug 排查。
完整模式
完整模式提供 UI 界面,需要安装一些附属的服务,参照官网提供的安装文档安装即可,安装完后登陆界面如下:
如要使用流量回放功能,则需要提前在被测服务上加载 Agent。
执行下面命令把 Agent 的代码 clone 下来并打包,也可以从 https://github.com/arextest/arex-agent-java/releases 直接下载
git clone https://github.com/arextest/arex-agent-java.git
mvn clean package
在 arex-agent-jar
下会生成对应的 jar 包文件,把这个文件夹拷贝到 D 盘根目录,然后本地执行以下命令启动本地 demo 应用,其中 x.x.x.x
是前面安装的 Docker 的 IP:
java -javaagent:D:\arex-agent-jar\arex-agent-0.1.0.jar
-Darex.service.name=commit-test002
-Darex.storage.service.host=x.x.x.x:8093
-jar MyArexDemoService.jar
也可以直接从 https://github.com/arextest/arex-standalone/releases 下载,里面包含了对应的 jar 文件。
启动完成后,该应用会自动出现在 AREX 的回放应用列表中:
加载了 AREX Agent 的应用发布后会自动根据设置的录制频率来采集用户的真实请求并保存下来,这些保存下来的数据就是后续回放的测试用例,用来验证新改动的代码是否存在预期外的结果。
应用设置
应用设置里可以对目标应用进行一系列的设置,这次只用到了录制相关的,界面如下:
这里可以设置录制的时间和频率。 下面还有个高级菜单,这里支持一些功能增强的配置:
- Mock 时间:打开这个功能后回放的时候,会把系统当前时间还原成用例录制的时间(不是修改机器时间,而是 Mock 了 Java 里的各种时间类/方法),来保证用例执行的稳定。
- 动态类:这个可以理解成内存数据的 Mock,主要是一些内存中的缓存数据,避免不同环境的数据差异带来的测试用例执行不稳定,配置方法稍显复杂,需要配置本地缓存对应的类名(必须)和方法名、参数表等。这次测试服务中有用到一个营销政策的本地缓存,服务根据营销政策计算书本的售卖价格,数据不同会影响服务的响应,所以也添加了这个配置。也就是说,有了这个配置,可以节省很多执行测试之前的准备操作,例如数据库、Redis、配置的同步等等。用例录制的时候依赖的是什么数据,测试的时候用的就是什么数据,完全不需要再做其他额外的准备。
- Operation:可以打开或关闭服务下某个接口的录制功能 除此之外,AREX 还提供忽略节点和乱序数组比对等配置,这些配置都是为了提升测试用例的稳定性,具体使用方式可以参考官方文档。
执行回放
在回放菜单执行回放后(目标回放环境设置为待测试应用发布的 IP地址和端口号),会看到如下执行记录:
点击记录会看到一个测试结果的汇总信息,显示执行成功的比例,下面是一个被测试接口的列表,
本次演示中所有的 CASE 都执行失败了,点击 DiffScenes 可以看到失败的细节:
从这里看这 26 个 CASE 都是因为服务返回的处理时间不同导致的,所以这里只有一个错误卡片页,点击卡片页会看到一个图形化的界面展示用例执行步骤,失败的步骤会用红点标注,解决这个失败需要在配置里打开时间 Mock 功能,或者把这个时间节点在配置里设置为除外。数据库的查询和更新操作都是通过的。 点击任何一个标签都能看到录制和回放时对应步骤的详细数据。
在回放记录页面,DiffScenes 按钮旁边还有个全量 Case 的按钮,点击会弹出一个抽屉页,列出记录下来的所有测试用例:
录制详情按钮可以看到录制下来的用例的数据详情,保存按钮可以把这个用例固化下来保存在请求集合菜单里。
在这里可以对保存的 Mock 数据根据需求进行编辑,也可以添加脚本进行更丰富的验证。
线上问题快速本地复现
对于⼀些业务⽐较复杂的应⽤线上出现问题时,在开发本地往往不能复现(依赖的服务不稳定、环境数据不⼀致等等原因),靠⽇志排查⽐较看脸,也费时间。对开发来说,如果能够在本地进行复现,直接 Debug 就最好了。
AREX 中提供了这个功能,在集合菜单中,新建⼀个快速请求,在请求头中点击下图按钮添加特定请求头,随后发送该请求,生产上就会对这个请求进行录制操作:
请求完成后点击上⽅的保存按钮后就会将录制的结果⾃动保存下来,录制到的数据可以完美复现⽣产运⾏环境,复现线上问题。把请求地址改为 localhost
发送请求即可实现在本地的 Debug。