1. 程式人生 > 實用技巧 >Jmeter系列(26)- 詳解 JSON 提取器

Jmeter系列(26)- 詳解 JSON 提取器

果你想從頭學習Jmeter,可以看看這個系列的文章哦

https://www.cnblogs.com/poloyy/category/1746599.html

為什麼要用 JSON 提取器

  • JSON 是目前大多數介面響應內容的資料格式
  • 在介面測試中,不同介面之間可能會有資料依賴,在 Jmeter 中可以通過後置處理器來提取介面的響應內容
  • JSON 提取器是其中一個可以用來提取響應內容的元件

json 提取器的應用場景

  1. 提取某個特定的值
  2. 提取多個值
  3. 按條件取值
  4. 提取值組成的列表

JSON 提取器

我們通過實際栗子去講述理論知識點

JSON 提取器介面介紹

欄位含義

欄位 含義
Apply to
應用範圍,選預設的 main sample only 就行了
Namesofcreatedvariables
  • 接收提取值的變數名
  • 多個變數用;分隔
  • 必傳
JSONPathexpression
  • json path 表示式,用來提取某個值
  • 多個表示式用;分隔
  • 必傳
MatchNo.(0 for Random)
  • 取第幾個值
  • 0:隨機
  • -1:所有
  • 1:第一個值
  • 非必傳
Compute concatenation var(suffix_ALL)
  • 如果匹配到多個值,則將它們都連線起來,不同值之間用,分隔
  • 變數命名為<variable name>_ALL
Default
Values
  • 預設值,匹配不到值的時候取該值,可寫error
  • 非必傳

入門栗子

栗子的前提

這個栗子,我都會以這個地址的介面來完成 JSON 提取器的實戰慄子,大家可以註冊個賬號玩一玩哦

http://api.yesapi.cn/docs.php?keyword=%E4%BC%9A%E5%91%98&channel=api

測試計劃樹結構

下面多個栗子都以這個測試計劃為基礎哦

提取某個特定的值的栗子

登入介面響應

登入是執行其他介面的前置介面,所以要獲取使用者登入後的 token、uuid

提取 token

相對路徑的方式

提取 uuid

絕對路徑的方式

其他介面呼叫 token、uuid

知識點

  • 提取某個特定值的方式有兩種:絕對路徑、相對路徑
  • 提其他介面可以通過${var}這種格式,來獲取提取到的值

綜合栗子

  • 接下來的栗子都是通過宣告單個變數(Name of variable)講述的栗子
  • 上面講的是使用 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[0])來獲取值,因為預設是獲取ASCII碼大的那個 ,除非提取器設定了Match No.
  • 如果想取匹配到的所有 uuid,可以設定為 -1,結果如下圖

還會告訴你匹配了多少個值${uuid_matchNr},記住,呼叫變數時,不再是${uuid}而是${uuid_1}、${uuid_2}

利用切片提取單個值

和 Python 切片一樣的原理

JsonPath 結果

$..users[2]

第三個users

$..users[-2]

倒數第二個users

$..users[0,1]

前面兩個users

$..users[:2]

第一、二個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代表大小寫不敏感

勾選Compute concatenation var 的栗子

JSON 提取器

測試結果

uuid_1=6D5EDCB459F0917A98106E07D5438C58
uuid_2=0164DC0680F84DCE40D3DD4A36640ECA
uuid_3=079BF6BB82AFCFC7084F96AECAF0519F
uuid_ALL=6D5EDCB459F0917A98106E07D5438C58,0164DC0680F84DCE40D3DD4A36640ECA,079BF6BB82AFCFC7084F96AECAF0519F
uuid_matchNr=3