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

若是你想從頭學習Jmeter,能夠看看這個系列的文章哦php

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

 

爲何要用 JSON 提取器

  • JSON 是目前大多數接口響應內容的數據格式
  • 在接口測試中,不一樣接口之間可能會有數據依賴,在 Jmeter 中能夠經過後置處理器來提取接口的響應內容
  • JSON 提取器是其中一個能夠用來提取響應內容的元件

 

JSON 提取器的應用場景

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

 

JSON 提取器

咱們經過實際栗子去講述理論知識點正則表達式

 

JSON 提取器界面介紹

 

字段含義

 

字段 結果
Apply to 應用範圍,選默認的 main sample only 就好了
Names of created variables
  • 接收提取值的變量名
  • 多個變量用 ; 分隔
  • 必傳
JSON Path expression
  • json path 表達式,用來提取某個值
  • 多個表達式用 ; 分隔
  • 必傳
Match No.(0 for Random)
  • 取第幾個值,多個值用 ; 分隔
  • 0:隨機,默認
  • -1:全部
  • 1:第一個值
  • 非必傳
Compute concatenation var(suffix_ALL)
  • 若是匹配到多個值,則將它們都鏈接起來,不一樣值之間用 , 分隔
  • 變量會自動命名爲 <variable name>_ALL 
Default Values
  • 缺省值,匹配不到值的時候取該值,可寫error
  • 多個值用 ; 分隔
  • 非必傳

 

入門栗子 

栗子的前提

這個栗子,我都會以這個地址的接口來完成 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 都行
  • 字段值數量不一致則沒法提取值
相關文章
相關標籤/搜索