关于mock:10年开发浅谈-eolinkapifoxapipost-横向对比

性能比照在理论工作中,eolink 、apifox、apipost 三个工具,我集体都有应用。接下来,我会对三款性能比照,于是我拉了个性能比照的清单。 特地阐明:以下的比照,不吹不黑,只列性能,纯主观比对,不带有任何商业带货的意义。 eolink 、aifox、apipost 三款工具有很多功能模块,本次仅筛选罕用的三个功能模块,接口测试、Mock 数据、在线文档。 以下是接口测试、Mock 数据、在线文档等几个子性能的比照状况。 咱们会筛选几个罕用性能进行理论的实用比照,给大家展现一下三个工具的相同点和不同。 接口测试比照http/https 协定测试 http/https 协定测试是在日常工作中最罕用的性能,eolink 、aifox、apipost 三款工具都反对该性能,咱们次要比照 UI 界面和性能易用性。 这里应用 get 申请接口做演示: https://suggest.taobao.com/sug?code=utf-8&q=%E6%B5%8B%E8%AF%9... eolink点击创立接口后,在顶部 tab 中展现,包含:文档、编辑、测试、mock、监控等五个性能。 点击测试 tab 能够看到,蕴含:申请头、申请体、Query 参数、REST 参数、权限校验、前置脚本、后置脚本、高级设置等性能。 点击发送按钮进行接申请,在返回后果局部展现接口数据。在返回后果局部展现工夫剖析性能,能够剖析接口申请到接口返回数据的整个网络申请过程。 apifox点击创立接口后,在顶部展现文档、批改文档、运行、高级 Mock 等四个性能。 点击测试 tab 能够看到,蕴含:Params、Body、Headers、Cookies、前置操作、后置操作等性能。点击发送按钮进行接口申请,在返回 Body 中展现返回数据。 apipostapipost 的创立接口页面,和 eolink、apifox 布局不太一样,感觉更像 postman 的页面布局。mock 数据须要在下边切换应用。 点击发送按钮发送接口测试,在实时响应局部查看返回数据,展现响应头状态码、接口响应工夫等数据。 小结: 在 http/https 协定测试上,eolink、aifox、apipost 三个工具都能很好反对性能的实用,不同点是页面上的布局差别和用户体验上的差别。 WebSocket 协定测试咱们在做接口测试时,除了常见的 http 接口,还有一种比拟多见,就是 WebSocket 接口。 WebSocket 协定测试性能,在 eolink 和 apipost 反对,然而在 apifox 中不反对。 eolink在编辑页面抉择 ws 协定,输出 ip+ 端口信息。 ...

May 23, 2023 · 1 min · jiezi

关于mock:最强-Mock-工具没人反对吧

背景在开发过程中,因为后端与前端并行开发,或者前端须要期待后盾开发,难以保障对接效率,同时即应用开发好的 API 对接,也有可能一个 API 不通就阻塞了整个软件的对接工作。同时对软件的敏感度也很高,一不小心就可能导致整个软件不能失常工作。并且界面之间存在着重大的相互依赖关系,产生的业务逻辑非常复杂,这些都会对软件的开发效率产生很大的影响。 所以学习如何利用最好的 Mock数据是很要害的。这样做会升高前端开发者的工作量,升高开发费用,进步开发效率。 以下是一些常见的Mock办法,咱们能够依据具体的场景和条件来进行抉择和配置。最要害的是要晓得如何去做,并从中挑选出最适宜本人的形式。 Mock介绍或者还有一些没见过 Mock的读者,不晓得 Mock是什么。明天就来跟你说说这玩意的厉害,这玩意非同凡响! 简略地说, Mock是指在测试期间,为一些难以构建或不易取得的对象,创立一个虚构物体进行测试。而这个虚构物体就是模仿物体,模仿对象是在调试过程中理论对象的代替。 有时候, Mock服务被称为一个测试服务替代品,或一个测试服务,上面的图片十分活泼地阐明了它的性能。 Mock能解决什么问题?Mock性能的劣势: 前端对接不依赖后端: 让前端工程师独立于后端进行开发。减少测试的真实性: 通过随机数据,模仿各种场景。开发无侵入: 不须要批改既有代码,就能够拦挡Ajax申请,返回模仿的响应数据。数据类型丰盛: 反对生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、色彩等。不便扩大: 反对扩大更多数据类型,反对自定义函数和正则。Mock性能实用场景在理论工作中十分多,真正在理论我的项目中,引入Mock工具通常来解决如下几类问题。 次要有: 开发进行单元测试因为单元测试只对目前的单元进行,所以必须保障所有的内外依赖关系都是稳固的,应用 mock的形式来模仿根底单元依赖的其它单元,这样就能够把测试的重心放在以后单元的性能上,从而打消内部因素的影响,进步测试的准确性。 调用第三方接口在做接口自动化的时候,有时候须要调用第三方的接口,然而他人公司的接口服务稳定性不受你的管制,有可能他人提供的测试环境明天服务给你开着,他人就关掉了,给自动化接口测试带来很多的麻烦,此时就能够通过mock来模仿接口的返回数据,比方模仿各种第三方异样时的返回。 解决接口间的相互依赖例如,您正在开发前端网页,当初您须要开发付款性能:下一次订购、付款页面界面、付款后果、付款胜利、显示付款胜利页、付款失败页。为了实现这个个性,您必须调用后盾界面,并显示出相应的页面。当初的后端界面还没有齐全开发进去,如果是前端开发,那就只能加班了。要实现开发工作的同步,在这个时候,您能够依照接口文件的要求,将接口的地址和参数发送给用户,再通过 mock接口的不同的返回接口,来实现开发工作。 传统Mock解决方案传统Mock解决方案常见的有两种,一种是应用Postman接口测试工具进行Mock数据,另外一种是应用Mock js第三方库进行Mock数据。 Postman接口测试工具Postman中须要点击Create Mock Server配置mock服务。抉择之后,应用程序会进行一步一步的提醒。 配置须要mock的接口地址,手动输出响应数据返回值即可。 Mock js第三方库Mock.js 是一款模仿数据生成器,旨在帮忙前端攻城师独立于后端进行开发,帮忙编写单元测试。提供了以下模仿性能: 依据数据模板生成模仿数据模仿 Ajax 申请,生成并返回模仿数据基于 HTML 模板生成模仿数据在Mac上关上命令行终端,输出装置命令: npm install mockjs,稍等几分钟装置实现。 简略示例展现:Mock list是自增数据 // 应用 Mockvar Mock = require('mockjs')var data = Mock.mock({ // 属性 list 的值是一个数组,其中含有 1 到 10 个元素 'list|1-10': [{ // 属性 id 是一个自增数,起始值为 1,每次增 1 'id|+1': 1 }]})// 输入后果console.log(JSON.stringify(data, null, 4))Mock 按规定生成字符串 ...

May 22, 2023 · 1 min · jiezi

关于mock:API-Mock-完整工作流程

Mock API 是一种用模仿数据代替实在 API 接口返回的的技术。在开发过程中,前端开发往往依赖后端 API,但后端 API 还在开发中。通过 Mock API,前端无需期待后端 API 开发实现。前端能够用 Mock API 返回的模仿数据来开发。 只需 3 步就能搞定 Mock API。 第 1 步 新建我的项目在 Apifox 的 App 首页,点击右侧的 “新建我的项目” 按钮来创立我的项目。 第 2 步 新建接口这边以创立用户详情接口为例来展现创立接口的性能。 申请办法: GET。URL: api/user/{id}。其中 {id} 是参数: 示意用户 id。响应类型: json,响应内容:进入上一步新建我的项目的首页,点击左侧的 “+” 按钮来新建接口。 填写对应的接口信息并保留: 这样,用户详情接口就创立好了。同时,Apifox 依据响应的字段格局和类型,给咱们主动创立好了 Mock。点击 Mock 下的 “快捷申请” 按钮可查看 Mock 的返回: 咱们来看一下 Mock 的返回。点击“快捷申请” 按钮,在进入的页面点击“发送”。 Mock 的返回还挺像样子的~ 第 3 步 设置 Mock 匹配规定大家有没有留神到一个神奇的点,咱们给 name 字段设置了 string 类型,为什么会返回中文人名;给 phone 设置了 string 类型,为什么会返回手机号;给 avatar 设置了 string 类型,为什么会返回图片地址? ...

May 16, 2023 · 1 min · jiezi

关于mock:搞懂-API-Mock-常见问题及解决办法

