Jmeter --json提取器【提取符合特定條件的表達式】


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

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

 關於如何提取列表中的隨機值呢

$.datas[*].id

 

 

關於如何提取符合特定條件的json表達式呢 

 $.datas[?(@.recommend=='0')].id

 

 

 

 

 

 

 

 

 

 

 

 

1|0為什么要用 JSON 提取器

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

 

JSON 提取器的應用場景

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

 

2|0JSON 提取器

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

 

3|0JSON 提取器界面介紹

 

字段含義

 

字段 結果
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
  • 多個值用 ; 分隔
  • 非必傳

 

4|0入門栗子 

4|1栗子的前提

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

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

 

4|2測試計划樹結構

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

 

4|3提取某個特定的值的栗子

登錄接口響應

登錄是執行其他接口的前置接口,所以要獲取用戶登錄后的 token、uuid

 

提取 token

相對路徑的方式

 

提取 uuid

絕對路徑的方式

 

其他接口調用 token、uuid

 

4|4知識點

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

 

5|0綜合栗子

  • 上面講的是使用 JSON 提取器時的一個流程
  • 在實際項目中,接口的響應內容肯定是非常復雜的,而我們需要提取的值也是多樣化的,需要通過各種實戰栗子來講述清晰

 

5|1JSON 字符串

這也是某個接口返回的響應內容,后面的栗子也是以這個 JSON 字符串為基礎來提取各種值

感興趣也可以自己玩一玩:http://api.yesapi.cn/docs-api-App.User.GetList.html

{ "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 } ] } }

 

5|2提取單個值

Jsonpath 結果
$.data.total 3
$..total 3
$..users[0].role user
$..uuid 079BF6BB82AFCFC7084F96AECAF0519F
$.data.users[0].ext_info.yesapi_points 0

 

重點

  • 如果匹配到多個值(像 $..uuid ),也只能提取到一個值
  • 如果想提取匹配到的所有 uuid,可以設置為 -1,結果如下圖

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

 

5|3利用切片提取單個值

和 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

 

5|4提取多個值

  • 四種寫法類似,選一種方法自己熟記即可
  • 重點:提取多個值,提取器的 Match No. 必須填 -1

 

$.data.users[*].role

提取所有 role 字段值

[*] 表示取數組的所有元素

 

$..users..role_desc

提取所有 role_desc 字段值

 

$..reg_time

提取所有 reg_time 字段值

 

$..[*].username

提取所有 username 字段值

 

5|5按條件提取值

有時候只需要提取某個特定條件下的參數值

 

語法格式

[?(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  代表大小寫不敏感

 

6|0提取數據指定字段的值的栗子

提取 users 第一條記錄的 uuid、username 字段的值

$..users[ 0].['uuid','username']

 

測試結果

new_1={"uuid":"6D5EDCB459F0917A98106E07D5438C58","username":"luojunjiessb"}

 

7|0勾選 Compute concatenation var 的栗子

JSON 提取器

 

測試結果

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

 

8|0一個 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 都行
  • 字段值數量不一致則無法提取值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM