淺談后置處理器之JSON提取器
JMeter 的 JSON 提取器(JSON Extractor)是一個強大的后置處理器,它允許用戶從HTTP響應、數據庫查詢或其他類型的響應中提取JSON數據,并將這些數據存儲為變量,以便在后續的請求中重用。這對于需要動態處理基于JSON格式API測試的場景尤為有用。以下是對JSON提取器的詳細說明和使用教程。
使用場景
● 參數化請求:從一個API響應中提取token或其他標識符,用于后續請求的認證或數據關聯。
● 數據驅動測試:提取JSON數組中的多個值,用于遍歷測試不同的數據集。
● 驗證響應內容:檢查特定的JSON字段是否存在或其值是否符合預期。
配置步驟
添加JSON提取器
- 在你的JMeter測試計劃中,選擇一個采樣器(如HTTP請求)。
- 右鍵點擊該采樣器,選擇“添加” > “后置處理器” > “JSON 提取器”。
配置參數
JSON 提取器提供了多個配置選項,以下是關鍵參數的解釋:
● 名稱: 給這個后置處理器一個描述性的名稱,便于識別。
● Names of created variables:變量名稱
● JSON Path expressions: 輸入JSON路徑表達式,用于定位你想要提取的數據。例如$.username會提取根對象下的username字段。
● Match No. (0 for Random):
○ 0: 隨機選擇一個匹配項。
○ n: 提取第n個匹配項(n為正整數)。
○ -1: 提取所有匹配項,并以變量數組形式存儲。
● Compute concatenation var(suffix_ALL):匹配到的所有數值并保存,默認為空即可
● Default Values: 如果沒有找到匹配的JSON路徑,可以設置一個默認值。
變量命名與引用
● 變量名: 為提取的數據指定一個變量名。如果Match No.設置為-1,則應使用數組形式的變量名,如users_,這樣每個匹配項將會被命名為users_1、users_2等。
示例
假設你有一個API響應如下:
{"status": "success","data": {"userId": 12345,"username": "exampleUser"}
}
要提取username值,你可以配置JSON Extractor如下:
● JSON Path expressions: $.data.username
● Names of created variables: userNameVar
● Match No.: 1
之后,在JMeter中任何地方可以通過${userNameVar}引用提取到的用戶名。
應用實例
首先我們使用SpingBoot編寫部分測試接口代碼
@PostMapping(value = "/login",produces = "application/json;charset=UTF-8")public String authenticate(@RequestBody JSONObject request) {String validUsername = "admin";String validPassword = "password";String response = "{\"total\":2,\"data\":[{\"id\":123,\"name\":\"John Doe\",\"email\":\"johndoe@example.com\",\"phone\":\"123-456-7890\",\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"state\":\"NY\",\"zip\":\"10001\"},\"interests\":[\"sports\",\"music\",\"travel\"]},{\"id\":456,\"name\":\"Jane Smith\",\"email\":\"janesmith@example.com\",\"phone\":\"987-654-3210\",\"address\":{\"street\":\"456 Elm St\",\"city\":\"Los Angeles\",\"state\":\"CA\",\"zip\":\"90001\"},\"interests\":[\"reading\",\"cooking\",\"hiking\"]}]}";if (request.getString("username").equals(validUsername) && request.getString("password").equals(validPassword)) {return response;} else {return response;}}
我們編寫如下測試腳本
線現程組:保持默認
HTTP信息頭管理器:名稱content-type,值為application/json;charset=UTF-8
HTTP請求:協議http,服務器名稱或IP為127.0.0.1,端口設置為8091,方法為post,路徑/login,內容編碼為utf-8,消息體數據設置如下
{"username": "admin","password": "password"}
運行腳本,查看結果樹,在HTTP請求的響應數據中Response Body查看結果如下(已經美化JSON格式):
{"total": 2,"data": [{"address": {"zip": "10001","city": "New York","street": "123 Main St","state": "NY"},"phone": "123-456-7890","name": "John Doe","id": 123,"interests": ["sports","music","travel"],"email": "johndoe@example.com"},{"address": {"zip": "90001","city": "Los Angeles","street": "456 Elm St","state": "CA"},"phone": "987-654-3210","name": "Jane Smith","id": 456,"interests": ["reading","cooking","hiking"],"email": "janesmith@example.com"}]
}
情況1:返回值中提取total數據
JSON提取器中Names of created variables設置為var,JSON Path expressions設置為total或者$.total,兩種效果一致,Match No. (0 for Random)設置為-1,Default Values設置為NotFound。
運行腳本,查看結果樹中響應數據的Response Body
var_1=2
var_matchNr=1
情況2:返回值中提取address數據
JSON提取器中Names of created variables設置為var,JSON Path expressions設置為data[*].address或者$.data[*].address,兩種效果一致,Match No. (0 for Random)設置為-1,Default Values設置為NotFound。
運行腳本,查看結果樹中響應數據的Response Body
var_1={“zip”:“10001”,“state”:“NY”,“city”:“New York”,“street”:“123 Main St”}
var_2={“zip”:“90001”,“state”:“CA”,“city”:“Los Angeles”,“street”:“456 Elm St”}
var_matchNr=2
情況3:返回值中提取address數只需要上述情況2中var_1的數據
JSON提取器中Names of created variables設置為var,JSON Path expressions設置為data[0].address或者$.data[0].address,兩種效果一致,Match No. (0 for Random)設置為-1,Default Values設置為NotFound。
運行腳本,查看結果樹中響應數據的Response Body
var_1={“zip”:“10001”,“state”:“NY”,“city”:“New York”,“street”:“123 Main St”}
var_matchNr=1
情況4:返回值中提取interests的數據
JSON提取器中Names of created variables設置為var,JSON Path expressions設置為data[*].interests[*]或者$.data[*].interests[*],兩種效果一致,Match No. (0 for Random)設置為-1,Default Values設置為NotFound。
運行腳本,查看結果樹中響應數據的Response Body
var_1=sports
var_2=music
var_3=travel
var_4=reading
var_5=cooking
var_6=hiking
var_matchNr=6
情況5:返回值中提取interests的數據第一行的數據,即Sports和Reading
JSON提取器中Names of created variables設置為var,JSON Path expressions設置為data[*].interests[0]或者$.data[*].interests[0],兩種效果一致,Match No. (0 for Random)設置為-1,Default Values設置為NotFound。
運行腳本,查看結果樹中響應數據的Response Body
var_1=sports
var_2=reading
var_matchNr=2
情況6:勾選Compute concatenation var(suffix_ALL)
初勾選Compute concatenation var(suffix_ALL),其他設置跟情況5一直。
運行腳本,查看結果樹中響應數據的Response Body
var_1=sports
var_2=reading
var_ALL=sports,reading
var_matchNr=2
注意事項
● 確保JSON路徑表達式正確無誤。
● 當提取多個值時,合理設置Match No.和變量名格式,避免數據混亂。
● 對于復雜的JSON結構,深入理解JSONPath語法將大大提高提取效率。
通過以上步驟和注意事項,你應該能夠有效地使用JMeter的JSON提取器來處理和利用JSON響應數據,進而構建更加動態和強大的性能測試腳本。