API Mock是一个构建Web服务质量保障环节的十分实用的工具。它能够让开发者在独立工作或集成测试时,疾速开始调试和验证他们的代码。然而,在实践中,API Mock也可能会呈现一些问题。 本文将探讨API Mock中的一些常见问题,并提供一些解决办法。 动态响应无奈满足需要在某些状况下,开发人员应用动态Mock数据来模仿API的响应后果。这种形式尽管在测试场景很不便,然而很难模仿简单的场景和实在的申请后果。 解决办法:在创立Mock时,应该尽可能地思考到现实情况和业务逻辑。在设计响应和状态码时不应过于简略,而应为每个API端点结构更多的响应数据、状态码等变量。 线上接口与Mock数据不统一Mock数据个别为固定数据,线上接口可能依据各种条件动静生成所需数据,如果Mock数据恰好与线上接口返回的后果不统一,则会影响程序的正确性。 解决办法:为了防止这种状况产生,开发人员必须要确保Mock数据与线上接口的响应高度一致。在设计 Mock 数据时,应该思考到接口中各种变量、参数和数据类型的个性。 Mock响应工夫不精确在API服务的失常工作流程中,响应工夫对于申请方至关重要。如果应用Mock数据的响应工夫与线上接口的响应工夫不尽相同,则会导致某些测试用例无奈进行正确的工夫基准测试。 解决办法:测试人员应该在Mock数据设计方案中充分考虑响应工夫。在测试环境中,可能须要应用Mock数据进行集成测试,并依据须要调整Mock提早以尽可能反映真实情况。 数据同步问题如果Mock API性能比理论的API更强壮或简单,则可能会导致实现API同步变得十分艰难。例如,Mock数据可能会蕴含不成熟的性能或缩放性问题,这些问题可能在实现阶段被疏忽而最终影响线上API的运作。 解决办法:为防止这种状况,开发人员应确保Mock数据和理论API具备高度一致性。当您更新理论API时,请记得及时同步并更新Mock数据以反映这些变动。此外,Mock数据的测试应在模仿和线上环境中进行以保障其有效性。 总而言之,API Mock是一个便捷且实用的工具,但也须要咱们特地留神在应用和设计Mock过程中遇到的各种问题。通过建设优良的Mock设计准则、充分考虑各种边缘状况,以及与理论API同步更新Mock数据,能够确保API Mock的准确性和可靠性,并最终进步团队整体效率。 给大家举荐一个开源的 API 管理工具-Postcat,除了 mock 相干的外围性能,还有其余的更多的宝藏插件,比方 Chatgpt、 Apispace、Swagger同步URL 等插件。 如果你感觉这个开源我的项目还能够的话,无妨点个 star 反对下他们,如果你感觉还须要持续优化,无妨去提个Issue. Github:https://github.com/Postcatlab/postcat Gitee:https://gitee.com/eolink_admin/postcat

April 17, 2023 · 1 min · jiezi

关于mock:Mock-语法讲解

Mock 是生成随机数据,拦挡 Ajax 申请的 JavaScript 库。 本文来介绍下 Mock 的罕用语法。 模仿数据生成随机数据Mock.Random.boolean()生成一个随机的布尔值。例如: 返回值为 true 或 false。 Mock.Random.integer(min, max)生成一个随机的整数,能够指定范畴。例如: 返回值为 0 到 10 之间的整数。 Mock.Random.float(min, max, dmin, dmax)生成一个随机的浮点数,能够指定范畴和精度。例如: 返回值为 0.00 到 100.00000 之间的浮点数,精度为 2 到 5 位小数。 Mock.Random.string(length)生成一个随机的字符串,能够指定长度。例如: 返回值为长度为 10 的随机字符串。 Mock.Random.date()生成一个随机的日期。例如: 返回值为随机日期的字符串示意,例如 "1977-07-03"。 Mock.Random.time()生成一个随机的工夫。例如: 返回值为随机工夫的字符串示意,例如 "05:38:02"。 Mock.Random.datetime()生成一个随机的日期工夫。例如: 返回值为随机日期工夫的字符串示意,例如 "2007-06-29T22:03:06.140Z"。 Mock.Random.image(size, background, foreground, format, text)生成一个随机的图片,能够指定大小、背景色、前景色、格局和文字。例如: 返回值为图片的 Base64 编码字符串。 生成数据模板指定的数据Mock.mock(template) 依据数据模板生成模仿数据。数据模版能够生成简单的数据结构。 数据模版的语法如下: 属性名和属性值之间用 : 分隔。属性与属性之间用 , 分隔。属性值是字符串类型,能够应用 @ 来示意占位符。属性值是对象类型,能够应用 name|rule 来示意生成规定。示例: const Mock = require('mockjs')const data = Mock.mock({ 'list|1-10': [{ 'id|+1': 1, // 从 1 开始,每次加 1 'name': '@cname', // 随机中文名字 'age|18-60': 1, // 18 到 60 岁之间的整数 'gender|1': ['男', '女'], // 男或女 'email': '@email' // 随机电子邮件地址 }]})console.log(data)输入: ...

April 14, 2023 · 1 min · jiezi

关于mock:再见-Postman-我用这个开始-Mock测试

在测试的时候常常会碰到后端开发工程师的接口还没有开发实现,然而前端页面曾经开发好了。没有接口怎么对接呢? 前端人员能够通过 mock server 本人去造一个接口来拜访。mock server 可用于模仿实在的接口。收到申请时,它会依据配置返回对应的申请。 在前后端拆散的大背景下,mock server 在前端开发利用十分宽泛,mock.js 这样的库没有方法间接应用,前端开发不想把文档的返回值再写一遍,那怎么办呢? 实际上 Postcat 的 mock 性能简略好用,而且还是收费的,开源的。明天咱们介绍下应用 Postcat 来进行 mock 服务。 创立 Mock进入API文档详情页面,点击 Mock 标签,点击新建 Mock,在弹窗中输出 Mock 的名称以及响应内容: 调用 Mock进入 Mock 列表页面,点击调用地址即可复制到剪贴板,在代码中间接对该 API 地址发动申请即可失去响应后果。 这个开源的 API 工具叫 Postcat ,除了根本的文档和测试性能,还有插件广场和 MOCK 这些外围性能,集体应用后感觉还不错。还在为 API 工具发愁的思友们,无妨试试这个。 在线 Demo 链接: https://postcat.com/zh/?utm_s... 如果你感觉这个开源我的项目还能够的话,无妨点个 star 反对下他们,如果你感觉还须要持续优化,无妨去提个Issue. Github: https://github.com/Postcatlab... Gitee: https://gitee.com/eolink_admi...

February 23, 2023 · 1 min · jiezi

关于mock:开源-API-工具的-Mock-功能真的好用么

很多时候,接口尚未开发实现,在零碎交互单方定义好接口之后,咱们能够提前进行开发和测试,并不依赖上游零碎的开发实现。 通过应用Mock模仿数据接口,咱们即可在只开发了UI的状况下,毋庸服务端的开发就能够进行产品的演示。 明天给大家带来一款全新的 API 工具,同样领有 MOCK 性能 创立 Mock进入API文档详情页面,点击 Mock 标签,点击新建 Mock: 在弹窗中输出 Mock 的名称以及响应内容: 调用 Mock进入 Mock 列表页面,点击调用地址即可复制到剪贴板,在代码中间接对该 API 地址发动申请即可失去响应后果。 这个开源的 API 工具叫 Eoapi,除了根本的文档和测试性能,还有插件广场和 MOCK 这些外围性能,集体应用后感觉还不错。 还在为 API 工具发愁的盆友们,无妨试试这个。 Eoapi 蕴含 API 文档、 API 治理 、API 测试等等性能,Eoapi 是一款类 Postman 的开源 API 工具,它更轻量,同时可拓展。目前的 v 1.9.0 版本,除了新增 API 分享、团队合作性能。他们还反对:弱小的文档功能丰富的插件市场,可拓展前后置脚本反对查看所有测试历史反对 Websocket 协定,后续也会新增反对更多的支流协定。 在线 Demo:https://www.eoapi.io/?utm_sou... 如果你感觉这个开源我的项目还能够的话,无妨点个 star 反对下他们,如果你感觉还须要持续优化,无妨去提个Issue. Github:https://github.com/eolinker/e... Gitee:https://gitee.com/eolink_admi...

November 4, 2022 · 1 min · jiezi

关于mock:mockjs随机数生成

"data|2": [{ "id|+1": 1, // 属性值主动加1,初始值为 number "likeNumber|0-100": 10, //生成一个大于等于0、小于等于100的整数,10只是用来确定类型 "name|min-max.dmin-dmax": number, // 浮点数,限度形式与上一个整数雷同 "like": "@boolean(1)", // 生成布尔值 "displaySign|1": ["oneLeft", "oneRight"], // 从数组中随机取一个值 "likeNum": "@integer(1,9999)", // 随机1-9999间的数字 "content": "@csentence(5,50)", // 随机生成5-50个字符,完结带句号 "name": "@cword(2,5)", // 随机生成2-5个字符,没有标点 "releaseTime": "@date(yyyy-MM-dd)",// 按格局生成随机日期 "creatTime": "@date(yyyy-MM-dd hh:mm:ss)",// 按格局生成随机日期工夫 "name|min-max": "string", //通过反复 string 生成一个字符串,反复次数大于等于 min,小于等于 max "name|count": "string", //通过反复 string 生成一个字符串,反复次数等于 count }]

September 30, 2022 · 1 min · jiezi

关于mock:使用Mockoon进行接口Mock

内部接口之苦日常开发中,常常须要调用第三方接口,或者是工友们正在开发的接口。这些接口经常因为不稳固或者有bug妨碍开发联调,此时须要mock接口进步开发速度。 罕用mock工具大抵有这些,仅供参考。 mock工具运行是否反对proxymocojar,命令行不反对mockoonexe 桌面利用 + nodejs cli 命令行反对mock-server看起来比拟麻烦还没钻研反对咱们有个 biz-api 服务,常常要往里面加接口。测试的时候又只测局部,因而须要有转发性能,所以选了 mockoon。感觉用起来还比拟棘手,上面简略阐明一下。 Mockoon 应用阐明首先,创立 route,就是你要 mock 的接口。 而后,开启proxy。意思是,如果方才创立的route没有的话,就会走proxy转发。 配置实现后,启动server mockoon-cli除了桌面利用,还有命令行工具,不便在服务器上部署或容器化部署。 npm install -g @mockoon/cli接口配置文件,应用上述桌面工具导出即可(mock.json)。上面列举了一些常用命令。 # 启动mock-server,默认daemonmockoon-cli start --data mock.json# daemon-off,适宜用作容器启动命令mockoon-cli start -D --data mock.json # 查看正在mock的服务mockoon list # 进行mockoon-cli stop {id}

May 16, 2022 · 1 min · jiezi

关于mock:推荐一个在线接口Mock工具-useMock

示例代码://一键解耦:const apiHost = true ? "https://project.usemock.com" : "https://project.domain.com";//前期应用齐全不变:fetch( apiHost + "/v1/todos" ).then((res) => console.log(res) )开发流程中作用应用useMock代入流程后,能够疾速制订并实现前后端单方接口要求,并行开发提高效率 单方均可对接口数据格式进行协商定义,接口变更时:任意一方操作即可;而不须要等实在业务逻辑实现后再调试 开源我的项目或教学也可利用useMock,使用者岂但能够看文档,还能够进行测试mock公开接口数据 自动化工作日志除了自动记录日志,也主动生成接口文档,查看文档成果:https://www.usemock.com/docs/... 点评:useMock上手非常简略易用,而且带统计接口性能,不便发现热点接口优化,能够团队合作和主动生成文档也是相当给力的。还会自动记录操作日志,这是很多同类mock平台不具备的性能。

February 15, 2022 · 1 min · jiezi

关于mock:react使用在线mock服务模拟真实请求示例不用安装mockjs库

通常咱们mock数据都会装置mockjs:yarn add mockjs然而须要配置很多货色,还要拦挡申请等等,对老手不敌对,即便是新手也感觉麻烦。 举荐大家应用useMock 在线Mock助手,我的项目API数据模仿,宣称比外部环境更贴心 反对团队合作灵便解耦不局域可重复调试主动生成文档React申请示例:在线Demo: https://www.usemock.com/demo/... <div id="app"></div><script type="text/babel"> const axiosDemo = React.createElement(() => { const { useState } = window.React; const [apiUrl, setApiUrl] = useState("https://2weima.usemock.com/api/qrdecode"); //input const [info, setInfo] = useState(null); // 申请后果 const onReqApi = ()=> { // 应用axios发申请 axios.post(apiUrl,{ // 模仿申请信息 qr_image:"https://img.2weima.com/qr_template/2021/6/26/8857784941a0f2d2a024044f414c69f9.jpg" }) .then(response =>{ // 响应信息 setInfo(response.data) console.log('因为跨域申请,在Network中多一个 Request Method: OPTIONS 申请是失常的。') console.log('response data:',response.data) }) } return <div> <div class="ui-input">接口URL:<input placeholder="useMock接口链接" value={apiUrl} onChange={(event)=>{ setApiUrl(event.target.value)}} /></div> <p> <button class="ui-button" data-type="primary" onClick={()=>{ onReqApi() }}>发送申请</button> </p> {info && ( <div> <h4>申请后果:</h4> <p>{JSON.stringify(info)}</p> </div> )} </div> }); ReactDOM.render( <div>{axiosDemo}</div>, document.getElementById('app') );</script>

February 15, 2022 · 1 min · jiezi

关于mock:vue使用在线mock平台用axios请求示例-不用自己安装mockjs

通常咱们mock数据都会装置mockjs:yarn add mockjs然而须要配置很多货色,还要拦挡申请等等,对老手不敌对,即便是新手也感觉麻烦。 举荐大家应用useMock 在线Mock助手,我的项目API数据模仿,宣称比外部环境更贴心 反对团队合作灵便解耦不局域可重复调试主动生成文档Vue申请示例: 你须要先在useMock平台增加你本人的我的项目和接口,而后就会失去接口文档,复制API链接申请就能够获取到在线mock设置的数据了。 以二维码解码接口mock为例: 在线示例Vue:https://www.usemock.com/demo/... 示例图: <script>//vue 示例代码 const App = { data() { return { apiUrl:"https://2weima.usemock.com/api/qrdecode", info:null } }, methods: { onReqApi(){ // 应用axios发申请 axios.post(this.apiUrl,{ qr_image:"https://img.2weima.com/qr_template/2021/6/26/8857784941a0f2d2a024044f414c69f9.jpg" }) .then(response =>{ this.info = response.data console.log('因为跨域申请,在Network中多一个 Request Method: OPTIONS 申请是失常的。') console.log('response data:',this.info) }) } } } Vue.createApp(App).mount('#app')</script>

February 15, 2022 · 1 min · jiezi

关于mock:强大的mock工具YApi功能介绍

YApi是一个开源的在线mock服务YApi 次要性能介绍【数据管理-数据导入】 反对导入的起源:swagger(swagger还反对url的模式), postman,chrome HAR, YApi json反对导入的形式:web界面导入,命令行导入反对的导入模式:齐全笼罩,智能合并,一般三种模式自动化导入:反对定义导入swagger的接口【数据管理-数据导出】 反对导出的格局:swagger json, YApi json,html, markdown, 不便和后端对接代码生成: yapi-to-typescript:依据 YApi 的接口定义生成 TypeScript 的申请函数yapi-gen-js-code: 依据 YApi 的接口定义生成 javascript 的申请函数【数据管理-数据编辑】 反对导入数据的在线编辑,新增的属性:delay提早【数据管理-数据Mock】数据返回权重从高到低 【高级Mock-冀望】返回指定的内容,body,http code,http header, delay; 可设置过滤条件,设置多条冀望【高级Mock-脚本】解析URL参数,动静返回不同数据【全局mock数据】整个我的项目顶层的返回信息设置【Mockjs】依据定义主动生成,同时也可指定key为指定值【Mock测试】 【单个测试】在线发送http申请测试,相似postman【自动化测试】【权限治理】 提供团队,集体分组【插件】 反对插件的二次开发罕用的一些插件举荐:钉钉机器人推送,自定义导入swagger插件,第三方登陆...【开源】 反对内网部署反对二次开发参考资料:官网:http://yapi.smart-xwork.cn/文档:https://hellosean1025.github....github地址:https://github.com/YMFE/yapi

September 20, 2021 · 1 min · jiezi

关于mock:绝佳的前端开发体验前后端联调数据mock方案

前后端交互的桥梁:RESTful API标准swagger性能: 【主动文档生成】定义 接口名称/门路/正文/分组标签/出入参字段/类型/是否必填, 可通过接口 swagger schema查看原始数据【在线测试】在线发送http申请进行测试swagger schema生成路径【swagger主动生成】依据swagger api-docs接口获取json数据【模板手动增加】本地生成swagger scheme模板,再手动编辑这块原始数据,最初和后端对这份数据即可。在线验证及可视化查看:https://editor.swagger.io/swagger schema 用处这些性能可通过自定义cli实现,更加高效【接口代码生成】api.ts, api.d.ts文件 (依据swagger schema生成),应用ts可实现接口数据校验【接口数据mock】yapi 生成mock数据(依据swagger schema生成)【导入postman】能够应用更多postman高级的性能:变量,测试自动化,导出,参数记忆等性能;相比swagger web更高效、易用;swagger cli性能开发> swagger api init // 生成swaggerSchema.json本地模板,不便编辑> swagger api api.d.ts [swagger url] //依据swagger url地址生成api.d.ts和api.ts文件 > jst api create -o src/services/api.d.ts swaggerTemplate.json -r @/utils/request // 依据swagger url地址生成api.d.ts和api.ts文件 (反对自定义存储门路和api.ts中 require库的引入)生成的swaggerSchema.json本地模板文件 { "swagger": "2.0", "info": { "description": "xxx接口治理", "version": "1.0", "title": "xxx服务端接口文档", "contact": {}, "license": { "name": "MIT", "url": "http://opensource.org/licenses/MIT" } }, "host": "petstore.swagger.io", "basePath": "/", "definitions": { "TmCallStartRequestDto": { "type": "object", "properties": { "callid": { "type": "string", "description": "形容信息" }, "listenerUid": { "type": "integer", "format": "int64", "description": "形容信息" } } }, "TmResponseDto": { "type": "object", "properties": { "code": { "type": "string" }, "data": { "type": "array", "description": "抄送列表", "items": { "type": "string" } }, "errMsg": { "type": "string" }, "msg": { "type": "string" } } } }, "tags": [ { "name": "tel-call-hook-api", "description": "通话" } ], "paths": { "/call/tm/directcall/callbackstart": { "post": { "tags": [ "tel-call-hook-api" ], "summary": "tmAxbSuccess", "description": "接口形容", "operationId": "tmAxbSuccessUsingPOST", "consumes": [ "application/json" ], "produces": [ "*/*" ], "parameters": [ { "in": "body", "name": "callStartRequestDto", "description": "callStartRequestDto", "required": true, "schema": { "$ref": "#/definitions/TmCallStartRequestDto" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/TmResponseDto" } }, "201": { "description": "Created" }, "401": { "description": "Unauthorized" }, "403": { "description": "Forbidden" }, "404": { "description": "Not Found" } } } } }}生成的api.ts文件 (可在cli命令中,增加参数,在代码头部增加request门路) ...

September 13, 2021 · 2 min · jiezi

关于mock:fastmock-新增功能从我的其他项目导入接口

很多用户反馈,有时候新建的我的项目,很多接口和之前的我的项目的接口是反复的或者url是雷同的,心愿反对从现有我的项目导入接口的性能,当初,这个性能曾经开发好并上线从其余我的项目导入接口 <!-- {docsify-ignore} -->1、在我的项目接口治理页面点击”从其余我的项目导入“ 2、在弹出层中切换到有接口的我的项目而后抉择要导入到以后我的项目的接口 3、点击右下角的”确认导入“按钮即可实现导入 留神只能从本人创立或者曾经退出的我的项目导入抉择的接口url和method在以后我的项目曾经存在,则不会导入这个接口导入的接口是独立存在的,批改和删除都不影响原接口

July 11, 2021 · 1 min · jiezi

关于mock:如何以-mock-server-的方式本地启动-SAP-UI5-应用使它不连接服务器端-OData-服务

咱们在做 SAP UI5 开发时,在视图逻辑没有开发结束时,往往不心愿连贯服务器端的 OData 服务进行联调,而仅仅连贯本地端的测试数据。 本文介绍如果启动本地 mock server,将 SAP UI5 我的项目工程里提前准备好的测试数据,渲染到 SAP UI5 利用的视图上。 本文介绍具体方法。 因为不须要间接连贯后盾 OData 服务,因而 manifest.json 的 dataSources 区域也就无需保护实在的服务器端 OData 服务的 url 了: sap.ui5 区域里,定义该利用的根视图 (rootView)为 SmartTable: SmartTable.view.xml 的源代码:<mvc:View xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc" controllerName="sap.ui.demo.smartControls.SmartTable" xmlns:smartTable="sap.ui.comp.smarttable"> <smartTable:SmartTable id="smartTable_ResponsiveTable" tableType="ResponsiveTable" editable="false" entitySet="Products" header="Products" showRowCount="true" useExportToExcel="false" enableAutoBinding="true"> </smartTable:SmartTable></mvc:View> controller 什么都不必实现: component.js 也不必实现: 次要的逻辑位于 sap.ui.core 的 Init hook 实现函数里。加载我的项目工程文件夹 test/service 上面的 server.js, 启动这个 mock server,而后将 sap.ui.demo.smartControls 这个 Component,搁置到ComponentContainer,即 Component 容器里渲染成最初的 HTML 源代码: 次要代码: sap.ui.getCore().attachInit(function() { sap.ui.require([ "sap/ui/demo/smartControls/test/service/server" ], function(server) { server.init(); new sap.ui.core.ComponentContainer({ name: "sap.ui.demo.smartControls", height: "100%" }).placeAt("content"); }); });Mock server 的外围逻辑在这个 server.js 里: ...

May 9, 2021 · 2 min · jiezi

关于mock:如何使用mock应对测试所需随机数据

摘要:在做接口测试的时候,有的接口须要进行大量的数据进行测试,还不能是反复的数据,这个时候就须要随机生产数据进行测试了。这里教诲大家应用mock.js生成各种随机数据。一、什么是mock.jsmock.js是用于生成随机数据,拦挡 Ajax 申请。 通过拦挡 Ajax 申请,依据数据模板生成并返回模仿数据,让前端攻城师独立于后端进行开发,帮忙编写单元测试。 1、减少单元测试的真实性。通过随机数据,模仿各种场景。 2、开发无侵入。不须要批改既有代码,就能够拦挡 Ajax 申请,返回模仿的响应数据。 用法简略合乎直觉的接口。 3、数据类型丰盛。反对生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、色彩等。 4、不便扩大。反对扩大更多数据类型,反对自定义函数和正则 5、总结。因为mock.js能够生产各种数据数据,所以也能够用在接口测试上,生成各种接口参数值。 二、如何在接口测试工具apipost中应用mock.js1、apipost内置了罕用的mock字段变量 须要应用变量的时候,间接把变量名称复制到参数值中就可应用了,如图: 2、在与执行脚本中编写自定义的mock.js变量 如: 1)生产一个随机手机号,相熟mock.js的能够本人编写一下,不会的能够间接百度,而后粘贴到与执行脚本中,在设置一个环境变量,变量值为数据生产的手机号: const phonePrefix = [‘132’, ‘135’, ‘189’] const index = Math.floor(Math.random() * phonePrefix.length) var phone = phonePrefix[index] + Mock.mock(/d{8}/)apt.variables.set(“phone”, phone); 援用设置的变量,如图; 2)生产一个随机工夫戳 var timestamp=Date.parse(new Date())apt.variables.set(“timestamp”, timestamp); 援用随机工夫戳 有趣味深刻mock.js能够去mock.js官网进行学习。 本文分享自华为云社区《接口测试-应用mock生产随机数据》,原文作者:奔四码农。点击关注,第一工夫理解华为云陈腐技术~

December 31, 2020 · 1 min · jiezi

关于mock:喜大皆奔在线Mock虚拟数据接口系统VirAPI开源版发布啦

VirAPI -- 非侵入式虚构数据在线申请响应生成接口,反对MockJs语法,申请即可得自定义规定的响应数据。本着让宽广开发者能分享VirAPI的成绩,也为了VirAPI能更好的服务大家,现做出重大决定——将VirAPI开源!!!。 此次开源,将公布在Githu以及Gitee两大开源仓库网站上。开源的内容次要包含: 创立及治理我的项目利用创立及治理虚构接口在线测试虚构接口查看虚构接口申请日志查看虚构接口申请相干数据统计登录及编辑个人资料当初您能够依据本人的须要拉取开源代码进行本地部署,若有相干开发能力还可在下面进行降级再革新。 本开源我的项目次要分前端代码仓库以及后端代码仓库;仓库保护上将以Github为主,这也就意味着在Github上更新的更及时。 Github上对应的仓库地址为: VirAPI开源版VirAPI开源版--前端代码仓库Gitee上对应的仓库地址为: VirAPI开源版1. VirAPI开源版 https://github.com/bluvenr/open_virapi1.1 环境依赖NodeJs(NPM)MongoDB本我的项目应用了eggjs作为后端逻辑我的项目框架。 1.2 运行&部署搭建好必要环境后,执行npm install装置我的项目所需依赖包。 本地测试运行,则请执行:npm dev 正式环境运行,请执行:npm start;此时若想敞开进行我的项目,则执行:npm stop。因为eggjs框架的机制,请每次批改后端代码后重启该我的项目npm restart。 默认服务端口为7001,本地可间接拜访http://127.0.0.1:7001/进入控制台治理页面。若是部署到线上,可配置nginx或apache进行重定向。 1.3 我的项目配置相干介绍我的项目配置文件放在config/config.default.js文件中,若是搁置服务器正式环境,则倡议复制该文件您须要自定义的配置在同目录下命名为config.local.js文件中,并设置您要的配置参数。 默认config.default.js文件内容为: /* eslint valid-jsdoc: "off" */'use strict';const fs = require('fs');const path = require('path');/** * @param {Egg.EggAppInfo} appInfo app info */module.exports = appInfo => { /** * built-in config * @type {Egg.EggAppConfig} **/ const config = { mongoose: { // url: 'mongodb://127.0.0.1:27017/open_virapi_db', options: { // useMongoClient: true, autoReconnect: true, reconnectTries: Number.MAX_VALUE, bufferMaxEntries: 0, }, }, bcrypt: { saltRounds: 10, }, security: { csrf: { enable: false, ignoreJSON: true, }, domainWhiteList: [ 'http://localhost:8080', ], }, validate: { convert: true, }, cors: { // origin: '*', allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS', }, jwt: { secret: 'virapi-202008192239', }, proxy: true, // 通过ips获取nginx代理层实在IP session: { key: 'Vir_SESSION', // 承载 Session 的 Cookie 键值对名字 maxAge: 2 * 3600 * 1000, // Session 的最大无效工夫 httpOnly: true, encrypt: true, renew: true, // 每次拜访页面都会给session会话延长时间 }, static: { prefix: '/', dir: path.join(appInfo.baseDir, 'app/public'), dynamic: true, preload: false, maxAge: 0, buffer: false, }, }; // use for cookie sign key, should change to your own and keep security config.keys = appInfo.name + '_hNW87vqPkMiMpLBHEtolB3Yg6vQsk5Ip4AJzCih2QCXbZBmjh5I033ELjdwB'; // add your middleware config here config.middleware = [ 'errorHandler', ]; config.siteFile = { '/favicon.ico': fs.readFileSync(appInfo.baseDir + '/app/public/favicon.ico'), }; // add your user config here const userConfig = { // myAppName: 'egg', imgUri: '/images', imgDir: appInfo.baseDir + '/app/public/images', }; return { ...config, ...userConfig, };};在您的自定义配置参数文件config.local.js中,咱们建议您配置以下必要参数: ...

August 22, 2020 · 2 min · jiezi

vue项目用到的mock数据接口的两种方式

1.使用devServer.before进行数据mock//通过配置devServer.before选项,设置url访问路径及response响应数据,进行mock数据。const { data } = require('./data.json')// 引入json数据对象//vue.config.js配置文件中进行Vue CLI的配置module.exports = { //... devServer: { before: function(app, server) { app.get('/api/data', function(req, res) { res.json({ data: data, errno: 0 }); }); } }};import axios from 'axios'const ERRNO = 0//通过函数柯力化,接收url作为参数,以返回新的函数接收额外的参数作为axios配置项function get (url) { return function (params) { return axios.get(url, { params }).then((res) => { const { errno, data } = res.data if (errno === ERRNO) { return data } }).catch((e) => { }) }}const getData = get('api/data')getSeller().then(res => { console.log(res)})2.使用Mock.js进行数据mock使用Mock.mock(),根据数据模板生成模拟数据。 ...

October 9, 2019 · 1 min · jiezi

前端自动化测试二

上一篇文章,我们已经讲述了Jest中的基本使用,这一篇我们来说说如何深度使用Jest 在测试中我们会遇到很多问题,像如何测试异步逻辑,如何mock接口数据等... 通过这一篇文章,可以让你在开发中对Jest的应用游刃有余,让我们逐一击破各个疑惑吧! 1.Jest进阶使用1.1 异步函数的测试提到异步无非就两种情况,一种是回调函数的方式,另一种就是现在流行的promise方式 export const getDataThroughCallback = fn => { setTimeout(() => { fn({ name: "webyouxuan" }); }, 1000);};export const getDataThroughPromise = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve({ name: "webyouxuan" }); }, 1000); });};我们来编写async.test.js方法 import {getDataThroughCallback,getDataThroughPromise} from './3.getData';// 默认测试用例不会等待测试完成,所以增加done参数,当完成时调用done函数it('测试传入回调函数 获取异步返回结果',(done)=>{ // 异步测试方法可以通过done getDataThroughCallback((data)=>{ expect(data).toEqual({ name:'webyouxuan' }); done(); })})// 返回一个promise 会等待这个promise执行完成it('测试promise 返回结果 1',()=>{ return getDataThroughPromise().then(data=>{ expect(data).toEqual({ name:'webyouxuan' }); })})// 直接使用async + await语法it('测试promise 返回结果 2',async ()=>{ let data = await getDataThroughPromise(); expect(data).toEqual({ name:'webyouxuan' });})// 使用自带匹配器it('测试promise 返回结果 3',async ()=>{ expect(getDataThroughPromise()).resolves.toMatchObject({ name:'webyouxuan' })})2.Jest中的mock2.1 模拟函数jest.fn()为什么要模拟函数呢?来看下面这种场景,你要如何测试 ...

