<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          這么好的 Mock 工具怎么還不用起來?

          共 5902字,需瀏覽 12分鐘

           ·

          2021-12-30 12:17


          前言

          工具好不好用,關鍵在于用。

          肯定有很多前端程序猿聯(lián)調前很悠閑??,但聯(lián)調階段持續(xù)加班,直到提測、上線。

          這其中緣由不外乎需求不明確等原因,但如果我們能在聯(lián)調前完成大部分工作,相信就能準點下班啦??。如果你也有類似的現(xiàn)象,希望能看完此篇,或許能讓你在不協(xié)調的工作中解放出來。

          可以先加個收藏(Ctrl + D 或 command + D),以備不時之需。


          背景

          在開發(fā)環(huán)境中,由于后端與前端并行開發(fā)、或者前端需要等待后臺接口開發(fā)。接口直接嚴重依賴,生成數(shù)據(jù)的業(yè)務邏輯復雜等,嚴重影響了開發(fā)效率。

          因此學會使用最適合自己的 Mock 數(shù)據(jù)的方法就非常重要。

          下面介紹了幾種常用的mock方案,通過了解自動化mock的方式,減少重復工作,減少真實聯(lián)調問題,我們可以根據(jù)開發(fā)場景,選擇并配置最合適自己的方案。


          六類常用的MOCK方案說明

          方案①:代碼侵入 (實際開發(fā)中最常用,但不推薦)

          特點:直接在代碼中寫死 Mock 數(shù)據(jù),或者請求本地的 JSON 文件
          優(yōu)點:無
          缺點:

          1. 和其他方案比 Mock 效果不好
          2. 與真實 Server 環(huán)境的切換非常麻煩,一切需要侵入代碼切換環(huán)境的行為都是不好的

          方案②:接口管理工具

          代表:

          rap[2](阿里,已停止維護,使用rap2)
          swagger[3]
          moco[4]參考[5], 和前端處理mock類似,json假數(shù)據(jù)+服務)
          yapi[6](去哪兒網(wǎng)開發(fā)yapi 官網(wǎng)[7])

          優(yōu)缺點(接口管理工具)

          優(yōu)點:

          1. 配置功能強大,接口管理與 Mock 一體,后端修改接口 Mock 也跟著更改,可靠
          2. 有統(tǒng)一的接口管理后臺,查找使用方便。

          缺點:

          1. 配置復雜,依賴后端,可能會出現(xiàn)后端不愿意出手,或者等配置完了,接口也開發(fā)出來了的情況。mock數(shù)據(jù)都由后臺控制,有什么異常情況 前端同學基本上使不上力。有背前后臺分離的原則。
          2. 一般會作為大團隊的基礎建設而存在, 沒有這個條件的話需慎重考慮
          3. 增加后臺負擔,與其讓后臺處理mock數(shù)據(jù)相關問題,倒不如加快提供真實接口數(shù)據(jù)。

          方案③:本地 node 服務器

          代表:json-server[8]
          原理:使用lowdb[9],操作本地小型的數(shù)據(jù)庫(遵循 REST API)。特點:

          • 可以獨立使用,也可以作為node服務的中間件 server.use(db)
          • db可以是json文件(更直觀),也可以使js文件(靈活性更高)
          • 可以設置跨域、開啟gzip、設置延時、日志、指定路由等。json-server [options]
          • 可命令行啟動或 json-server.json?配置后直接啟動
          • 可以自定義路由映射(key為真實路由、value為mock路由)

          輕而易舉的實現(xiàn)后臺功能

          過濾:GET /list?name.age=18;
          分頁:?/users?_page=3&_limit=5
          排序:/users?_sort=id&_order=desc
          分隔:/users?_start=2&_end=5
          運算:使用?_gte 或?_lte 選取一個范圍、使用?_ne 排除一個值、使用?_like 進行模糊查找?(支持正則表達式)
          ......
          復制代碼

          服務管理

          增刪改查參考postman示例。(注意body-raw要選擇json模式)

          優(yōu)點:

          1. 配置簡單,json-server 甚至可以 0 代碼 30 秒啟動一個 REST API Server
          2. 自定義程度高,一切盡在掌控中
          3. 增刪改查真實模擬

          缺點:

          1. 與接口管理工具相比,無法隨著后端 API 的修改而自動修改

          方案④:請求攔截[MOCKJS]

          代表:Mock.js[10]

          特點:

          • 通過攔截特定的AJAX請求,并生成給定的數(shù)據(jù)類型的隨機數(shù),以此來模擬后端同學提供的接口。
          • 使用數(shù)據(jù)模板定義,隨機生成定義數(shù)據(jù)的自由度大。使用MockJS的Random工具類的方法定義,這種方式自由度小,只能隨機出MockJS提供的數(shù)據(jù)類型。
          • 一般配合其它庫使用或單獨在項目中使用或者通過反向代理來實現(xiàn)。

          使用格式說明:

          Mock.mock( rurl?, rtype?, template|function( options ) )

          • rurl:可選,攔截的url地址,可以是字符串或正則(常用)
          • rtype: 可選,攔截的請求類型,字符串(對大小寫敏感,必須小寫)。
          • template|function( options ):必須,攔截后返回的數(shù)據(jù)。template一般為json對象類型;function在return時需要返回template,其中option包含請求的urltype?和?body屬性
          • 只傳template,則執(zhí)行Mock.mock后返回的是``template的實際結果``。

          簡單示例展示:

          隨機生成顏色

          Mock.mock('@color')?
          "#f279ba"
          復制代碼

          隨機生成郵箱

          Mock.mock('@email')
          "[email protected]"
          復制代碼

          隨機生成ip

          Mock.mock('@ip')
          "44.122.28.106"
          復制代碼

          隨機生成區(qū)域地址

          Mock.mock('@region')
          "東北"
          復制代碼

          還能隨機生成圖片(并可傳參配置圖片大小、顏色等)

          Random.image()?
          復制代碼

          隨機生成日期時間

          Random.date()
          //?=>?"2020-10-23"
          Random.date('yyyy-MM-dd')
          //?=>?"1998-01-29"
          Random.time()
          //?=>?"22:44:56"
          Mock.mock('@time')
          //?=>?"01:48:17"
          復制代碼

          按規(guī)則生成字符串

          //?指定范圍的數(shù)量
          Mock.mock({?"string|1-10":?"★"?})?//?執(zhí)行后
          {?"string":?"★★"?}?//?隨機生成數(shù)量為1-10個'*'字符串

          //?固定數(shù)量
          Mock.mock({?"string|3":?"*"?})??//?執(zhí)行后
          {?"string":?"***"?}?//?生成指定數(shù)量的'*'(示例是3個)字符串
          復制代碼

          生成指定范圍內的數(shù)字

          //?整數(shù)
          Mock.mock({?"number|1-100":?100?})?//?執(zhí)行后
          {?"number":?84?}?//?生成1-100范圍內的數(shù)字

          //?小數(shù)
          Mock.mock({?"number|1-100.1-10":?1?})?//?執(zhí)行后
          {?"number":?72.15917?}?//?生成1-100的數(shù)字,隨機保留1-10位小數(shù)
          復制代碼

          生成隨機的對象數(shù)量

          Mock.mock({?"object|2-4":?{?
          "110000":?"北京市",?
          "120000":?"天津市",?
          "130000":?"河北省",
          "140000":?"山西省"?
          }})?
          //?執(zhí)行后,隨機獲取對象中的2-4項
          {?"object":?{?
          "120000":?"天津市",?
          "130000":?"河北省"?
          }?}
          復制代碼

          生成指定數(shù)量的數(shù)組

          Mock.mock({?"array|1":?[?"AMD",?"CMD",?"UMD"?]?})
          {?"array":?"CMD"?}?//?隨機獲取對象中的一項
          復制代碼

          生成對象數(shù)組

          // list指定了數(shù)組當中的對象數(shù)量,最少一項,最多10項。
          Mock.mock({
          ????//?屬性?list?的值是一個數(shù)組,其中含有?1?到?10?個元素
          ????'list|1-10':?[{
          ????????//?屬性?id?是一個自增數(shù),起始值為?1,每次增?1
          ????????'id|+1':?1
          ????}]
          })
          //?隨機的結果
          {
          ????"list":?[
          ????????{
          ????????????"id":?1
          ????????},
          ????????{
          ????????????"id":?2
          ????????}
          ????]
          }
          復制代碼

          ......

          更多示例可查看官方鏈接[11]

          語法規(guī)范

          > 數(shù)據(jù)模板定義

          定義規(guī)則:'key|rules': value

          屬性值的數(shù)據(jù)類型可以是Number、Boolean、String、Object、Array、Function、Null,不可以是Undefined

          'name|min-max':?value
          'name|count':?value
          'name|min-max.dmin-dmax':?value
          'name|min-max.dcount':?value
          'name|count.dmin-dmax':?value
          'name|count.dcount':?value
          'name|+step':?value
          'regexp':?/\d{5,10}/,
          復制代碼

          攔截接口返回示例:

          步驟:
          1.?創(chuàng)建mock.js文件
          //?正則匹配?/notification\/count/?的接口
          Mock.mock(/notification\/count/,?{
          ??"code":?200,
          ??"msg":?"success",
          ??"data":?{
          ??????"count":?3
          ??}
          })
          2.?在入口中引入mock即可

          其它優(yōu)化:
          在npm script中增加命令并添加mock環(huán)境變量,開發(fā)環(huán)境中用該命令啟動。
          在入口文件中使用mock環(huán)境變量判斷是否加載mock.js,使mock數(shù)據(jù)和業(yè)務代碼徹底分離。
          復制代碼

          > 查看和使用random

          1. **全局使用**
          npm?install?mockjs?-g
          random?-h?查看可使用的模板
          復制代碼
          1. 局部使用

          隨機生成數(shù)據(jù)

          Mock.mock( { email: '@email' } )占位符 等同于 調用了Mock.Random.email(), 隨機生成email。

          還可隨機生成圖片、顏色、地址、網(wǎng)址、自增數(shù)等。

          1. **擴展模板(自定義MOCK數(shù)據(jù)的模板)**
          Random.extend({
          ????constellation:?function(date)?{
          ????????var?constellations?=?['白羊座',?'金牛座',?'雙子座',?'巨蟹座',?'獅子座',?'處女座',?'天秤座',?'天蝎座',?'射手座',?'摩羯座',?'水瓶座',?'雙魚座']
          ????????return?this.pick(constellations)
          ????}
          })
          復制代碼

          > Mock.valid(template, data) 校驗數(shù)據(jù)

          var?tempObj?=?{
          ??"user|1-3"?:?[{'name':'@name',?'id|28-338':?88}]
          ?};
          ?var?realData?=?{?"user":[{'name':?'張三','id':90?}]};
          ?//?校驗通過返回空數(shù)據(jù),不通過則返回原因。(可以有多條原因,因此返回的是數(shù)組對象結構)
          ?console.log(Mock.valid(tempObj,realData));?
          復制代碼

          > Mock.toJSONSchema( template )

          把 Mock.js 風格的數(shù)據(jù)模板 template 轉換成 JSON Schema[12]

          > Mock.setup( settings )

          配置攔截 Ajax 請求時的行為。支持的配置項有:timeout

          Mock.setup({
          ????timeout:?400
          })
          Mock.setup({
          ????timeout:?'200-600'
          })
          復制代碼

          優(yōu)缺點(MOCKJS)

          優(yōu)點:

          1. 與前端代碼分離
          2. 可生成隨機數(shù)據(jù)

          缺點:

          1. 數(shù)據(jù)都是動態(tài)生成的假數(shù)據(jù),無法真實模擬增刪改查的情況
          2. 只支持 ajax,不支持 fetch

          方案⑤:抓包工具

          利用?Charles?、Fiddler等代理工具,
          常見的處理方式有

          • 將 URL 映射到本地文件;(調試APP混合開發(fā)等)
          • debugger某個url,修改響應數(shù)據(jù)。
          • 攔截后返回本地的數(shù)據(jù),如Charles,直接采用Map locale 或者 Map Remote的方式。
          1. 右擊url, copy response
          2. 在本地新建mock json數(shù)據(jù),然后將response粘貼修改
          3. 再次訪問url,觀察api的變化。
          優(yōu)缺點:

          優(yōu)點:mock便于混合開發(fā)的問題排查、線上問題排查等。
          缺點:調試相對繁瑣。


          方案⑥:組合模式

          代表:easy-mock[13](提供在線服務和接口代理,支持mockjs、Swagger[14]、restapi風格)
          node框架生成器 + json-server[15] + mockjs。

          REST API

          URI 代表 資源/對象,METHOD 代表行為 www.ruanyifeng.com/blog/2014/0…[16]

          GET?/tickets?//?列表
          GET?/tickets/12?//?詳情
          POST?/tickets??//?增加
          PUT?/tickets/12?//?替換
          PATCH?/tickets/12?//?修改
          DELETE?/tickets/12?//?刪除
          資源負數(shù)名稱表示對應表的資源集合,方法動詞。
          復制代碼
          • [17] 了解 patch vs put

          其它方案參考

          • apifox

          API 文檔、調試、Mock、自動化測試一體化協(xié)助平臺[18]
          看評論推薦的人還真不少??,感興趣的小伙伴可以嘗試一下。支持 HTTP、TCP、RPC,(2020-12-28首版發(fā)布)

          常用解決方案:

          1. 使用 Swagger 管理 API 文檔
          2. 使用 Postman 調試 API
          3. 使用 RAP 等工具 Mock API 數(shù)據(jù)
          4. 使用 JMeter 做 API 自動化測試
          • jsonplaceholder

          很方便,直接fetch遠程的數(shù)據(jù)即可,高效易用jsonplaceholder官方文檔[19]


          最后

          Mock不只是mock數(shù)據(jù),還可以mock功能的。我們通過使用Mock盡可能的完善功能,才能在聯(lián)調時事半功倍。

          如果覺得有幫助,不妨點贊、關注支持一下。如文章有不足之處、疑問或建議,希望能在下方???? 留言,非常感謝。

          MOCK數(shù)據(jù)原理可參考我之前寫過的這篇文章:Javascript 如何全面接管xhr請求[20]

          關于本文

          來源:tager

          https://juejin.cn/post/7026165301255340045

          The End

          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  伊人五月婷久久 | 天天想夜夜操 | 日本黄视频在线观看网 | 日韩大香焦网 | 在线波多野结衣 |