AREX 社区版本
基于真实请求与数据的流量回放测试平台。
AREX 介绍
背景
对于一个初上线的简单服务,只需通过常规的自动化测试加上人工即可解决,但我们线上核心的业务系统往往比较复杂,通常也会频繁的需求迭代,如何保证被修改后的系统原有业务的正确性就比较重要。常规的自动化测试需要投入大量的人力资源,准备测试数据、脚本等,并且覆盖率通常也不高,难以满足要求。
为了保证一个线上系统的稳定性,开发和测试人员都面临不少的挑战:
- 开发完成后难以快速本地验证,发现初步的问题,容易陷入提测->发现 bug->fix->提测的循环
- 准备测试数据、自动化脚本编写和维护需要大量的人力成本,而且难以保证覆盖率
- 写服务难于验证,而且测试会产生脏数据,例如我们的核心交易系统,可能会往数据库、消息队列、Redis 等写入数据,这部分数据往往比较难以验证,测试产生的数据也难于清理
- 线上问题难以本地复现,排查困难
什么是 AREX
AREX 通过复制线上真实流量到测试环境进行自动化回归测试,解决回归测试的难题。
AREX 通过 AOP 的方式将请求入参及返回结果以及执行过程中的一些快照数据例如访问数据库的入参和返回结果、访问远程服务器的入参及结果保存下来。然后将快照数据发送给测试机器(代码发生变化的机器)完成一次回放过程。通过将落库数据、调用后台请求的数据以及返回结果和线上真实请求发生时的数据进行对比,发现其中的差异,从而识别被测试系统的问题。
AREX 能够录制应用底层对外部依赖的所有操作,包括数据库操作和对外部系统的请求。在回放测试时,当触发到相关方法,AREX 会从录制的数据中提取信息,直接返回给应用,避免了对实际数据库或其他依赖的交互,减少对特定环境数据的依赖,专注于验证程序本身的逻辑和功能。
同时完美支持了写接口的测试。例如,在订单落库和调用第三方支付接口等关键场景中,AREX 流量回放的核心机制在于拦截并 Mock 框架调用,使用录制的数据来替代真实的数据请求,确保测试过程中不会发生任何真实的外部交互,如数据库写入操作或第三方服务调用,从而有效防止回放测试中脏数据的写入。
AREX 支持的 API 测试包括
- 常规测试, 类 Postman 的接口测试,用例设置、执行、结果断言(ASSERT)等
- 回放测试, 用真实的生产数据进行回放测试,并比对返回结果存在的差异
AREX 组成
AREX 由 AREX Java Agent、UI(前端服务)、Schedule Service(调度服务)、Storage Service(存储服务)、Report Service(报告分析服务)及 Mongodb、Redis 数据存储等多模块组成。
ID | Instance | Model Name | Description |
---|---|---|---|
1 | 不限 | AREX Java Agent | 用于流量捕获和回放的轻量级 Java Agent。 |
2 | 1 | 调度服务(AREX-Schedule) | 用于发送回放请求并检索所有响应以进行比较。 |
3 | 1 | AREX-API | 为 AREX 前端页面提供所有 API 接口。 |
4 | 1 | 存储服务(AREX-Storage) | 为 AREX Agent 提供了以 Mock 方式保存录制和获取响应的功能。 |
5 | 1 | AREX 前端(AREX-Front) | AREX 前端页面。 |
6 | 1 | MongoDB | 数据存储及配置管理数据库 |
7 | 1 | Redis | 高速回放缓存 |
工作流程
1. 流量录制:
- AREX Java Agent 在生产环境中搭载在 Java 应用上,录制数据流量和请求信息。
- 将录制到的信息发送到 AREX 数据存取服务(Storage Service)。
- 数据存取服务将信息导入 MongoDB 数据库中进行存储。
2. 流量回放:
- 调度服务向目标验证服务发送接口请求,模拟生产环境中的行为。
- 测试环境中的被测应用同样搭载 AREX Java Agent,当被测应用需要对外部依赖进行调用时,Agent 会将录制的外部依赖(外部请求/DB)的响应返回给被测应用,避免了对实际数据库或其他依赖的交互,减少对特定环境数据的依赖,专注于验证程序本身的逻辑和功能。
- 目标服务处理请求逻辑,并返回响应报文。
3. 结果验证与报告:
- 调度服务分别对录制和回放的主接口响应报文与子调用的入参进行对比,验证系统逻辑的正确性。
- 比对结果分析后生成回放报告。
- 测试人员检查回放报告,评估应用的功能和性能。
工作原理
我们假定生产环境应用会正常的响应用户的请求,通过 aop 的方式将请求入参及返回结果以及执行过程中的一些快照数据例如访问数据库的入参和返回结果、访问远程服务器的入参及结果保存下来。然后将快照数据发送给测试机器(代码发生变化的机器)完成一次回放过程。通过将落库数据、调用后台请求的数据以及返回结果和线上真实请求发生时的数据进行对比,发现其中的差异,从而识别被测试系统的问题。
- xxxTestCase: 采集下来的数据在回放时做为测试 CASE
- xxxMock:在回放时会使用采集的数据进行 Mock,代替真正的数据访问
- xxxExpect 和 xxxReal:在测试结束后会验证对应的数据,发现代码中潜藏的隐患
技术原理
在 JDK1.5 中,Java 引入了 java.lang.Instrument 包,该包提供了一些工具帮助开发人员在 Java 程序运行时,动态修改系统中的 Class,以此实现对原类的功能增强。现在有很多工具都是基于此技术实现的,例如阿里开源的 arthas、监控工具 SkyWalking 等, AREX 的数据采集和自动 Mock 也是基于此技术实现。
核心优势
低成本
无代码侵入,基本无接入成本
无需编写测试用例,海量的线上请求也能保证高覆盖率
插桩代码足够简单,性能损耗低
多样性支持
支持写验证,支持数据库、消息队列、Redis 数据的验证,甚至支持验证运行时的内存数据,并且测试时不会产生脏数据。
测试用例运行稳定
支持各种主流技术框架的自动数据采集和 Mock,参见:arex_java ,并且支持了本地时间、缓存,在回放时精准还原生产执行时的数据环境。
快速线上问题复现
支持一键本地调试,可以快速本地调试线上问题
安全稳定
提供流量脱敏机制,保护线上敏感数据。代码隔离,也实现了健康管理,在系统繁忙时会智能降低或关闭数据采集频率
良好的功能测试支持
支持测试脚本,也可对采集的数据进行简单的编辑实现固定测试观点的测试,避免大量的测试数据准备