September 10, 2019 · 3 min · jiezi

解决moco框架API在cycle方法缺失的问题

我在使用moco框架过程中,遇到一个问题,在官方文档中给出了cycle的方法,表示循环返回一个数组里面的response,但是在查看API的时候并没有发现这个cycle()方法,所以觉得自己写了一个responsehandle,并且重写了cycle()方法。 cycle方法主要用在请求次数相关的内容,比如订单提交、资源删除等场景。 package com.fun.moco.support;import com.github.dreamhead.moco.MocoConfig;import com.github.dreamhead.moco.ResponseHandler;import com.github.dreamhead.moco.handler.AbstractResponseHandler;import com.github.dreamhead.moco.internal.SessionContext;import com.google.common.base.Function;import com.google.common.collect.FluentIterable;import com.google.common.collect.ImmutableList;import com.google.common.collect.Iterables;import static com.google.common.base.Preconditions.checkArgument;import static com.google.common.collect.FluentIterable.from;import static com.google.common.collect.ImmutableList.copyOf;/** * 循环的responsehandle */@SuppressWarnings("all")public class CycleHandle extends AbstractResponseHandler { private final ImmutableList<ResponseHandler> handlers; private int index; private CycleHandle(final Iterable<ResponseHandler> handlers) { this.handlers = copyOf(handlers); } public static ResponseHandler newSeq(final Iterable<ResponseHandler> handlers) { checkArgument(Iterables.size(handlers) > 0, "Sequence contents should not be null"); return new CycleHandle(handlers); } @Override public void writeToResponse(final SessionContext context) { handlers.get((index++) % handlers.size()).writeToResponse(context); } @Override public ResponseHandler apply(final MocoConfig config) { if (config.isFor(MocoConfig.RESPONSE_ID)) { return super.apply(config); } FluentIterable<ResponseHandler> transformedResources = from(copyOf(handlers)).transform(applyConfig(config)); return new CycleHandle(transformedResources.toList()); } private Function<ResponseHandler, ResponseHandler> applyConfig(final MocoConfig config) { return new Function<ResponseHandler, ResponseHandler>() { @Override public ResponseHandler apply(final ResponseHandler input) { return input.apply(config); } }; }}使用方法如下(groovy,有兴趣可以转成java):/** * 循环返回 * @param content * @param contents * @return */ static ResponseHandler cycle(String content, String... contents) { CycleHandle.newSeq(FluentIterable.from(asIterable(content, contents)).transform(textToResource())) }/** * 循环返回 * @param handler * @param handlers * @return */ static ResponseHandler cycle(final ResponseHandler handler, final ResponseHandler... handlers) { CycleHandle.newSeq(asIterable(handler, handlers)) }groovy是一种基于JVM的动态语言,我觉得最大的优势有两点,第一:于java兼容性非常好,大部分时候吧groovy的文件后缀改成java直接可以用,反之亦然。java的绝大部分库,groovy都是可以直接拿来就用的。这还带来了另外一个有点,学习成本低,非常低,直接上手没问题,可以慢慢学习groovy不同于Java的语法;第二:编译器支持变得更好,现在用的intellij的ide,总体来说已经比较好的支持groovy语言了,写起代码来也是比较顺滑了,各种基于groovy的框架工具也比较溜,特别是Gradle构建工具,比Maven爽很多。----此段文字为了撑字数强加的,与内容无关。 ...

July 16, 2019 · 1 min · jiezi

解决moco框架API在post请求json参数情况下query失效的问题

在使用moco API做接口虚拟化的过程中遇到一个比较棘手的问题,就是根据官方文档提供的案例,并不能跑通post请求在处理json传参格式的虚拟化。经过查询源码,发现了一个问题:源码:···public class ParamRequestExtractor extends HttpRequestExtractor<String[]> { private final String param;public ParamRequestExtractor(final String param) { this.param = param;}@Overrideprotected Optional<String[]> doExtract(final HttpRequest request) { String[] reference = request.getQueries().get(this.param); return fromNullable(reference);}}··· 在获取请求的内容时,发现该方法不能获取到正确的请求参数,后来索性自己重写了一个Extractor类,内容如下: ···package com.fun.moco.support; import com.github.dreamhead.moco.HttpRequest;import com.github.dreamhead.moco.HttpRequestExtractor;import com.github.dreamhead.moco.RequestExtractor;import com.google.common.base.Optional;import net.sf.json.JSONObject; import static com.github.dreamhead.moco.util.Preconditions.checkNotNullOrEmpty;import static com.google.common.base.Optional.fromNullable; /** json数据格式参数值的获取*/@SuppressWarnings("all")public class JsonExtractor extends HttpRequestExtractor<String[]> { private final String param;public JsonExtractor(final String param) { this.param = param;}@Overrideprotected Optional<String[]> doExtract(HttpRequest request) { try { String s = request.getContent().toString(); String value = JSONObject.fromObject(s).getString(param); return fromNullable(new String[]{value}); } catch (Exception e) { return fromNullable(new String[]{""}); }}/** * 获取参数的value * * @param param * @return */public static RequestExtractor<String[]> queryJson(final String param) { return new JsonExtractor(checkNotNullOrEmpty(param, "参数不能为空!"));}}··· ...

July 16, 2019 · 1 min · jiezi

在mockjs官网上没学到的

mock会拦截下指定的请求,并返回由mock计算出的数据。 mock拦截下的请求不会在network里出现。 mock方便前端脱离后端进行开发。 先来一个dome说明怎么使用。mock怎么与项目结合使用。 mockjs demonpm i mockjs // 安装mockjs创建src/mock.js // 用来生成mock数据。在main.js引入src/mock.js require('./mock.js') // 全项目都可使用mock接口。编辑一个vue文件。first.vue // 用来使用mock.js的数据。创建api.js,建议放在'src/lib/api.js'。 // 用来封装axios。这样做对于项目规范。非要每个请求都实例出axios也行。在first.vue文件引入api.js。做了以上5步,就可以在first.vue文件时使用api.js调用mock了。 下面是具体代码。 // mock.js import Mock from 'mockjs' const Random = Mock.Random let name = [] // 模板 for (let i = 0; i < 3; i++) { // 在模板中生成多条数据 name.push({ name: Random.string(3, 8), age: Mock.mock({ 'number|1-100': 100 }) }) } let age = { ages: Mock.mock({ 'number|1-100': 100 }) } Mock.setup({ timeout: '200' // 2s-2s后返回数据 }) Mock.mock('/data/name', 'post', name) Mock.mock('/data/age', 'get', age) // main.js require('./mock.js') // first.vue <template> <div class="basic"> basic </div> </template> <script> export default { props: {}, data () { return { } }, computed: { }, components: { }, methods: {}, created () {}, mounted () {} } </script> <style lang="sass" scoped> .basic </style> // api.js import axios from 'axios' // 请求拦截 axios.interceptors.request.use(res => { return res }, error => { return Promise.reject(error) }) // 响应拦截 axios.interceptors.response.use(res => { console.log('res', res) return res }, error => { return Promise.reject(error) }) // 封装post const fetch = (url, params) => { return new Promise((resolve, reject) => { axios({url: url, params: params, method: 'post'}).then(res => { resolve(res.data) }).catch(err => { reject(err) }) }) } // 输出 export default { mockData (url, params) { return fetch(url, params) }, mockDataAge (url, params) { return new Promise((resolve, reject) => { axios({url: url, params: params, method: 'get'}).then(res => { resolve(res.data) }).catch(err => { reject(err) }) }) } } // first.vue // 引入 import api from '../../lib/api.js' // 使用 getData () { api.mockData('/data/name').then(res => { this.dataName = res }) }, getDataAge () { api.mockDataAge('/data/age').then(res => { this.dataAge = res }) }数据模板 数据占位符数据模板在官网都没有定义。我理解是数据模板就是Mock.mock()里使用的对象。 数据占位符是数据模板中用来生成指定类型数据的占位符。使用@占位符(params[,params])表示。 Mock.Random是一个工具类,用来生成各种随机数据。 数据模板中@占位符(params[,params]) 是占位符,用来生成相应数据。有人把占位符理解为mock内置模板。毕竟Mock.mock()使用它们作为参数。 ...

