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

Jmeter系列(21)- 詳解正則提取器

一、有了 JSON 提取器為啥還要用正則提取器?

  • JSON 提取器 針對 介面返回的響應內容
  • 如果想提取的是響應頭、請求頭的值,而非響應內容的值呢?
  • 這個時候正則提取器的作用就出來了,它可以提取請求任一部分的值

二、需知

三、正則提取器

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

四、正則提取器介面介紹

4.1 欄位含義

欄位 含義
Apply to 應用範圍,選預設的 main sample only 就行了
Field to check 可提取的欄位
Names of created variables 接收提取值的變數名
必傳
Regular Expression 正則表示式
Template 從找到的匹配項中建立字串的模板
Match No.(0 for Random) 取第幾個值
0:隨機,預設
-1:所有
1:第一個值
非必傳
Default Value 預設值,匹配不到值的時候取該值
非必傳
Use empty default value 勾選後,提取不到值時,則返回空字串

4.2 Template

  • 如果 一條 正則表示式有 多個提取結果,則提取結果是陣列形式
  • 模板 \(1\)
    \(2\).....表示把解析到的第幾個值賦給變數,從 1 開始匹配
  • \(0\) 表示整個表示式匹配的內容(後續具體看栗子)
  • 若只有一個結果,只能是\(1\)

4.3 Field to check

屬性 含義
Body 響應體,不包括響應頭;最常用
Body (unescaped) 響應體,替換了所有HTML轉義符;不建議使用
Body as a Document 從不同型別的檔案中提取文字;影響效能
Request Headers 請求頭
Response Headers 響應頭
URL URL
Response Code 響應碼
Response Message 響應資訊

4.3.1 Body

4.3.2 Request Headers

4.3.3 Response Headers

4.3.4 URL

4.3.5 Response Code、Message

五、入門例子

以這個地址的介面來完成 JSON 提取器的實戰例子

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

5.1 測試計劃樹結構

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

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

5.2.1 登入介面響應

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

5.2.2 提取 token

5.2.3 提取 uuid

5.2.4 其他介面呼叫 token、uuid

5.2.5 知識點

  • 提其他介面可以通過 ${var} 這種格式,來獲取提取到的值
  • ( ) 裡面寫匹配規則,用於解析正則表示式
  • .*? 表示匹配任意長度的任意字元,這也是最常用的正則表示式
  • 一般 (.+?) (.*?) 能夠滿足我們 80% 的使用場景

一般正則表示式都可以寫成下面兩種

  • 左邊界(.+?)右邊界
  • 左邊界(.*?)右邊界

六、舉更多栗子前的一些話

  • 上面講的是 使用正則提取器時的一個流程,也是實際工作中最簡單的栗子
  • 在實際專案中,我們可能會出現一條正則表示式有多個提取結果的情況

6.1 JSON 字串

下面的栗子都以這個 JSON 字串為基礎,從裡面提取結果

這 JSON 字串也是某個介面的響應內容,貨真價實,感興趣也可以自己玩一玩:http://api.yesapi.cn/docs-api-App.User.GetList.html

{
    "ret": 200,
    "msg": "V2.5.1 YesApi App.User.GetList",
    "data": {
        "total": 4,
        "err_msg": "",
        "err_code": 0,
        "users": [
            {
                "role": "user",
                "status_desc": "正常",
                "reg_time": "2020-06-22 20:45:05",
                "role_desc": "普通會員",
                "ext_info": {
                    "yesapi_nickname": "",
                    "yesapi_points": 0
                },
                "uuid": "0564CE592B4CE914365D8922F6FC4CEC",
                "username": "luojunjiess286",
                "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": "luojunjiessa",
                "status": 0
            },
            {
                "role": "admin",
                "status_desc": "正常",
                "reg_time": "2020-03-23 22:48:32",
                "role_desc": "管理員",
                "ext_info": {
                    "yesapi_nickname": "",
                    "yesapi_points": 0
                    "yesapi_reg_source": ""
                },
                "uuid": "079BF6BB82AFCFC7084F96AECAF0519F",
                "username": "luojunjiess",
                "status": 0
            }
        ]
    }
}

七、一條正則表示式只有一個提取結果的例子

7.1 什麼叫只有一個提取結果

就是正則表示式裡只有一個 ( ) ,且 Match No. 不是 -1

7.2 未填寫模板

7.2.1 提取器

7.2.2 測試結果

uuid1=
uuid1_g=1
uuid1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid1_g1=0564CE592B4CE914365D8922F6FC4CEC

7.2.3 知識點

如果正則匹配到值,但是沒有填模板,則返回

7.3 \(0\)

