本文霍格沃茲測試學院學員學習實踐筆記。
一、應用背景
因為本章的内容是使用
jq
工具配合完成,是以在開始部分會先花一定的篇幅介紹
jq
機器使用,如果讀者已經熟悉
jq
,可以直接跳過這部分。
先來看應用場景,App 經常會有一些資訊展示的清單頁,比如商家的菜品、股票的公司、文章的清單展示等,例如下面這樣:

菜品不夠吃的話~不是,是菜品數量較少不夠測試的量,假如我們想要測試幾百個菜品時,會不會在刷的時候是否有
性能影響
,
展示
是否正常,清單展示的
邊界值
測試等;
而要測就得有資料展示,這個時候要是通過後端去找或者造這麼多資料是有點麻煩的,其實我們這個測試的測試點就是要測試前端頁面的展示和性能,隻要有這部分資料就可以,無所謂資料是否真實從資料庫得來。
這個時候可以就可以利用
mock
的手段,對這種大資料進行等價類的生成,使前端可以拿到這類資料即可,而
Charles
正是我們實作手工
mock
測試的利器之一!
二、jq 簡介
2.1 jq 的概述與用途
按慣例,先看官網對
jq
的解釋:
jq 官網位址:
https://stedolan.github.io/jq/大概意思就是輕量靈活的
Json
處理指令行。
用途
說到這大概有些人有點感覺它能用來做什麼了,為啥手工
mock
要使用
jq
了?沒錯!要用它來處理接口傳回的
json
資料以達到
mock
的效果。
2.2 jq 的下載下傳安裝
Mac:Mac還是一如既往的簡單(香~),裝了
Homebrew
的話一條指令
brew install jq
即可
其他系統:jq 的官網很貼心,給出了各個系統的下載下傳方式及其相關所需下載下傳工具的連結,具體的就檢視官網吧,連結如下
https://stedolan.github.io/jq/download/
- 基本過濾
.
最簡單的過濾, .
這是一個過濾器,它接受輸入,并将其不變地生成為輸出。
簡單的說就是原樣輸出來:
$ 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
]
-
更多用法
更多用法可參考官網:
==3、Mock 實作==
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>"
}]
}
}
- 我們将資料存入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
的請求上右擊就可找到:
Map Local
可以對指定的接口傳回使用本地檔案進行替換,如這裡替換為上文中廢話半天生成的資料檔案
MockTest.json
:
然後再次重新整理頁面,看看效果,頁面的清單就如願倍增了,也不用去資料庫添加資料,儲存一份
json
檔案即測即用即可:
以上,期待大家一起交流,多多指正。