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

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

一、為什麼要用 JSON 提取器

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

1.1 JSON 提取器的應用場景

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

二、JSON 提取器

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

三、JSON 提取器介面介紹

3.1 欄位含義

欄位 結果
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.1 測試計劃樹結構

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

4.2 提取某個特定的值的栗子

4.2.1 登入介面響應

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

{
    "ret":200,
    "msg":"V2.5.1 YesApi App.User.LoginExt",
    "data",{
        "role":"user",
        "err_msg":"",
        "err_code":"0",
        "uuid":"07sd98skjn0fmklasmi"
        "token":"SADIFNAOI89ASOIKDN8A9DJAOI"
    }
}

4.2.2 提取 token

相對路徑的方式

4.2.3 提取 uuid

絕對路徑的方式

4.2.4 其他介面呼叫 token、uuid

4.2.5 知識點

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

五、綜合例子

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

5.1 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
            }
        ]
    }
}

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_1=6SADAS8DU8ASUD89AUS8D
uuid_2=9SD90AS76SF8SA7D98798
uuid_3=7GSDF8ASD89AS8D9AS8D8
uuid_matchNr=3

還會告訴你匹配了多少個值 ${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

5.4.1 $.data.users[*].role

提取所有 role 欄位值

role_more_1=user
role_more_2=user
role_more_3=admin
role_more_matchNr=3

[*] 表示取陣列的所有元素

5.4.2 $..users..role_desc

提取所有 role_desc 欄位值

role_desc_more_1=普通會員
role_desc_more_2=普通會員
role_desc_more_3=普通會員
role_desc_more_matchNr=3

5.4.3 $..reg_time

提取所有 reg_time 欄位值

reg_time_more_1=2020-06-22 15:19:51
reg_time_more_2=2020-06-22 14:33:51
reg_time_more_3=2020-03-23 22:19:51
reg_time_more_matchNr=3

5.4.4 $..[*].username

提取所有 username 欄位值

username_1=mzd
username_2=mofashi
username_3=xjp
username_maychNr=3

5.5 按條件提取值

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

5.5.1 語法格式

[?(expression)]

5.5.2 例子

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 的記錄

5.5.3 @

代表當前節點,像上面的四個栗子,@代表 users 這個列表欄位

5.5.4 =~

  • 後面跟正則表示式,如果想提取 包含指定字元 的值,可以使用此正則: /.*指定字串.*?/i
  • i 代表大小寫不敏感

六、提取資料指定欄位的值的栗子

​ 提取 users 第一條記錄的 uuid、username 欄位的值

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

6.1 測試結果

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

七、勾選 Compute concatenation var 的栗子

7.1 JSON 提取器

7.2 測試結果

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

八、一個 JSON 提取器有多個 Jsonpath 的栗子

8.1 JSON 提取器

8.2 測試結果、

uuid1_1=6D5EDCB459F0917A98106E07D5438C58
uuid1_2=0164DC0680F84DCE40D3DD4A36640ECA
uuid1_3=079BF6BB82AFCFC7084F96AECAF0519F
uuid1_matchNr=3
uuid2_1=6D5EDCB459F0917A98106E07D5438C58
uuid2_2=0164DC0680F84DCE40D3DD4A36640ECA
uuid2_3=079BF6BB82AFCFC7084F96AECAF0519F
uuid2_matchNr=3

8.3 知識點

  • 如果有多個 Jsonpath 的時候,每個欄位都必填值,且 欄位值的數量要一致(像上圖,每個欄位都填了兩個值)
  • 勾不勾 Compute concatenation var 都行
  • 欄位值數量不一致則無法提取值