若是你想從頭學習Jmeter,能夠看看這個系列的文章哦php
https://www.cnblogs.com/poloyy/category/1746599.htmlhtml
爲何要用 JSON 提取器
- JSON 是目前大多數接口響應內容的數據格式
- 在接口測試中,不一樣接口之間可能會有數據依賴,在 Jmeter 中能夠經過後置處理器來提取接口的響應內容
- JSON 提取器是其中一個能夠用來提取響應內容的元件
JSON 提取器的應用場景
- 提取某個特定的值
- 提取多個值
- 按條件取值
- 提取值組成的列表
JSON 提取器
咱們經過實際栗子去講述理論知識點正則表達式
JSON 提取器界面介紹
字段含義
字段 | 結果 |
---|---|
Apply to | 應用範圍,選默認的 main sample only 就好了 |
Names of created variables |
|
JSON Path expression |
|
Match No.(0 for Random) |
|
Compute concatenation var(suffix_ALL) |
|
Default Values |
|
入門栗子
栗子的前提
這個栗子,我都會以這個地址的接口來完成 JSON 提取器的實戰慄子,你們能夠註冊個帳號玩一玩哦express
http://api.yesapi.cn/docs.php?keyword=%E4%BC%9A%E5%91%98&channel=apijson
測試計劃樹結構
下面多個栗子都以這個測試計劃爲基礎哦api
提取某個特定的值的栗子
登陸接口響應
登陸是執行其餘接口的前置接口,因此要獲取用戶登陸後的 token、uuid數組
提取 token
相對路徑的方式dom
提取 uuid
絕對路徑的方式學習
其餘接口調用 token、uuid
知識點
- 提取某個特定值的方式有兩種:絕對路徑、相對路徑
- 提其餘接口能夠經過 ${var} 這種格式,來獲取提取到的值
綜合栗子
- 上面講的是使用 JSON 提取器時的一個流程
- 在實際項目中,接口的響應內容確定是很是複雜的,而咱們須要提取的值也是多樣化的,須要經過各類實戰慄子來說述清晰
JSON 字符串
這也是某個接口返回的響應內容,後面的栗子也是以這個 JSON 字符串爲基礎來提取各類值測試
{ "ret": 200, "msg": "V2.5.1 YesApi App.User.GetList", "data": { "total": 3, "err_msg": "", "err_code": 0, "users": [ { "role": "user", "status_desc": "正常", "reg_time": "2020-06-22 15:19:51", "role_desc": "普通會員", "ext_info": { "yesapi_nickname": "", "yesapi_points": 0 }, "uuid": "6D5EDCB459F0917A98106E07D5438C58", "username": "fangjieyaossb", "status": 0 }, { "role": "user", "status_desc": "正常", "reg_time": "2020-06-22 14:27:17", "role_desc": "普通會員", "ext_info": { "yesapi_nickname": "", "yesapi_points": 0 }, "uuid": "0164DC0680F84DCE40D3DD4A36640ECA", "username": "fangjieyaossa", "status": 0 }, { "role": "admin", "status_desc": "正常", "reg_time": "2020-03-23 22:48:32", "role_desc": "管理員", "ext_info": { "yesapi_nickname": "", "yesapi_points": 0 }, "uuid": "079BF6BB82AFCFC7084F96AECAF0519F", "username": "fangjieyaoss", "status": 0 } ] } }
提取單個值
Jsonpath | 結果 |
---|---|
$.data.total | 2 |
$..total | 2 |
$..users[0].role | user |
$..uuid | 079BF6BB82AFCFC7084F96AECAF0519F |
$.data.users[0].ext_info.yesapi_points | 0 |
重點
- 若是匹配到多個值(像 $..uuid ),也只能提取到一個值
- 若是想提取匹配到的全部 uuid,能夠設置爲 -1,結果以下圖
還會告訴你匹配了多少個值 ${uuid_matchNr} ,記住,調用變量時,再也不是 ${uuid} 而是 ${uuid_1} 、 ${uuid_2}
利用切片提取單個值
和 Python 切片同樣的原理
Jsonpath | 結果 |
---|---|
$..users[2] | 第三個 users |
$..users[-2] | 倒數第二個users |
$..users[0,1] | 前面兩個users |
$..users[:2] | 第1、二個users |
$..users[1:2] | 第二個users |
$..users[-2:] | 倒數兩個users |
$..users[1:] | 第二個開始的全部users |
提取多個值
- 四種寫法相似,選一種方法本身熟記便可
- 重點:提取多個值,提取器的 Match No. 必須填 -1
$.data.users[*].role
提取全部 role 字段值
[*] 表示取數組的全部元素
$..users..role_desc
提取全部 role_desc 字段值
$..reg_time
提取全部 reg_time 字段值
$..[*].username
提取全部 username 字段值
按條件提取值
有時候只須要提取某個特定條件下的參數值
語法格式
[?(expression)]
栗子
Jsonpath | 結果 |
---|---|
$..users[?(@.uuid)] | 提取 users 裏面包含 uuid 字段的記錄 |
$..users[?(@.reg_time > '2020-06-01')] | 提取 reg_time 字段大於 2020-06-01 的記錄 |
$..users[?(@.role_desc =~ /.*會員.*?/i)] | 提取 role_desc 字段包含會員的記錄 |
$..users[?(@.status == 0)] | 提取 status 字段等於 0 的記錄 |
@
表明當前節點,像上面的四個栗子,@表明 users 這個列表字段
=~
- 後面跟正則表達式,若是想提取包含指定字符的值,可使用此正則: /.*指定字符串.*?/i
- i 表明大小寫不敏感
提取數據指定字段的值的栗子
提取 users 第一條記錄的 uuid、username 字段的值
$..users[0].['uuid','username']
測試結果
new_1={"uuid":"6D5EDCB459F0917A98106E07D5438C58","username":"luojunjiessb"}
勾選 Compute concatenation var 的栗子
JSON 提取器
測試結果
uuid_1=6D5EDCB459F0917A98106E07D5438C58 uuid_2=0164DC0680F84DCE40D3DD4A36640ECA uuid_3=079BF6BB82AFCFC7084F96AECAF0519F uuid_ALL=6D5EDCB459F0917A98106E07D5438C58,0164DC0680F84DCE40D3DD4A36640ECA,079BF6BB82AFCFC7084F96AECAF0519F uuid_matchNr=3
一個 JSON 提取器有多個 Jsonpath 的栗子
JSON 提取器
測試結果
uuid1_1=6D5EDCB459F0917A98106E07D5438C58 uuid1_2=0164DC0680F84DCE40D3DD4A36640ECA uuid1_3=079BF6BB82AFCFC7084F96AECAF0519F uuid1_matchNr=3 uuid2_1=6D5EDCB459F0917A98106E07D5438C58 uuid2_2=0164DC0680F84DCE40D3DD4A36640ECA uuid2_3=079BF6BB82AFCFC7084F96AECAF0519F uuid2_matchNr=3
知識點
- 若是有多個 Jsonpath 的時候,每一個字段都必填值,且字段值的數量要一致(像上圖,每一個字段都填了兩個值)
- 勾不勾 Compute concatenation var 都行
- 字段值數量不一致則沒法提取值