写点什么

携程 Mock 本地化实践

  • 2020-03-22
  • 本文字数:1814 字

    阅读完需:约 6 分钟

携程Mock本地化实践

一、引言

这里说的 Mock 指的是系统测试或者接口测试场景下,模拟被依赖的其他服务接口进行响应返回的工具。测试人员通过服务接口级 Mock 的手段隔绝真实外部依赖,创造可控、稳定的测试运行环境,以提升问题的查全率和查准率。


然而,随着业务的发展和微服务化的进程,我们系统的结构越发的庞杂,Mock 工具的实际效果开始变得差强人意。这里给大家分享我们遇到的挑战以及解决思路。

二、问题的出现

随着业务发展和微服务化进程,系统结构越发庞杂。服务化场景下使用 Mock,有两个问题开始浮现出来。


1)工作串扰,启用 Mock 影响其他应用的测试工作


理想中的场景:



操作注册中心,使依赖指向 Mock 服务。


现实中的场景:



通过注册中心切换被测应用的依赖指向到 Mock 服务的动作,同样会影响到环境中其他应用的依赖指向,引发串扰(上图中应用 B 受到影响)。


PS:有被问及为何不调整被测应用的代码或者配置指向目标 Mock,避免串扰其他应用。这种入侵代码的手段是下策。常在河边走哪有不湿鞋,总会有忘记改回来造成生产事件的时候的。


2)生效延迟


Mock 的生效依赖注册中心的服务注册生效过程。由于缓存的存在,实际的生效时间是无法确定的,存在几秒到几分钟的延时。


对于功能测试场景而言,这些延时并无大碍,而在接口自动化测试场景中,这些延时将导致结果的不稳定性激增。为了避免延时带来的不确定性,通常会在测试框架中添加隐式等待的机制,重试调用被测接口,直到期望结果的出现,或者在达到最大等待时间后抛出异常。这么做的代价是测试执行效率的牺牲。在 case 数量很大时,这累计起来的等待时间就让人有些痛苦了。


现在问题比较清楚了,由于 Mock 的生效过程依赖服务架构中的“注册中心”,所以导致了 Mock 的串扰和延迟的出现。看着不是大问题,但确实用着不舒服。抽象一点说就是,“测试的过程依赖了被测系统的一个基础组件,造成测试执行稳定性的下降”。

三、解决思路

1)Mock 边车化,为应用提供本地化的 Mock,使 Mock 同具体服务架构解耦。Mock 一对一服务被测应用,以隔绝多应用间串扰的可能。


2)Mock 的启用和断开,通过控制被测应用所在 JVM 代理相关系统变量进行。即 Mock 的存在对应用透明,不依赖服务架构也不侵入应用代码和配置。


下图展示了应用与 Mock 的概要部署关系:



解决方案概述


上述问题的解决方案由四部分组成——servlet agent、本地 Mock 代理、Mock server、Mock 配置客户端。


  1. servlet agent(开关):设置被测应用所在 JVM 的网络代理相关系统变量,导出应用对外请求,转发至“本地 Mock 代理”。同时提供 API 供“Mock 配置客户端”调用,以供人员或者脚本控制 Mock 的链接可断开。就是被测应用 Mock 与否的热开关。如图:



  1. 本地 Mock 代理(桥梁):根据自身维护的路由配置转发请求至 Mock server 或者原始目标服务器。同时提供 API 供“Mock 配置客户端”进行路由表的配置。在 Mock 启用的状态下,作为被测应用到 Mock 服务或者真实依赖之间桥梁。如图:



  1. Mock server:就是原本意义上的 Mock。根据 Mock 的配置内容进行具体 response 的返回。市面上也有不少开源的 Mock 工具可以放在这块来用,最好选择提供了 API 供外部调用进行设置的。这样跟“Mock 配置客户端”对接起来工作量就很小了,在方案中的位置如上图。

  2. Mock 配置客户端:提供简单的 API,在方案中的问题如上图。


  • 供测试脚本调用,在测试脚本中直接控制 Mock 的链接,断开,启动,停止,和具体 Mock 的设置。

  • 供 GUI 工具调用,让测试人员可以控制 Mock 行为。


最终对测试脚本暴露出来就是这个“Mock 配置客户端”吐出的具体 API。这部分可以发挥想象力,结合具体场景包装的使用起来方便些就行了。


Mock 的开关和配置过程简图:



Mock 打开时的依赖请求过程简图:


四、小结

