如何优雅的使用Mock Server

事出有因

昨天跟同事讨论我们在用的rap2(一个集接口编写和mock server的开源项目)和刚上线了一个easy-mock的server,到底哪个好用。

我们主要讨论的点有个两个: 接口的一致性、 编码的无侵入性。

背景

自从前后端分离后,完成前后端的分工之后,大家就可以各司其职,并行开发。前后端的协议标准就是接口文档。前端的所有逻辑和展现全部依赖接口文档中规定的数据结构。所以接口文档就变成了开发过程的重中之重。

当然有一份文档也是不够的,前端开发页面逻辑调试、测试同学测试接口、接口文档不断的更新、接口复杂的返回情况等诸多问题,这就需要有一个Mock Server来帮忙。

更多的关于Mock内容的请大家自行Google了解不再赘述。

接口的一致性

接口文档,是整个开发过程中的约定和依据,所以同步更新文档也成为关键一环。

之前的办法

使用markdown维护一个文档,更新之后分发给大家;或者就是放到wiki来管理,每次更新到wiki上面,供大家来阅读。如果要Mock数据(easy-mock或者其他mock server),相关人员修改mock字段,更新完毕。

优雅的做法

在线编辑接口,实时保存,同步更新。例如采用Rap2(支持JSON复制,支持接口的移动复制),保存后就是接口文档,所有人实时更新,同时Mock数据自动更新。

编码的无侵入性

Mock 对代码的侵入越小,我们维护和开发的成本也越低。以 Vue-cli2.x生成的项目为例:

在工程中的config目录dev.env.js,配置开发环境下API数据来源地址

...
module.exports = merge(prodEnv, {NODE_ENV: '"development"',ENV_CONFIG: '"dev"',// BASE_API: '"dev server"',BASE_API: '"http://rap2.taobao.org:8080/app/mock/39"', // mock server
})

这样我们在开发过程中,用到axios,只需要根据不同环境编写一次代码即可

const service = axios.create({baseURL: process.env.NODE_ENV === 'production' ? process.env.BASE_API : '/api',...
});

从Mock数据切换到Dev Server的API只需要注释一行配置文件代码,无需修改项目源代码。非常友好。

这时候我们再看easy-mock 跟rap2生成的Mock Url:

http://easy-mock.com/mock/5c08e554bd9f9c3a01c5abf6/api/info
=> host/mock/projectId/:pathhttp://rap2.taobao.org:8080/app/mock/45/GET/api/info 
=> host/app/mock/:repositoryId/:method/:path
复制代码

ps:后来发现rap2的url可以不带method,但是就是不能使用restful API这种根据method区分的接口了。

从生成的url来看,rap2中有:method的变量,若是要无缝切换需要更多的工作。无法直接替换BASE_API。如果在代码里拼接会有很大的代码侵入性。

所以考虑在工程层面进行优化:

在工程目录config目录中index.js中,可以设置代理来统一处理:method变量。在proxyTable对象中加入bypass方法,对每个通过代理的接口,处理request url成为一个合格的rap2 mock的url。

