Jmeter系列(27)- 詳解正則提取器
阿新 • • 發佈:2020-06-23
如果你想從頭學習Jmeter,可以看看這個系列的文章哦
https://www.cnblogs.com/poloyy/category/1746599.html
有了 JSON 提取器為啥還要用正則提取器?
- JSON 提取器只針對介面返回的響應內容
- 如果想提取的是響應頭、請求頭的值,而非響應內容的值呢?
- 這個時候正則提取器的作用就出來了,它可以提取請求任一部分的值
需知
- 正則表示式很多內容,在這篇文章中不會展開詳細說的哦,主要還是說提取器的使用
- 想詳細學習正則表示式可以看這篇文章:待補充
正則提取器
我們通過實際栗子去講述理論知識點
正則提取器介面介紹
欄位含義
欄位 | 含義 |
Apply to | 應用範圍,選預設的 main sample only 就行了 |
Field to check |
可提取的欄位 |
Namesofcreatedvariables |
|
Regular Expression |
正則表示式 |
Template | 從找到的匹配項中建立字串的模板 |
MatchNo.(0 for Random) |
|
DefaultValue |
|
Use empty default value |
勾選後,提取不到值時,則返回空字串 |
Template
- 如果一條正則表示式有多個提取結果,則提取結果是陣列形式
- 模板 $1$、$2$.....表示把解析到的第幾個值賦給變數,從 1 開始匹配
- $0$ 表示整個表示式匹配的內容(後續具體看栗子)
- 若只有一個結果,只能是$1$
Field to check
屬性 | 含義 |
Body | 響應體,不包括響應頭;最常用 |
Body (unescaped) | 響應體,替換了所有HTML轉義符;不建議使用 |
Body as a Document | 從不同型別的檔案中提取文字;影響效能 |
Request Headers | 請求頭 |
Response Headers | 響應頭 |
URL | URL |
Response Code | 響應碼 |
Response Message | 響應資訊 |
Body
Request Headers
Response Headers
URL
Response Code、Message
入門栗子
栗子的前提
這個栗子,我都會以這個地址的介面來完成 JSON 提取器的實戰慄子,大家可以註冊個賬號玩一玩哦
http://api.yesapi.cn/docs.php?keyword=%E4%BC%9A%E5%91%98&channel=api
測試計劃樹結構
下面多個栗子都以這個測試計劃為基礎哦
提取某個特定的值的栗子
登入介面響應
登入是執行其他介面的前置介面,所以要獲取使用者登入後的token、uuid
提取 token
提取 uuid
其他介面呼叫 token、uuid
知識點
- 提其他介面可以通過${var}這種格式,來獲取提取到的值
- ( )裡面寫匹配規則,用於解析正則表示式
- .*?表示匹配任意長度的任意字元,這也是最常用的正則表示式
- 一般(.+?)和(.*?)能夠滿足我們 80%的使用場景
一般正則表示式都可以寫成下面兩種
- 左邊界(.+?)右邊界
- 左邊界(.*?)右邊界
舉更多栗子前的一些話
- 上面講的是使用正則提取器時的一個流程,也是實際工作中最簡單的栗子
- 在實際專案中,我們可能會出現一條正則表示式有多個提取結果的情況
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
}
]
}
}
一條正則表示式只有一個提取結果的栗子
什麼叫只有一個提取結果
就是正則表示式裡只有一個( ),且 Match No.不是 -1
未填寫模板
提取器
測試結果
uuid1=
uuid1_g=1
uuid1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid1_g1=0564CE592B4CE914365D8922F6FC4CEC
知識點
如果正則匹配到值,但是沒有填模板,則返回空
$0$
提取器
測試結果
uuid2="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid2_g=1
uuid2_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid2_g1=0564CE592B4CE914365D8922F6FC4CEC
知識點
- $0$模板其實返回的就是uuid2_g0的值
- 返回了整個正則表示式,不只是( )內匹配到的值
$1$
提取器
測試結果
uuid3=0564CE592B4CE914365D8922F6FC4CEC
uuid3_g=1
uuid3_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid3_g1=0564CE592B4CE914365D8922F6FC4CEC
知識點
- $1$模板其實返回的就是uuid2_g1的值
- 僅返回( )內匹配到的值
$2$
提取器
測試結果
uuid4=null
uuid4_g=1
uuid4_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid4_g1=0564CE592B4CE914365D8922F6FC4CEC
知識點
$2$模板並不存在,其實就是uuid4_g2變數不存在,即使勾了使用空預設值,也返回 null,
總結
- 其實 uuid 在 JSON 字串中有三個可匹配到的值,如果不填寫匹配數字Match No.,則會隨機取一個 uuid 並返回
- 像上述的幾個栗子,都填了 1 ,所以都返回了第一個匹配到的 uuid
一條正則表示式有多個提取結果的栗子
什麼叫有多個提取結果
有兩種情況
- 一條表示式有多個( )
- 一個( )匹配到多個值,且Match No填了 -1
一個 ( ) 匹配到多個值
提取器
測試結果
手動分成四部分
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
知識點
- 一個 ( ) 匹配到多個值的場景 ,一般會結合 ForEach控制器,可以迴圈將提取到的值賦予到 HTTP 請求中
- 可以看看下圖的小栗子,這裡不展開講,後面會再詳細講解
結構樹 + ForEach 控制器
檢視結果樹
一條表示式有多個( ),且模板為空
提取器
測試結果
info1=
info1_g=2
info1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info1_g1=0564CE592B4CE914365D8922F6FC4CEC
info1_g2=luojunjiess286
一條表示式有多個( ),且只有一個模板
提取器
測試結果
info2=0564CE592B4CE914365D8922F6FC4CEC
info2_g=2
info2_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info2_g1=0564CE592B4CE914365D8922F6FC4CEC
info2_g2=luojunjiess286
知識點
- info2 拿的就是 info2_g1 的值
- $1$獲取的是第一個( )匹配到的值,$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