本文霍格沃茲測試學院學員學習實踐筆記。
由於本章的內容是使用jq
工具配合完成,所以在開始部分會先花必定的篇幅介紹jq
機器使用,若是讀者已經熟悉jq
,能夠直接跳過這部分。前端
先來看應用場景,App 常常會有一些信息展現的列表頁,好比商家的菜品、股票的公司、文章的列表展現等,例以下面這樣:git
菜品不夠吃的話~不是,是菜品數量較少不夠測試的量,假如咱們想要測試幾百個菜品時,會不會在刷的時候是否有性能影響
,展現
是否正常,列表展現的邊界值
測試等;github
而要測就得有數據展現,這個時候要是經過後端去找或者造這麼多數據是有點麻煩的,其實咱們這個測試的測試點就是要測試前端頁面的展現和性能,只要有這部分數據就能夠,無所謂數據是否真實從數據庫得來。數據庫
這個時候能夠就能夠利用mock
的手段,對這種大數據進行等價類的生成,使前端能夠拿到這類數據便可,而Charles
正是咱們實現手工mock
測試的利器之一!編程
2.1 jq 的概述與用途json
按慣例,先看官網對jq
的解釋:後端
jq 官網地址:https://stedolan.github.io/jq/數組
大概意思就是輕量靈活的Json
處理命令行。bash
用途工具
說到這大概有些人有點感受它能用來作什麼了,爲啥手工mock
要使用jq
了?沒錯!要用它來處理接口返回的json
數據以達到mock
的效果。
2.2 jq 的下載安裝
Mac:Mac仍是一如既往的簡單(香~),裝了Homebrew
的話一條命令brew install jq
便可
其餘系統:jq 的官網很貼心,給出了各個系統的下載方式及其相關所需下載工具的連接,具體的就查看官網吧,連接以下
https://stedolan.github.io/jq...
2.3 jq 的基本使用
.
最簡單的過濾,
.
這是一個過濾器,它接受輸入,並將其不變地生成爲輸出。
簡單的說就是原樣輸出來:
$ 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...
3.1 實現目標
以下圖中的科普推薦欄目中有 2 則科普文章,如今想要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>" }] } }
$ 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
的請求上右擊就可找到:
Map Local
能夠對指定的接口返回使用本地文件進行替換,如這裏替換爲上文中廢話半天生成的數據文件MockTest.json
:
而後再次刷新頁面,看看效果,頁面的列表就如願倍增了,也不用去數據庫添加數據,保存一份json
文件即測即用便可:
以上,期待你們一塊兒交流,多多指正。