7.3.1 提取器

7.3.2 測試結果

uuid2="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid2_g=1
uuid2_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid2_g1=0564CE592B4CE914365D8922F6FC4CEC

7.3.3 知識點

  • $0$ 模板其實返回的就是 uuid2_g0 的值
  • 返回了整個正則表示式,不只是 ( ) 內匹配到的值

7.4 \(1\)

7.4.1 提取器

7.4.2 測試結果

uuid3=0564CE592B4CE914365D8922F6FC4CEC
uuid3_g=1
uuid3_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid3_g1=0564CE592B4CE914365D8922F6FC4CEC

7.4.3 知識點

  • $1$ 模板其實返回的就是 uuid2_g1 的值
  • 僅返回 ( ) 內匹配到的值

7.5 \(2\)

7.5.1 提取器

7.5.2 測試結果

uuid4=null
uuid4_g=1
uuid4_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid4_g1=0564CE592B4CE914365D8922F6FC4CEC

7.5.3 知識點

$2$ 模板並不存在,其實就是 uuid4_g2 變數不存在,即使勾了 使用空預設值,也返回 null,

7.6 總結

  • 其實 uuid 在 JSON 字串中有 三個 可匹配到的值,如果不填寫匹配數字 Match No. ,則會 隨機 取一個 uuid 並返回
  • 像上述的幾個栗子,都填了 1 ,所以都返回了 第一個匹配到的 uuid

八、一條正則表示式有多個提取結果的例子

8.1 什麼叫有多個提取結果

有兩種情況

  • 一條表示式有多個 ( )
  • 一個 ( ) 匹配到多個值,且 Match No 填了 -1

8.2 一個 ( ) 匹配到多個值

8.2.1 提取器

8.2.2 測試結果

手動分成四部分

uuid1_1=0564CE592B4CE914365D8922F6FC4CEC
uuid1_1_g=1
uuid1_1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid1_1_g1=0564CE592B4CE914365D8922F6FC4CEC

uuid1_2=0164DC0680F84DCE40D3DD4A36640ECA
uuid1_2_g=1
uuid1_2_g0="uuid":"0164DC0680F84DCE40D3DD4A36640ECA"
uuid1_2_g1=0164DC0680F84DCE40D3DD4A36640ECA

uuid1_3=079BF6BB82AFCFC7084F96AECAF0519F
uuid1_3_g=1
uuid1_3_g0="uuid":"079BF6BB82AFCFC7084F96AECAF0519F"
uuid1_3_g1=079BF6BB82AFCFC7084F96AECAF0519F

uuid1_matchNr=3

8.2.3 知識點

  • 一個 ( ) 匹配到多個值的場景 ,一般會結合 ForEach控制器,可以迴圈將提取到的值賦予到 HTTP 請求中
  • 可以看看下圖的小例子,這裡不展開講,後面會再詳細講解

8.2.4 結構樹 + ForEach 控制器

8.2.5 檢視結果數

8.3 一條表示式有多個( ),且模板為空

8.3.1 提取器

8.3.2 測試結果

info1=
info1_g=2
info1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info1_g1=0564CE592B4CE914365D8922F6FC4CEC
info1_g2=luojunjiess286

九、一條表示式有多個( ),且只有一個模板

9.1 提取器

9.2 測試結果

info2=0564CE592B4CE914365D8922F6FC4CEC
info2_g=2
info2_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info2_g1=0564CE592B4CE914365D8922F6FC4CEC
info2_g2=luojunjiess286

9.3 知識點info2 拿的就是 info2_g1 的值

$1$ 獲取的是第一個 ( ) 匹配到的值, $2$ 獲取的是第二個 ( ) 匹配到的值,以此類推

十、一條表示式有多個( ),且有兩個模板

10.1 提取器

10.2 測試結果

info3=0564CE592B4CE914365D8922F6FC4CECluojunjiess286
info3_g=2
info3_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info3_g1=0564CE592B4CE914365D8922F6FC4CEC
info3_g2=luojunjiess286

info4=0564CE592B4CE914365D8922F6FC4CEC,luojunjiess286
info4_g=2
info4_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info4_g1=0564CE592B4CE914365D8922F6FC4CEC
info4_g2=luojunjiess286

十一、正則表示式中有多個 ( ) 時的總結

  • 如果其中一個 ( ) 匹配不到元素,那也無法獲取到值
  • 引用名稱、匹配數字、預設值三個欄位也只需要填一個值即可,不需要跟 ( ) 的數量一致
  • 多個模板( $1$$2$ )的時候,可以用空格``、, 、. 、 - `連線模板,最終會顯示在變數上,如:info4