若是你想從頭學習Jmeter,能夠看看這個系列的文章哦php
https://www.cnblogs.com/poloyy/category/1746599.htmlhtml
有了 JSON 提取器爲啥還要用正則提取器?
- JSON 提取器只針對接口返回的響應內容
- 若是想提取的是響應頭、請求頭的值,而非響應內容的值呢?
- 這個時候正則提取器的做用就出來了,它能夠提取請求任一部分的值
需知
- 正則表達式不少內容,在這篇文章中不會展開詳細說的哦,主要仍是說提取器的使用
- 想詳細學習正則表達式能夠看這篇文章:待補充
正則提取器
咱們經過實際栗子去講述理論知識點正則表達式
正則提取器界面介紹
字段含義
字段 | 含義 |
Apply to | 應用範圍,選默認的 main sample only 就好了 |
Field to check | 可提取的字段api |
Names of created variables |
|
Regular Expression | 正則表達式數組 |
Template | 從找到的匹配項中建立字符串的模板 |
Match No.(0 for Random) |
|
Default Value |
|
Use empty default value | 勾選後,提取不到值時,則返回空字符串dom |
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、uuidui
提取 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