写点什么

携程 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:162748

评论 1 条评论

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

环信荣登36氪WISE2020企服金榜-智能客服榜首

DT极客

Week4总结

王志祥

极客大学架构师训练营

年薪百万架构师推荐的888页Java王者级核心宝典,offer直接来

无予且行

Java 面试必考的 6 个技能,都在这了

架构大数据双料架构师

让你秒懂Spring中Mybatis的花样配置

小谈

Java spring 面试 Spring Cloud mybatis

系统结构:作业

梅子黄时雨

极客大学架构师训练营

ARTS 第 4 周

乌拉里

javascript 部分数据类型的用法

Isuodut

一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。

~就这样~

架构师0期04周总结

我在终点等你

架构师0期04周命题作业

我在终点等你

week 04 作业

Safufu

分布式系统架构学习总结(第四周)

~就这样~

聊一聊 HashMap

江城子

Java hashmap

原创 | TDD工具集:JUnit、AssertJ和Mockito (二十四)编写测试-内建扩展

编程道与术

Java 编程 TDD 单元测试 JUnit

如何构建你自己的 JVM (2) HelloWorld

孤星可

Java JVM 深入理解JVM

Linux 性能优化实战 笔记-IO篇

程序员老王

从0-1学习项目方案设计

赵孔磊

架构师训练营第四周感悟

张锐

极客大学

从 0 到 1 搭建技术中台之推送平台实践:高吞吐、低延迟、多业务隔离的设计与实现

伴鱼技术团队

kafka 缓存 分布式架构 消息推送 push

这20道微服务面试题要是不会,offer就与你无缘

犬来八荒

Java 架构 面试 微服务

到底什么是HashMap?

小闫

Java spring 后端 JVM hashmap

week 04 总结

Safufu

计算机操作系统基础(九)---存储管理之段页式存储管理

书旅

php laravel 线程 操作系统 进程

攻克SpringBoot底层源码后,才发现开发原来这么香

无予且行

Java spring 面试 Spring Boot 开发

使用 Flutter 快速实现请假与写周报应用

LeanCloud

flutter 后端 数据 教程

谈一谈年终奖中的那些坑

张小方

程序员 面试 offer 薪资 年终奖

系统架构:学习小结

梅子黄时雨

极客大学架构师训练营

极客大学架构师训练营 系统架构 第8课 听课总结

John(易筋)

极客时间 系统架构 极客大学 极客大学架构师训练营 系统架构演化

慧点OA转战政企市场,钉钉们羡慕么?

人称T客

【思考】-产品等级与市场定位匹配

superman

定位 产品定位

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