我们通过使 Mock 本地化,给 Mock 加开关(servlet agent),做桥梁(本地 Mock 代理)的方法解开了 Mock 工具同服务架构之间的耦合关系,解决了启用 Mock 时的串扰和延时问题。


我们发现这个方案存在一定的普适性,未来可以考虑把 Mock 开关从 JVM 层(servlet agent)下降到系统层,那么也就具备了服务其他语言应用的能力了。


作者介绍


Peter Sun,携程高级测试经理。


本文转载自公众号携程技术(ID:ctriptech)。


原文链接


https://mp.weixin.qq.com/s?__biz=MjM5MDI3MjA5MQ==&mid=2697269453&idx=2&sn=4062e1028d0bedab3ba9b4bc6b044c77&chksm=8376eff9b40166eff5ceeab6aea2be9917e8d5559c4101a28b9cd165b42f9aed16f4b5435d3f&scene=27#wechat_redirect


2020-03-22 10:162744

评论 1 条评论

发布
用户头像
如何解决当前被测服务作为其他服务的依赖服务时mick本地化带来的副作用
2020-03-22 20:53
回复
没有更多了
发现更多内容

活动租赁互动LED舞池特点和场景使用

Dylan

活动 LED LED display LED显示屏 LED屏幕

慢查询日志在性能优化中的价值

电子尖叫食人鱼

性能优化

研发效能的下一站:AI是否会让你“无事可做”?

思码逸研发效能

研发效能 效能度量 效能管理 智能编程 思码逸

“上海有AI”,一座城市的智惠答卷

Alter

不要傻呵呵等金九银十了!

王磊

孙宇晨的而立之年:争议未远,传奇已立

极客天地

智能汽车,不只是造出来的,更是“拟”出来的

DevOps和数字孪生

智能汽车 数字样机

Gemini 2.5模型重大升级:更智能的AI技术

qife122

深度学习 AI

基于深度学习的YOLO框架实现金属工业表面缺陷识别|开箱即用系统级项目(源码+模型+界面)

程序员Geek

人工智能

突破上下文限制!8大AI记忆优化策略全解析

聚客AI学院

人工智能 agent LLM 大模型落地 AI 智能体

如何安装DashVector向量检索服务SDK

DashVector

数据库 大数据 AI 大模型

企业落地Data Agent,一共需要几步?

字节跳动数据平台

大数据 Data Agent 数据智能体

一个普通IT人的20年奋斗:从小白到编程教育布道者

编程启航栈

技术人成长

行业预测:海外舆情监测系统将成为下一个出海必备工具

沃观Wovision

出海企业 海外舆情监控 沃观Wovision 舆情监测系统

WAIC 2025重磅!天翼云发布算网一体服务!

天翼云开发者社区

人工智能

KWDB 分布式部署过程与 deploy.sh cluster -i 命令分析

KaiwuDB

AWS高级解决方案架构师黄海波:GenAI 时代非结构化数据处理的实践与趋势洞察

数新网络官方账号

SAKE:基于激活导向的知识编辑技术

qife122

知识编辑 最优传输

闲鱼商品列表API技术文档

tbapi

闲鱼API 闲鱼商品详情接口 闲鱼商品列表接口 闲鱼数据采集

直击WAIC | 百度袁佛玉:加速具身智能技术及产品研发,助力场景应用多样化落地

百度Geek说

微帧GPU视频硬编优化引擎:面向人工智能大时代的AI算法与硬编协同优化方案

微帧Visionular

AI口语APP的功能优化

北京木奇移动技术有限公司

软件外包公司 APP外包公司 AI英语口语

如何安装CST的Linux版本

思茂信息

仿真 Linux、 CST Studio Suite

Hello World背后藏着什么秘密?一行代码看懂Java的“跨平台”魔法

poemyang

编译原理 字节码 Java虚拟机

LazyLLM 教程 | 第 2 讲:10 分钟上手一个最小可用 RAG 系统

商汤万象开发者

高效掌控全局,安全运筹帷幄:鸿蒙电脑大屏理财,商务精英必备!

最新动态

Coze开源本地部署教程

测吧(北京)科技有限公司

人工智能 软件测试 测试开发 Coze开源

基于 Amazon Nova 实现优化呼叫中心导航场景

亚马逊云科技 (Amazon Web Services)

2025-07-31

Joseph295

黑客正积极利用PaperCut旧漏洞

qife122

网络安全 PaperCut

重塑AI算力底座!阿里云服务器操作系统V4正式发布

新消费日报

携程Mock本地化实践_软件工程_Peter Sun_InfoQ精选文章