天天看點

接口測試 Mock 實戰 | 結合 jq 完成批量化的手工 Mock

本文霍格沃茲測試學院學員學習實踐筆記。

一、應用背景

因為本章的内容是使用

jq

工具配合完成,是以在開始部分會先花一定的篇幅介紹

jq

機器使用,如果讀者已經熟悉

jq

,可以直接跳過這部分。

先來看應用場景,App 經常會有一些資訊展示的清單頁,比如商家的菜品、股票的公司、文章的清單展示等,例如下面這樣:

接口測試 Mock 實戰 | 結合 jq 完成批量化的手工 Mock

菜品不夠吃的話~不是,是菜品數量較少不夠測試的量,假如我們想要測試幾百個菜品時,會不會在刷的時候是否有

性能影響

展示

是否正常,清單展示的

邊界值

測試等;

而要測就得有資料展示,這個時候要是通過後端去找或者造這麼多資料是有點麻煩的,其實我們這個測試的測試點就是要測試前端頁面的展示和性能,隻要有這部分資料就可以,無所謂資料是否真實從資料庫得來。

這個時候可以就可以利用

mock

的手段,對這種大資料進行等價類的生成,使前端可以拿到這類資料即可,而

Charles

正是我們實作手工

mock

測試的利器之一!

二、jq 簡介

2.1 jq 的概述與用途

按慣例,先看官網對

jq

的解釋:

jq 官網位址:

https://stedolan.github.io/jq/
接口測試 Mock 實戰 | 結合 jq 完成批量化的手工 Mock

大概意思就是輕量靈活的

Json

處理指令行。

用途

說到這大概有些人有點感覺它能用來做什麼了,為啥手工

mock

要使用

jq

了?沒錯!要用它來處理接口傳回的

json

資料以達到

mock

的效果。

2.2 jq 的下載下傳安裝

Mac:Mac還是一如既往的簡單(香~),裝了

Homebrew

的話一條指令

brew install jq

即可

其他系統:jq 的官網很貼心,給出了各個系統的下載下傳方式及其相關所需下載下傳工具的連結,具體的就檢視官網吧,連結如下

https://stedolan.github.io/jq/download/
接口測試 Mock 實戰 | 結合 jq 完成批量化的手工 Mock
  • 基本過濾

    .

最簡單的過濾,

.

這是一個過濾器,它接受輸入,并将其不變地生成為輸出。

簡單的說就是原樣輸出來:

$ echo '{"jq": "jqTest"}' | jq '.'
    {
      "jq": "jqTest"
    }           
  • 對象過濾

    .key

    .key1.key2

    .["key"]

可以通過

.key

.key1.key2

的方式來擷取對應的

value

,這樣的方式是不是有點像

jsonpath

?
$ echo '{"jq": {"jqTest": 1} }' | jq '.jq'
    {
      "jqTest": 1
    }

    $ echo '{"jq": {"jqTest": 1} }' | jq '.jq.jqTest'
    1


    $ echo '{"jq": {"jqTest": 1} }' | jq '.["jq"]'
    {
      "jqTest": 1
    }           
  • 索引過濾

    .key[index]

    .key[ startIndex: endIndex]

其實就是在

對象過濾

的基礎上

加個索引

而已,學過程式設計的都懂的~

左閉右開

,當然是針對數組的操縱,

這裡就以一種對象過濾寫法基礎上舉例子,

.key[index]

$ echo '{"jq": ["jqTest",1] }' | jq '.jq[0]'
    "jqTest"           

.key[ startIndex: endIndex]

$ echo '{"jq": ["jqTest",1] }' | jq '.jq[0:1]'
[
  "jqTest"
]           
  • 對象建構

    {}

    []

可以利用{} 、[]建構新的對象(數組)
$ echo '{"jq": ["jqTest",1] }' | jq '{ newJq: .jq[1], }'
{
  "newJq": 1
}           

如果其中一個表達式有多個結果,那麼輸出也會産生多個結果

$ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' |jq '{user, title: .titles[]}'
{
  "user": "stedolan",
  "title": "JQ Primer"
}
{
  "user": "stedolan",
  "title": "More JQ"
}           

如果

key

是不存在的,

value

将會指派為

null

$ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' |jq '{user111, title: .titles[]}'
{
  "user111": null,
  "title": "JQ Primer"
}
{
  "user111": null,
  "title": "More JQ"
}           

如果再鍵的周圍加括号就意味着它将作為表達式進行計算。

$ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' |jq '{(.user): .titles[]}'
{
  "stedolan": "JQ Primer"
}
{
  "stedolan": "More JQ"
}           
  • 其他常見用法:

    計算

echo "10" | jq '(.+2)*5'
echo null | jq '{a: 1} + {b: 2} + {c: 3} + {a: 42}'
echo '["xml", "yaml", "json"]' | jq '. - ["xml"]'
echo '{"a":5}' | jq ‘.a+=10'           

擷取長度

echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length’           
  • 數組運算
這裡要特别介紹一下數組的運算操作,也是下面實作目标的手段

jq

對于數組可以有并集(’+’)和差集(’-’)的操作:

并集('+')

:有數組

a

,

b

;

a+b

就會得到一個

包含所有a

b

數組元素的新數組:

$ echo '{"a": [1,2,3] ,"b": [3,4,5]}' | jq '.a+.b'
[
  1,
  2,
  3,
  3,
  4,
  5
]           

差集('-')

a

b

a-b

隻包含a

中元素,

不包含b

中元素的新數組:

$ echo '{"a": [1,2,3] ,"b": [3,4,5]}' | jq '.a-.b'
[
  1,
  2
]           
  • 更多用法

    更多用法可參考官網:

https://stedolan.github.io/jq/manual/#Basicfilters

