有赞作为一家SaaS公司,除了传统的微商城,还提供了零售、美业等产品解决方案。随着公司业务的快速发展,各业务系统也不断的进行着功能迭代或系统重构,如何保证这个过程中系统功能的正确性和服务的稳定性,是公司测试和开发人员需要面对的一个重要挑战。
目前有赞内部已经有一套机制来保证业务系统的质量,包括一些常规的自动化测试工具和人工测试。但常规的自动化测试工具需要准备大量测试数据,并需要编写各类测试脚本,不但成本高而且效率低。
另外随着业务的快速发展,系统和业务复杂度也在不断提升,需要回归验证的业务场景越来越多。通过编写用例的方式很难覆盖大部分场景,测试人员只能保证对一些核心场景的回归验证,无法实现更进一步把控业务系统质量的要求。
基于以上背景我们研发了有赞自动化服务回归验证平台 - 对比引擎(replay),通过它可以对服务接口进行自动化回归验证,可以大大降低测试成本和提升测试效率。
对比引擎是一个高效的服务回归验证平台,它通过复制线上真实请求到预发环境执行,然后对比线上和预发响应,通过判断线上和预发请求响应结果来识别接口正确性,其中通过请求的响应结果来验证服务接口正确性主要基于这样的经验:
大部分业务迭代过程中对代码的修改最终会体现在接口返回值上,可以通过检测同样请求下接口返回值的差异来验证服务接口正确性
备注:有赞大部分业务系统是线上和预发环境共用一套底层基础服务,包括DB、ES和MQ等服务
对比引擎通过复制线上真实流量去做自动化回归,很容易发现项目迭代及重构中带来的bug,它同传统的服务回归验证工具及手段相比有如下优势:
- 对比引擎一期的设计目标是:
支持读接口重放
下面是对比引擎整体架构图
对比引擎主要包含以下几个组件:
下面会重点介绍 客户端SDK
和 对比引擎服务端
客户端SDK内部逻辑如下图虚线框所示,通过 AOP切面方式
实现请求(方法级别)的采集,之后将请求异步收集到MQ消息队列中
备注:目前只支持读接口的回归验证,写接口不支持主要是防止写接口重放导致出现脏数据,写接口的重放后在后面单独有一节进行介绍
下面是SDK的一些设计要点:
下面是对比引擎服务端结构图,主要包含2个处理逻辑:
下面是服务端的一些设计要点:
请求响应结果比对需要考虑支持如下自定义配置,已满足各种业务需求,比如:
- 对比引擎二期的设计目标是:
支持写接口重放
要支持写接口的重放,首先需要考虑如下几个问题:
- 如何判定服务写接口的正确性?
最简单直观的判定方法是:对于同一个接口,相同的请求参数下响应结果一致则认为是正确。
但是只根据响应结果就能判定接口正确性么?比如有的接口响应为PlainResult<Void>类型,可能内部逻辑是有变更,但是无法反映在响应结果上。
我们可以换个角度来思考,理论上在应用数据上下文一致的情况下,2次同样的写操作产生的数据变更应该是一样的,通过比对数据变更情况就能判断服务写接口的正确性。如果相同则认为逻辑没问题,如果不相同则认为逻辑有问题。这里有2个关键点:
- 需要能感知所有数据变更(变更条件也算,比如变更SQL,相同的变更SQL我们认为产生的数据变更是一样的)
- 需要能构造相同的应用上下文(包括数据等信息)
- 如何保证重放的写请求不会导致业务出现脏数据?
要支持写接口请求重放,必须要保证业务不会出现脏数据,否则会对业务产生不可估量的影响
核心思路:
- 请求录制阶段:记录接口调用过程中所有和外部组件的交互信息(包括请求、响应等关键信息),作为请求的上下文
- 请求重放阶段:mock接口调用过程中所有和外部组件的交互行为,根据请求参数去匹配请求上下文中的响应信息,mock请求的响应结果。这里mock接口调用过程中所有和外部组件的交互行为,主要是考虑到让业务方去区分外部组件是读或写操作本身就有难度,如果有遗漏就可能会产生大量脏数据,风险太高
其中和第三方外部组件的交互入口需要框架组帮忙配合梳理,好在有赞框架组之前在做调用链路追踪系统时已对所有第三方组件进行过埋点,只需暴露第三方组件交互入口即可实现记录请求参数和响应信息的拦截或mock
下面是写请求录制阶段流程图
重要组件说明
- ReplayClientAspect: Replay Client SDK的核心组件,负责请求录制,对于写接口需要记录请求上下文信息,对于重放请求不会进行再次录制
- Framework: 第三方框架的核心组件,负责记录写请求调用阶段和所有第三方组件或接口的交互上下文信息(包括请求、响应等关键信息)
流程说明
- ①:接口调用达到ReplayClientAspect,切面记录请求上下文,并初始化第三方框架交互上下文
- ②:业务逻辑执行过程中和第三方交互时,记录交互请求
- ③:业务逻辑执行过程中和第三方交互完成后,记录交互详情信息,并录入到整个请求的第三方框架交互上下文中
- ④:执行完业务逻辑,记录并保存请求信息(异步方式)
下面是写请求重放阶段流程图
重要组件说明
- ReplayClientAspect: 同上,这里需要补充的是对于重放写请求,需要加载请求上下文信息(包括第三方框架交互上下文)
- Framework: 第三方框架的核心组件,如果发现是重放写请求,则负责mock写请求调用阶段和所有第三方组件或接口的交互行为
备注:
流程说明
- ①:接口调用达到ReplayClientAspect,加载第三方框架交互上下文
- ②:业务逻辑执行过程中和第三方交互时,需要从Replay Client SDK的第三方框架交互上下文信息中匹配到接口的响应信息
- ③:业务逻辑执行过程中和第三方交互是,mock交互行为
- ④:执行完业务逻辑,返回响应信息
其中Replay Client SDK和Framework的交互点有2个:
需要注意的是:放了防止框架bug或者一些其他不可控的因素对线上系统造成影响,如误操作数据等,方案需要考虑兜底手段。这里想到的是对重放请求加压测请求标,这样即使有问题也只是影响的影子库数据,不会对线上业务数据造成影响
应用只需在接口上添加 @Replay
注解就能实现接入
@Replay
@Override
public ListResult<ItemSkuModel> listBySkuCodes(ListBySkuCodesParam param) {
//这里略去接口实现代码
...
}
通过控制台设置需要采集请求的接口、接口的请求采样QPS及重放配置信息
另外通过控制台可以设置对比相关配置,比如忽略比对的字段(有些字段是随着时间变化场景),忽略列表顺序(返回顺序无保证场景)
本文主要介绍了对比引擎的研发背景及实现原理,作为一种自动化服务回归验证工具,对比引擎极大的提升了业务的场景覆盖率和回归验证效率,对于保证线上服务稳定起到了良好的作用,目前公司内部大部分业务(包括商品、库存、营销、会员等)都已接入。
后续一个重点是完善用例库管理功能,包括识别各种请求模板、用例采集功能、用例导出以及跨环境的回归验证(线上引流到测试环境),以更好的完善核心场景测试用例并提升测试效率。
欢迎关注我们的公众号
Original url: Access
Created at: 2019-09-26 14:25:14
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论