July 15, 2019 · 2 min · jiezi

VueCli30中集成MockApi

VueCli3.0中集成MockApi一:使用场景哎哟,好烦啊,这个需求还么结束就来下一个需求,程序员不要排期的吗? 没办法啊,资本主义的XX嘴脸啊 来吧,技术评审我俩把接口格式对一把,你先开发,我这边结束了我跟上,再联调 MMP,那又增加了我的工作量啊,每次我都要自己先把数据放在一个配置文件中,引入使用,然后对接的时候还得删除无用代码,好气 你自己Mock接口啊,就向我们后端经常用PostMan一样模拟请求啊 Mock??我去查查看 二:Mock的概念1:Mock的描述 Mock接口其实就是模拟真实接口提供一个在开发环境的假数据,甚至是真实数据,在开发时,经常出现接口内容不能够及时的跟进,导致开发过程中添加一些额外的工作量。接下来的例子全部围绕着Vue为主体介绍前后端提前确定好通信的JSON格式之后,我们在不依赖后端进度的同时,能提供一套好的开发体验。 2:Mock能解决的问题 减少额外工作,在没有Mock接口的时候我们模拟数据的方式很烦躁,比如list列表,需要在data中声明list,去调试内容,或者引入一个mock文件,这样做导致在联调调用接口的部分代码没有写,联调成功的时候要删除很多无用代码 ---> 通过Mock只需在联调的时候把Mock接口的地址换成真实地址即可 import { mockList2 } from 'mock/list.js';export default { data () { return { mockList: [ { "name": 'tx', "age": 12 } ], mockList2 } }}如果采用上述的方式去模拟数据,缺少真正缺口所具备的状态,比如删除接口,有成功和失败的区分,这个模拟就很恶心了 ----> 通过Mock,可以直接通过实在的query或者其他的操作来达到同样的目的3:Mock的几种方式以及对应的优缺点 Mock的方式优缺点本地Mock接口优点:可以更加细粒度的控制mock的内容。缺点:需要增加本地的代码量,以及需要配置webapckMock.js实现ajax拦截优点:数据通过mock.js会更丰富。缺点:增加一些本地配置,拦截ajax后端Controller的静态JSON优点:接口联调不需要修改任何东西。缺点:修改Mock内容沟通成本高,跟后端扯皮利用FastMock去模拟Mock优点:可控内容以及实现动态Restful api。缺点:如果项目包装axios等请求库之后需要针对接口转发做不同处理4:本地Mock接口 该篇文章针对本地Mock接口进行操作,其他的方式会简要介绍并给出对应的链接,如果有需要,自行去查阅。 三:本地Mock周边知识本地Mock的思想就是利用Node + express完成Restful Api。结合webpack配置项devServer同时利用Vue-cli3.0的暴露的配置利用本地express完成mock接口的添加 Node+Express的相关知识点,用node+express写过Restful Api的就应该知道接下来Mock怎么处理了,这里我先简要介绍一下我们需要用到的技术吧(Express的路由以及node的fs模块) Express路由相关,具体的见文档,这里不区分请求方法,直接app.use const express = require('express');const app = express();// 这样一个简单的路由就完成了,请求到/ajax-get-info的请求就能拿到对应的JSON数据app.use('/ajax-get-info', (req, res) => { res.send({ "success": true, "code": 0, "data": {} }) });针对不同的请求生成动态的内容,我们可以通过req.query和req.params等来生成动态内容,在express中,我们传入的body内容,在req.body中并获取不到,需要添加中间件body-parser,需要注意的是这个中间件不能在app全局路由使用,不然会影响到代码到测服的接口,利用http-proxy-middleware转发的接口,所以我们需要单独的设置一个Mock路由,针对路由级别的使用中间件,代码如下 ...

July 5, 2019 · 1 min · jiezi

前后端分离之更好的mock你的后端api

注意! 广告警告! 广告警告! 广告警告!在一个web应用的开发周期中, 一般前端与后端都是并行开发的, 各自完成自己的开发工作后进行联调, 联调通过再进行提测/发布. 开发过程中, 前端都会以后端提供的 api 文档作为标准, mock 模拟 api 返回数据, 以确保在开发中就保证功能的完整性. 而关于如何更好的进行 mock, 业界/开源社区可谓有相当多质量上乘的解决方案, 如easy-mock, yapi等. 但是越是大而全的工具很多时候功能会超越需求非常多, 要简单实现 mock api 的需求其实也有非常多小而美工具库可以使用. 而本文主要介绍 mock-server 这个工具的使用 选用 mock-server 的主要原因除了是我开发的使用比较简单之外, 更多的是满足了下文提到的一些开发需求, 如果你也有同样的需求而还没找到解决方案的话, 不妨试用一下. 安装 & 基本配置可选全局安装, 安装完成过后, 就可以通过mock命令启动来 mock server npm install -g mock-server-localmock -h # 即安装成功# 用 -d 指定mock数据配置目录, 为空时默认为当前目录 `.`mock -d ./mock# 用 -p 指定server的端口, 默认为8888, 如果8888被占用会端口号+1, 直至端口可用# 注意如果指定了端口号, 但是端口号被占用的话, 会抛出错误mock -d ./mock -p 8080个人比较习惯在项目中进行安装, 并通过npm script启动, 而 mock 数据也存放在项目当中, 通过 git 等版本管理工具在项目成员当中共享, 假设项目目录为proj ...

May 18, 2019 · 4 min · jiezi

第三讲使用JUnit对Spring-Boot中的Rest-Controller进行单元测试

(第三讲)使用JUnit对Spring Boot中的Rest Controller进行单元测试本次教程主要讲解如何对Spring Boot中的Rest Service进行单元测试。以往我们主要是使用JUnit对业务层进行单元测试,本次课程将使用一个简单的案例来说明如何使用JUnit对Spring Boot的Rest Service进行单元测试。1. 主要类容快速搭建Restfull Service 环境创建GET请求以检索用户信息创建GET请求检索用户角色信息创建POST请求新增用户角色信息如何使用PostMan请求Restfull Service使用JUnit对GET请求进行单元测试使用JUnit对POST请求进行单元测试2. 你将需要准备的工具JDK 1.8及以上版本Maven 3.0及以上版本的项目构建工具IDEA代码编辑器3. 你可以通过以下的地址获取本次课程的所有示例代码项目代码已经上传到GitHub仓库中,你可以通过以下的地址获取示例源码:https://github.com/ramostear/Spring_Boot_2.X_Tutorial/tree/master/spring-boot-junit-rest-service 4. 项目结构下面通过一张截图来了解以下本次课程中我们使用到的项目结构。 首先我们需要位单元测试提供一个可用的Rest Controller。UserController文件为我们提供了一个可用于测试的Rest Controller。在UserController类中,我们提供两种请求类型的方法,一种是GET请求,另一种是POST请求。然后我们为这两种请求方式的方法编写单元测试用例。 在接下来的测试过程中,我们将使用Mockito来模拟请求UserService的过程,使用MockMvc来模拟请求UserController。单元测试的目的是将测试范围尽可能的缩小。在本次案例中,我们仅对UserController中的方法进行测试。 5. 初始化项目我们依然使用Spring Initializr来初始化本次课程的项目,你需要配置如下图中的参数: 现在我们需要提供两个实体类:User和Role: User.java Role.java 6. 提供可用的业务服务所有的应用都需要有数据的存储,本次课程主要的重点是为了Rest Controller的单元测试,因此使用ArrayList来充当数据库的角色。在案例中,一个用户可以有多个角色,一个角色也可以被赋予给多个用户。用户有ID,名字,别名和角色列表,角色具有ID,名称和描述。在UserService类中,将提供如图所示的公共方法。 7. 提供GET请求方法在UserController类中,我们将提供如下几个公开的GET请求方法: @GetMapping(value="/users") : 获取所有的用户信息@GetMapping(value="/users/{id}/roles") : 根据用户ID获取该用户的所有角色信息UserController.java类中的详细代码如下: package com.ramostear.spring.boot.test.restservice.controller;import com.ramostear.spring.boot.test.restservice.model.Role;import com.ramostear.spring.boot.test.restservice.model.User;import com.ramostear.spring.boot.test.restservice.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;import java.util.List;@RestControllerpublic class UserController { private final UserService userService; @Autowired public UserController(UserService userService){ this.userService = userService; } @GetMapping(value = "/users") public List<User> findAllStudents(){ return userService.findAllUsers(); } @GetMapping(value = "/users/{id}/roles") public List<Role> findUserRoles(@PathVariable(value = "id")String id){ return userService.findUserAllRoles(id); }}8. 使用Postman对RestController进行测试我们将使用Postman工具对上述两个Rest API进行请求,首先向Postman地址栏输入http://localhost:8080/users 进行测试,获得的响应信息如下: ...

May 10, 2019 · 2 min · jiezi

为什么要抛弃Pact?如何快速实现契约测试(CDC)