==3、Mock 實作==

3.1 實作目标

如下圖中的科普推薦欄目中有 2 則科普文章,現在想要

mock

幾十甚至上百篇文章或廣告。

接口測試 Mock 實戰 | 結合 jq 完成批量化的手工 Mock

3.2 資料準備

  • 抓取接口的響應

    json

    封包如下:
{
    "code": 1,
    "msg": null,
    "data": {
        "pageNumber": 0,
        "pageSize": 10,
        "totalElements": 12,
        "totalPages": 2,
        "pageList": [{
            "id": 18,
            "title": "老年癡呆症有哪些危害?",
            "type": "patient",
            "img": "https://greenvalley.oss-cn-shanghai.aliyuncs.com/hospital/a295c2081459450ba6679db48d6a2471_700_360.png",
            "content": "<p>https://fx.wxbjq.net.cn/preview/6cAH</p>"
        }, {
            "id": 17,
            "title": "你了解老年癡呆是如何發病的嘛?",
            "type": "patient",
            "img": "https://greenvalley.oss-cn-shanghai.aliyuncs.com/hospital/953fc541af7b4576b233d2d6b364bddf_700_360.png",
            "content": "<p>https://fx.wxbjq.net.cn/preview/6cAK</p>"
        }]
  }
}           
  • 我們将資料存入json檔案中,然後指派給一個變量
$ mockData=$(cat /tmp/guanggao.json)
$ echo "$mockData"
{
    "code": 1,
    "msg": null,
    "data": {
        "pageNumber": 0,
        "pageSize": 10,
        "totalElements": 12,
        "totalPages": 2,
        "pageList": [{
            "id": 18,
            "title": "老年癡呆症有哪些危害?",
            "type": "patient",
            "img": "https://greenvalley.oss-cn-shanghai.aliyuncs.com/hospital/a295c2081459450ba6679db48d6a2471_700_360.png",
            "content": "<p>https://fx.wxbjq.net.cn/preview/6cAH</p>"
        }, {
            "id": 17,
            "title": "你了解老年癡呆是如何發病的嘛?",
            "type": "patient",
            "img": "https://greenvalley.oss-cn-shanghai.aliyuncs.com/hospital/953fc541af7b4576b233d2d6b364bddf_700_360.png",
            "content": "<p>https://fx.wxbjq.net.cn/preview/6cAK</p>"
        }]
  }
}           
  • 然後我們利用

    jq

    pageList

    中的清單進行

    +=

    操作,完成一次翻倍增長,将結果傳給變量

    mockData

這裡用到的是

jq

對數組的

并集(‘+’)運算

,兩個數組相加,最終得到一個包含兩個數組所有元素的新數組。
mockData=$(echo "$mockData" | jq '.data.pageList+=.data.pageList')
$ echo "$mockData"
{
  "code": 1,
  "msg": null,
  "data": {
    "pageNumber": 0,
    "pageSize": 10,
    "totalElements": 12,
    "totalPages": 2,
    "pageList": [
      {
        "id": 18,
        "title": "老年癡呆症有哪些危害?",
        "type": "patient",
        "img": "https://gv.oss-cn-shanghai.aliyuncs.com/hospital/a295c2081459450ba6679db48d6a2471_700_360.png",
        "content": "<p>https://fx.wxbjq.net.cn/preview/6cAH</p>"
      },
      {
        "id": 17,
        "title": "你了解老年癡呆是如何發病的嘛?",
        "type": "patient",
        "img": "https://gv.oss-cn-shanghai.aliyuncs.com/hospital/953fc541af7b4576b233d2d6b364bddf_700_360.png",
        "content": "<p>https://fx.wxbjq.net.cn/preview/6cAK</p>"
      },
      {
        "id": 18,
        "title": "老年癡呆症有哪些危害?",
        "type": "patient",
        "img": "https://gv.oss-cn-shanghai.aliyuncs.com/hospital/a295c2081459450ba6679db48d6a2471_700_360.png",
        "content": "<p>https://fx.wxbjq.net.cn/preview/6cAH</p>"
      },
      {
        "id": 17,
        "title": "你了解老年癡呆是如何發病的嘛?",
        "type": "patient",
        "img": "https://gv.oss-cn-shanghai.aliyuncs.com/hospital/953fc541af7b4576b233d2d6b364bddf_700_360.png",
        "content": "<p>https://fx.wxbjq.net.cn/preview/6cAK</p>"
      }
    ]
  }
}           

按照上述的方法,每次清單的元素個數都會翻倍,也就是

操作n次

就變成

2的n次方倍

,指數增長的速度就不用多說了~

這樣根據自己的需要得到資料後将新資料存入

json

檔案,最重要的資料準備過程也就完成了:

$ echo "$mockData" > /tmp/MockTest.json           

3.3 Charles 的 Mock 實作

說了這麼多“廢話”,總算是到了主角了,其實資料準備好了,工具的使用還是很簡單的,

Charles

有一個叫做

Map Local

的功能,在你要

mock

的請求上右擊就可找到:

接口測試 Mock 實戰 | 結合 jq 完成批量化的手工 Mock

Map Local

可以對指定的接口傳回使用本地檔案進行替換,如這裡替換為上文中廢話半天生成的資料檔案

MockTest.json

接口測試 Mock 實戰 | 結合 jq 完成批量化的手工 Mock

然後再次重新整理頁面,看看效果,頁面的清單就如願倍增了,也不用去資料庫添加資料,儲存一份

json

檔案即測即用即可:

接口測試 Mock 實戰 | 結合 jq 完成批量化的手工 Mock

以上,期待大家一起交流,多多指正。

免費領取:接口測試+性能測試+自動化測試+測試開發+測試用例+履歷模闆+測試文檔