module.exports = {dev: {...proxyTable: {'/api': {target: config.BASE_API.substring(1, config.BASE_API.length - 1),changeOrigin: true,pathRewrite: {'^/api': '/'},bypass: function (req, res, proxyOptions) {if (proxyOptions.target.indexOf('mock') !== -1) {const path = req.url.replace(proxyOptions.context, proxyOptions.context + '/' + req.method);// path => /api/GET/pathreq.url = path;}}}},

这样就能无侵入性的使用rap2了。

结论

从接口文档的一致性和编码的无侵入性来看,rap2可能更优一点,但是rap2毕竟是一个年轻的开源项目,很多机制并不完善。从去年年初使用rap2,最近升级到新版本数据库表结构还要做映射调整,适合喜欢折腾的人。这样easy-mock的稳定性优势就值得考虑。

在我看来,未来的Mock Server不单单只是一个Mock,肯定是集 接口编写 + 自动Mock于一身的,还有一些类似接口字段校验的辅助功能。

个人还是很看好rap2的,毕竟从rap1重构的项目,有一定的使用背景,重构应该能出更好的开源项目。

再次感谢开源项目对开发者带来的便利。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末领取】


     【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图+全套资料】


一、Python编程入门到精通


二、接口自动化项目实战 

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具


八、JMeter性能测试 

九、软件测试全套资料

十、总结(文末尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机视觉|生成对抗】条件生成对抗网络(CGAN)

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Conditional Generative Adversarial Nets 链接:[1411.1784] Conditional Generative Adversarial Nets (arxiv.org) 摘要 生成对抗网络(Generative Adversarial…

Windows 11 家庭中文版找不到组策略文件gpedit.msc

最近因为调整日期问题需要用到组策略文件gpedit.msc,但是发现找不到文件 在按键盘 winR 打开运行界面输入 gpedit.msc 回车 Windows找不到文件’gpedit.msc’。请确定文件名是否正确后,再试-次。 检查电脑Windows系统版本 是 Windows 11 家庭中文版 果断早网上搜…

Jmeter 参数化的几种方法

目录 配置元件-用户自定义变量 前置处理器-用户参数 配置元件-CSV Data Set Config Tools-函数助手 配置元件-用户自定义变量 可在测试计划、线程组、HTTP请求下创建用户定义的变量 全局变量,可以跨线程组调用 jmeter执行的时候,只获取一次&#xff0…

kafka 02——三个重要的kafka客户端

kafka 02——三个重要的kafka客户端 1. 前言1.1 关于 Kafka 的安装1.2 常用客户端简介1.3 依赖 2. AdminClient2.1 Admin Configs2.2 AdminClient API2.2.1 设置 AdminClient 对象2.2.2 创建 topic 获取 topic 列表2.2.3 删除topic2.2.4 查看 topic 的描述信息2.2.5 查看 topi…

【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据

【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据 文章目录 【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据前言出现的背景一、TDSQL-C数据库是什么?二、TDSQL-C 的特点三、TDSQL-C的应用场景四、基于TD…

测试相关Liunx基础知识

Linux的历史和安装 基本常识 Liunx目录结果 常见

CTF之逆向之阿里巴巴

题目地址:http://www.shiyanbar.com/ctf/13 题目预览: 解题过程: 1、下载附件发现是exe文件 2、使用PEid和Detect It Easy查壳 和 开发语言,发现没有加壳,都是用C#开发的 3、C#和Java Python属于解释型语言&#xff…

Win10安装GPU支持的最新版本的tensorflow

我在安装好cuda和cudnn后,使用pip install tensorflow安装的tensorflow都提示不能找到GPU, 为此怀疑默认暗转的tensorflow是不带GPU支持的。 在tensorflow官网提供了多个版本的GPU支持的windows的安装包 https://www.tensorflow.org/install/pip?hlz…

用ChatGPT和六顶帽思考法帮助自己更好地决策和解决问题

当我们在解决复杂问题时,我们常常陷入单一视角的状态。创造性思维领域的先驱爱德华德博诺,提出了六顶帽思考法[1],这意味着我们可以从六个不同的视角来思考一个问题,以实现高水平决策和解决问题。 每一顶“帽子”代表不同的视角。…

SAP ME2L/ME2M/ME3M报表增强添加字段(包含:LMEREPI02、SE18:ES_BADI_ME_REPORTING)

ME2L、ME2M、ME3M这三个报表的字段增强,核心点都在同一个结构里 SE11:MEREP_OUTTAB_PURCHDOC 在这里加字段,如果要加的字段是EKKO、EKPO里的数据,直接加进去,啥都不用做,就完成了 如果要加的字段不在EKKO和EKPO这两个…

LabVIEW控制通用工作台

LabVIEW控制通用工作台 用于教育目的的计算机化实验室显着增长,特别是用于运动控制的实验室。它们代表了各种工业应用中不断扩大的领域,并成为以安全的方式使用通常昂贵或独特的实验室设备进行实时实验的宝贵工具。NI LabVIEW等软件应用程序的开发和不断…

智慧工地源码,互联网+建筑工地,基于微服务+Java+Spring Cloud +Vue+UniApp开发

基于微服务JavaSpring Cloud VueUniApp MySql开发的智慧工地云平台源码 智慧工地概念: 智慧工地就是互联网建筑工地,是将互联网的理念和技术引入建筑工地,然后以物联网、移动互联网技术为基础,充分应用BIM、大数据、人工智能、移…

【jvm】类加载器的分类

目录 一、说明二、示例2.1 代码2.2 截图 三、启动类加载器四、扩展类加载器五、应用程序类加载器 一、说明 1.jvm支持两种类型的类加载器,分别是引导类加载器(bootstrap classloader)和自定义类加载器(user-defined classloader&a…

【springboot启动报错】java: 错误: 无效的源发行版:17

报错截图 解决方案 第一步:编辑配置,改为想用的jdk版本 第二步:文件--->项目结构,改为对应的SDK 第三步:文件--->设置--->构建、执行、部署--->编译器--->Java编译器,修改目标字节码版本 第…

fiddler抓包工具的用法以及抓取手机报文定位bug

前言: fiddler抓包工具是日常测试中常用的一种bug定位工具 一 抓取https报文步骤 使用方法: 1 首先打开fiddler工具将证书导出 点击TOOLS------Options------Https-----Actions---选中第二个选项 2 把证书导出到桌面后 打开谷歌浏览器 设置---高级…

自定义 视频/音频 进度条

复制代码根据自己需求改动就可以了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><metaname"viewport"conten…

Vue3组件库

Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目&#xff08;yarn&#xff09; D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh pa…

UNIAPP中开发企业微信小程序

概述 需求为使用uni-app开发企业微信小程序。希望可以借助现成的uni-app框架&#xff0c;快速开发。遇到的问题是uni-app引入jweixin-1.2.0.js提示异常: Reason: TypeError: Cannot read properties of undefined (reading ‘title’)。本文中描述了如何解决该问题&#xff0c…

K8S之存储卷

K8S之存储卷 一、emptyDir emptyDir&#xff1a;可实现Pod中的容器之间共享目录数据&#xff0c;但emptyDir存储卷没有持久化数据的能力&#xff0c;存储卷会随着Pod生命周期结束而一起删除二、hostPath hostPath&#xff1a;将Node节点上的目录/文件挂载到Pod容器的指定目录…

TypeScript 关于对【泛型】的定义使用解读

目录 概念导读泛型函数多个泛型参数泛型约束泛型别名泛型接口泛型类总结&#xff1a; 概念导读 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。使用泛型 可以复用类型…