前言在前几天的博客中,我转载了一篇文章,其中介绍了契约测试和pact是怎么实施的,的确很有帮助。但我经过研究,其实是pact本身也是有缺陷的,结合我近期在使用的服务型工具和我的实际情况,觉得实现契约测试其实有更有效率的解决方案,本文就通过我的视角看看我是如何快速实现契约测试的。契约测试为前后端对接的过程中会出现信息不对称,以及工作进度不一致的情况,因此希望通过事先约定好API返回数据的文档,根据文档来开发后端代码,以及生产可以被前端调用的虚拟的API,帮助前后端能够同时开展工作并且保持前后端代码的正确性,加快后期的系统集成测试甚至是取消系统集成测试。我们将以上的做法称之为契约测试。契约测试最开始的概念由 Martin Fowler 提出,它又被称之为:消费者驱动的契约测试(Consumer Driven Contracts),简称CDC。这里的契约是指软件系统中各个服务间交互的数据标准格式,更多的指消费端(client)和提供端(server)之间交互的API的格式。契约测试带来的变化主要是:1.将前后端测试解耦,前后端可以分别在对方还没有完成工作的时候就开展测试;2.将测试过程前移,加速或者取代集成测试;3.保证数据的一致性,让后端服务返回的数据就是前端想要得到的。我做了一张图方便大家理解CDC的概念:上图经历了三个步骤:1.消费者(广义的前端)根据业务需要编写好契约文件,契约文件里面编写了需要返回的数据;2.消费者(广义的前端)向契约文件(实际上是一个API服务)发起请求,得到预期的结果,验证前端业务逻辑是否正确;3.契约文件(实际上是一个API服务)向提供者(广义的后端)发起请求,得到后端真实的返回结果并且与契约文件中的数据规则进行校验,判断后端返回的数据是否满足契约的要求。如果无法通过校验,说明提供者的服务发生了改变,或者是没有按照契约所规定的来进行开发。如果通过了上面的三步,我们可以认为前后端对于契约的理解和实现是一致的,等到真正集成之后也不会出现问题。Pact 契约测试框架之前业内较为常见的做法是通过Pact(一个契约测试框架)进行契约测试:通过前端开发人员编写代码进行测试并生成Pact契约文件,后端通过Pact Brocker等服务管理契约以及调用等。但是Pact也存在一些缺点:1.需要引入Pact的相关文件以及正确搭建服务,用起来需要一定的时间成本2.生成的返回数据不够灵活,无法编写代码生成复杂的随机数据;3.无法判断请求参数来返回不同的结果;4.需要开发人员额外编写代码,增加了工作量;5.存在代码入侵的情况,并且目前支持的语言较少;6.模糊了开发与测试人员之间的界限,管理不当容易导致重复劳动;由于有以上的不足之处,Pact 在实际应用的效果往往并不理解。因此我们提出了通过 Mock API 以及测试用例实现更快速、更有效地契约测试。通过 EOLINKER API Studio 实现契约测试EOLINKER API Studio(https://www.eolinker.com) 提供了UI实现的 Mock API,配合API Studio 的测试用例与自动化测试,可以帮助研发团队更快速、更有效地实现契约测试。什么是Mock API?通过 Mock API,您可以事先编写好 API 的数据生成规则,由 API Studio 动态生成 API 的返回数据。开发人员通过访问 Mock API 的 URL 来获得所需要的数据,完成对接工作。在 API Studio中,同一个项目中的 Mock API 的地址前缀是相同的(如mock.eolinker.com/uasyd1/…),因此可以在代码中将 Mock API 的地址前缀作为全局变量,项目上线时仅需替换变量的值即可改变整个项目的 API 请求地址前缀。创建Mock API,实现前端的契约测试在EOLINKER API Studio中,创建 Mock API 之前需要先创建API文档(或者导入Postman、Swagger等数据),API文档可以作为前后端对接的依据。这里我创建了一个简单的用户登录API文档:创建好API文档之后,点击 Mock API 标签进入Mock API的管理页面,在这里可以快速创建多个Mock API,并且根据不同的请求参数返回相应的数据:创建一个 Mock API 期望,我们希望当传递user_name=和user_psw=112233时,Mock Server返回登录成功的数据,这里返回的数据类型选择Json,填写好Json的格式以及内容即可:点击预览按钮可以看到是我们希望得到的返回数据,然后确定保存即可:通过这种方式可以创建多个Mock API,并且通过请求红框处的 Mock API URL 得到返回结果:API Studio 中也提供了强大的 API 测试的功能,我们直接在平台上对刚才的登录成功的 Mock API 发起请求,可以看到当我们传递正确的参数时,可以得到预期的返回结果,至此契约测试的前端契约就已经完成了:创建测试用例,实现后端的契约测试:传统的契约测试其实并不能够保证测试的覆盖率,因为前端开发人员提供的契约文件很可能无法覆盖所有的请求情况,导致出现漏测的情况。因此 API Studio 建议将后端的契约测试交给测试人员负责,这样可以提供更完善的测试用例,并且可以结合各类CI工具实现自动化测试。由于 API Studio 基于 API 文档来实现契约测试、API用例测试、API自动化测试等功能,因此可以将前端、后端、测试人员解耦,工作的流程可以进一步改进为下图所示,前后端、测试人员可以同时开展工作,并且测试用例可以导入到自动化测试中成为长期的定时测试任务。由于测试用例与自动化测试所包含的内容较多,如有需要可以前往 EOLINKER API Studio 官方网站(https://www.eolinker.com)或者是查阅 API Studio 帮助文档,在此不再赘述。 ...

April 4, 2019 · 1 min · jiezi

关于Charles mock前端数据404问题

问题描述最近学习react,使用Charles mock数据。结果API 404。配置过程 (问题复现)react部分react项目运行在本地 3000端口,本地访问localhost:3000, 下图是在react组件中 生命周期里API的调用API请求地址 http://localhost.:3000/api/todolistCharles部分在桌面创建了一个名为todolist的JSON文件在Charles里Tools下 使用map local来模拟http请求返回具体配置:Map From,包含协议、端口号、地址等;Map To里 Local path就是本地文件的路径,在这里指向了本地的todolist.json结果项目里调用,Charles代理,应该是可以了的,但是 API调用结果404…思路在本地疯狂刷新页面,发现Charles 只抓取了线上的包,并没有抓取到我本地localhost的有个神仙(某种场外救援)说可能是Charles升级导致的 本地可以尝试访问http://localhost.charlesproxy…:3000尝试访问了下 发现react项目真的也运行在这个神奇的域名下,Charles也可以抓到这个域名下的包解决方法map local也配置在这个神奇的域名下就可以了现在返回正常了

April 4, 2019 · 1 min · jiezi

一个简单mock-server 解决方案

json-server-routerjson-server-router 的作用是提供一个简明的方式构建出拥有任意的路由的 mock serverjson-server-router 要解决的问题在使用 json-server 时你写了如下文件(db.json) 也就代表你得到了四个 mock 接口/update ,/retrieve, /create ,/delete但是实际的需求中接口路由肯定不能这么简单你需要的可能是 /aaa/bbb/ccc/update这样的形式,虽然json-server可以配置rewrite可以解决部分问题,但是这并不简单,接下来我们来看一下json-server-router的方式// db.json{ “update”: { “code”: 200, “message”: “succeed”, “data”: true }, “retrieve”: { “code”: 200, “message”: “succeed”, “data”: true }, “create”: { “code”: 200, “message”: “succeed”, “data”: true }, “delete”: { “code”: 200, “message”: “succeed”, “data”: true }}json-server-router 使用方式json-server-router 的实现理念是根据目录结构,构建出想要的接口形式假设我们的目标接口为 /aaa/bbb/ccc/update那么我们只需构件出如下的目录结构当遇到名称为 index 的文件路径拼接的时候会忽略index,当遇见键值为 index路径拼接同样也会忽略index- aaa - bbb + ccc.json // 在ccc.json中添加 updateor - aaa - bbb - ccc +index.json // 在index.json中添加update路由生成示意大概下面这个样子,mock为 mock 文件的根目录mock/books/index.json-mock + index.json ——> /xxx + book.json ——> /book/xxx - foo + index.json ——> /foo/xxx + bar.json ——> /foo/bar/xxx假设/books/index.json内容如下将对应生成四个接口 /books/ /books/retrieve /books/create /books/delete{ “index”: { “code”: 200, “message”: “succeed”, “data”: true }, // /books/ “retrieve”: { “code”: 200, “message”: “succeed”, “data”: true },// /books/retrieve “create”: { “code”: 200, “message”: “succeed”, “data”: true },// /books/create “delete”: { “code”: 200, “message”: “succeed”, “data”: true }// /books/delete}安装&使用当前全局安装之后你会得到一个叫jsr的全局命令,根据前面的介绍这时候其实你只需构件出一个包含mock files 的根目录就足够了$ npm install json-server-router -g$ jsr –root mock命令参数jsr [options]Options Required: –root, -r Paths to mock files parent dir [string] [required]Options: –config Path to JSON config file [string] [default:jsr.config.js] –port, -p Set port [number] [default: 3000] –host [string] [default: “local ip”] –static Set static files directory(same as json-server) [string] [default: “public”] –watch, -w Watch file(s) [boolean] [default: false] –open, -o open [boolean] [default: false] –middlewares, -m Paths to middleware files TODO [array] –help, -h Show help [boolean] –version, -v Show version number [boolean]Examples: jsr –root mock jsr –root mock –port 3000参数说明config 设置配置文件默认配置文件的地址是当前目录的下的jsr.config.jsstatic 静态资源的地址跟json-server是一致的,需要注意的是如果 static路径存在的话json-server-router会自动创建一个包含所有路由的index.html,如果static目录不存在,不会自动创建目录生成index.htmlwatch 监控文件变化自动重新加载jsr.config.js simplemodule.exports = { root: ‘mock’, port: 3000,}GETjson-server-router其底层依赖json-server所构建,所以在不出意外的情况下同时也拥有json-server的所有GET请求相关功能当使用json-server 我们可以通过构建路由/get/users?_page=7&_limit=10进行分页查询但是query的关键词必须是指定的在json-server-router中可以再jsr.config.js中自定义queryMap字段来修改关键词的名字,配置好了之后就可以通过/get/users?page=7&len=10进行分页查询//jsr.config.js{ queryMap: [[’_page’, ‘page’], [’_limit’, ’len’]]}POST PUT DELETE关于非GET请求你不需要定义mock files,json-server-router对所有非GET请求进行统一处理不管其路由是什么一致通过handler函数处理你可以通过重写jsr.config.js中的handler 函数自定义其处理结果//jsr.config.js { /** * 处理所有非GET请求 * 当query fial 有值的时候认为请求设置为失败状态 / handler (req, res, next) { const { ip, originalUrl, body } = req const isFail = !!req.query.fail res.json({ code: isFail ? 500 : 200, message: isFail ? ‘failed’ : ‘succeed’, cookie: req.get(‘cookie’), ip, url: originalUrl, body: body }) } }tips当jsr运行起来之后在命令窗口键入rs会重新加载当static路径存在的时候,路由/jsr 会返回所有路由信息,当static路径不存在的时候路由/会返回所有路由信息战斗人员可以作为json-server中间件引用可以参考cli/server.jsconst jsonServer = require(“json-server”)const server = jsonServer.create()const middlewares = jsonServer.defaults() // { static: ‘public’ }const JsonServerRouter = require(“json-server-router”)/* * @prop {string} root mock文件根目录默认为 ‘mock’ * @prop {number} port 端口号跟json-server 一致 默认为 3000 * @prop {string} publicPath 生成默认首页的地址,跟json-server 配置一致 默认’public’,如果修改路径的话那么json-server 对应的配置也要改 * @prop {bool} open 是否用浏览器打开 默认 true */const router = new JsonServerRouter({ root: “mock”, port: 3000, publicPath: “public”})server.use(middlewares)server.use(router.routes())server.use(router.rewrite())server.listen(3000, () => { console.log(“JSON Server is running”)}) ...

March 19, 2019 · 2 min · jiezi

浅谈前端mock

引言前端开发经常需要等待后端的接口,严重影响了开发效率,我们一般采用mock方式来避免这个问题。本人参考了大量文章,结合自己的经验,给出自己在mock上的一些理解。由于作者刚参加工作,水平有限,如果哪里写到不对,请评论指出。1. 原理何为mock,我认为mock主要就是通过正常请求在后端接口进度落后的情况下,还能获取到和后端约定数据结构一样的模拟数据的一门技术,以避免后端接口进度滞后影响我们正常的开发。mock可能会涉及到4门技术,分别是服务端技术、随机生成特定格式数据的技术、请求转发、请求拦截。2. 常用手段分类2.1 硬刚型将模拟数据直接写在代码里优点:简单暴力缺点:改变了代码原有逻辑,且耦合度高,当后端接口完成的时候还需要再改代码。2.2 拦截型mockjsmockjs通过改写ajax函数来实现拦截请求,同时它还能伪造各种随机数据,通过mockjs我们能很方便的实现简单的mock效果,优点:简单方便缺点:无法模拟真实的请求,不支持fetch(需要额外调用插件)Mock.mock(’/api/news’, { name: ‘Jack’, ‘age|10-20’: 10 });Charles、 Fiddler 、postman利用 Charles、 Fiddler 等代理工具拦截请求优点:有真实的请求缺点:配置上优点复杂2.3 Mock Servernode/express/json-server + mockjs/fakejsMock Server简单的说就是起一个服务器,服务器提供接口产生相应的mock数据前者用来起服务,后者用来产生模拟数据。json-server是对express的一个封装,用于快速构建服务器而不用写后台代码这里重点注意一下,对于一般的项目我们可以用json-server,但是如果是在vue-cli之类生成的项目里面,实际上webpack已经帮我们起了一个服务,这是我如果我们想额外起一个json-server,就需要在vue.config.js里面配置proxy。当然我们也可以不另外起服务,就用dev-server,在webpack的devServer.before里面进行配置devServer: { // proxy: { //额外起一个服务,然后进行转发 // ‘/api’: { // target: ‘json-server服务的ip:端口号’, // pathRewrite: { ‘/api’: ’’ } // } // } before: function(app) { //直接用devserver这个服务 app.get(’/api/news’, function(req, res) { res.json({ msg: ‘dev-before’ }) }) } }优点:真实,低耦合,可扩展缺点:后端参与较少2.4 Mock 平台RAP/Easy-Mock对于小型开发团队的话,Mock Server或者mockjs完全够了,因为此时前后端沟通代价比较小。但是如果是大型开发团队呢,这时候,文档的编写,接口的变更,通知到每一个人,代价就比较大了。这也是RAP,Easy-Mock这类mock平台由来的原因。优点:接口代理,协同编辑,mock数据,智能提醒,自动生成文档缺点:你要说服后端使用它3 具体开发流程举例这里就假设我们用devServer.before + mock.js来开发假设后端要开发两个接口 www.test/api/news/, www.test/api/price/3.1 后端开没开动我们在devServer虚拟两个接口在devserver里面配置beforedevServer: { before: function(app) { app.get(‘www.test/api1/news’, function(req, res) { //只对api1进行拦截 res.json({ mockjs产生的模拟数据 }) }) app.get(‘www.test/api1/price’, function(req, res) { //只对api1进行拦截 res.json({ mockjs产生的模拟数据 }) }) } }//在/src/api/index.js里面const getNews = axios.get(www.test/api1/news)const getPrice = axios.get(www.test/api1/price)export {getNews,getPrice}// 由于/api1会被before拦截从而得到mock数据,没有问题3.2 后端开发了部分接口,比如www.test/api/news/开发完毕//在/src/api/index.js里面修改/api1为/apiconst getNews = axios.get(www.test/api/news) //此时这个请求不会被拦截,走真实接口,而未开发完的接口请求还是走模拟数据接口3.3 后端全部开发完毕全部将/api1修改为/api,同时注释掉devserver.before也可以直接用mockjs进行拦截,步骤差不多,但是更简单4. 展望现阶段暂时无法数据联动,也就是对于前端来说,接口变更,还需要手动在ide上修改代码。如果能够开发一套插件,前端只需初始编写一次代码,后面ide自动同步接口变化,然后自动修改代码,不是爽歪歪!总结如果你目前的项目是中小型项目,那么可以使用mockjs或者Mock Server之类,如果项目比较大,还是建议使用在线mock平台。 ...

February 22, 2019 · 1 min · jiezi

推荐一个在线接口Mock工具fastmock

fastmock可以让你在没有后端程序的情况下能真实地在线模拟ajax请求,你可以用fatmock实现项目初期纯前端的效果演示,也可以用fastmock实现开发中的数据模拟从而实现前后端分离。如下面的接口模拟一个用户列表https://www.fastmock.site/moc…模拟各种特殊类型的数据https://www.fastmock.site/moc…您可以直接在浏览器打开上面的链接或者用ajax请求查看返回的数据在使用fastmock之前,你的团队实现数据模拟可能是下面的方案中的一种或者多种本地手写数据模拟,在前端代码中产生一大堆的mock代码。利用mockjs或者canjs的can-fixture实现ajax拦截,本地配置必要的json规则。后端在Controller层造假数据返回给前端。上面的方式中,不管哪一种方式,都会要求开发人员写一些跟项目本无任何关联的代码,第一个和第二个方式还会需要前端项目在本地引入不必要的js文件。比如下面的mock数据// 产品配置 { url: ‘/pms/product/list’, on: true, type: ‘get’, resp: Mock.mock({ ‘body’: { ‘currentPage’: 1, ‘isMore’: 0, ‘pageSize’: 15, ‘resultList|10’: [ { ‘productNo’: ‘11111’, ‘productName|1’: [‘产品名称1’, ‘产品名称2’, ‘产品名称3’, ‘产品名称4’, ‘产品名称5’], ‘productType|1’: [‘1’, ‘2’, ‘3’, ‘4’, ‘5’], ‘status|1’: [‘1’, ‘2’], ‘gmtCreate’: ‘@DATETIME(“yyyy-MM-dd HH:mm:ss”)’, ‘gmtModified’: ‘@now(“yyyy-MM-dd HH:mm:ss”)’, ‘createUserCode’: ‘@name’ } ], ‘startIndex’: 0, ’totalNum’: 100, ’totalPage’: 1 }, ‘reCode’: ‘0000’, ‘reMsg’: ‘成功’, ‘success’: true }) }, // 产品配置-贷款材料配置 { url: ‘/pms/cfgLoanDoc/list’, on: true, resp: Mock.mock({ ‘body’: { ‘currentPage’: 1, ‘isMore’: 0, ‘pageSize’: 15, ‘resultList|10’: [ { ’loanDocCode|+1’: 1, ’loanDocName’: /[测试字体]{4,30}/ } ], ‘startIndex’: 0, ’totalNum’: 100, ’totalPage’: 1 }, ‘reCode’: ‘0000’, ‘reMsg’: ‘成功’, ‘success’: true }) }上面的代码为mockjs的事例代码,更多mockjs相关资料参考链接mockjs文档为此,我们将mock层独立出来,通过中间服务的形式在前端和后端服务之前建立一道围栏,使用fastmock,前端只需要修改自己的XHR请求地址,后端只需要在开发前和前端约定好接口文档即可。等到后端服务开发完成,前端再将XHR请求地址替换回来进行联调测试即可。tip:当然,你也可以通过npm script不同命令加载不同配置文件的形式切换你的XHR地址,这里不作详细介绍。还是不了解fastmock?让我们跟着教程一探究竟吧了解并开始使用fastmock ...

January 28, 2019 · 1 min · jiezi