使用jmeter使用過程中經常遇到,需要將前一個接口的返回結果作為下一個接口的入參。大部分接口的返回消息都是JSON格式,下面介紹最常用的正則提取器和beanshell後置處理器方式,來獲取json消息里的參數值及調用方法。
本文以登錄認證接口為例,取出刷新頁面後的refresh_token數據,給後續的接口使用。
{
"token":"12345555";
"refresh_token":"ahdfkajfkaklfalhfakldhf";
}
jemter獲取數據
方法一:後置處理器-正則提取器
引用名稱:自定義一個變量名稱,用來存放提取值
1、正則表達式:舉例匹配"refresh_token",使用 「(.*?)」 正則表達式,即雙引號里所有的、任何字符都匹配到。可以用在線正則表達式測試工具,來驗證表達式是否正確。
():括起來的部分就是要提取的內容
.:匹配任意單個字符
*:匹配0-n次
?:匹配0次或1次
2、模板:正則表達式中若包含多個表達式,每一個表達式可視為一個模板,用$n$表示。需要第幾個模板數據,n就寫幾。
3、匹配數字:選擇正則表達式匹配到的結果,0表示隨機取值,1表示選擇匹配到的第1個值,通常情況下填0。
4、預設值:當表達式匹配不到值時設定的默認值
方法二:後置處理器-beanshell後置處理器
1、數據提取常用語法說明:
import org.json.JSONObject;
import org.json.JSONArray;
String response = prev.getResponseDataAsString(); //取出接口返回消息
JSONObject jsonStr = new JSONObject(response); //將返回信息放進json對象里
String refresh_token_value = jsonStr.getString("refresh_token"); //因返回消息的refresh_token沒有嵌套在外層中,故可直接取值
vars.put("refresh_token", refresh_token_value); //把取到的"refresh_token"值放進jmeter變量中,其中refresh_token是後續接口要引用的變量名稱,refresh_token_value是腳本里用來取值的變量名稱
註:如果要取的參數還有外層,則需要要一層一層取
2、獲取json中對象&數組實例:
(1){}:是對象,用getJSONObject方法
(2)[]:是數組,用getJSONArray方法
舉例:假設json內容如下,要取user2的refresh_token數據
{
"login":{
"user":[
{
"name":"user1",
"token":{
"access_token":"a",
"refresh_token":"b"
}
},
{
"name":"user2",
"token":{
"access_token":"c",
"refresh_token":"d"
}
}
]
}
}
獲取方法:先進到json最外層login,再進到user,然後進到user數組中的第二個值,即name為user2的對象,再進到token對象,最後取refresh_token數據。
import org.json.JSONObject;
import org.json.JSONArray;
String response = prev.getResponseDataAsString(); //取出接口返回消息
JSONObject jsonstring = new JSONObject(response); //將返回信息放進json對象里
JSONObject login_obj = jsonstring.getJSONObject("login"); //先找到第一層login,因login後面是{},所以login的值是一個對象,用getJSONObject方法取
JSONArray user_arr = login_obj.getJSONArray("user"); //再找第二層user,因後面是[],所以user的值是一個數組,用getJSONArray方法取
JSONObject user2_obj = user_arr.getJSONObject(1); //再根據下標取user數組裡的值,user2對應的下標是1(下標是從0開始),整個user2是用{}對象包起來的,故用getJSONObject方法取
JSONObject token_obj = user2_obj.getJSONObject("token"); //再根據鍵名token取值,後面是對象{},故用getJSONObject方法取
String refresh_token = token_obj.getString("refresh_token"); //refresh_token所在的層,直接getString取值
PS:熟練的話,上述操作可以一行直接寫完
/String refresh_token = jsonstring.getJSONObject("login").getJSONArray("user").getJSONObject(1).getJSONObject("token").getString("refresh_token");
vars.put("refresh_token",refresh_token); //vars.put方法把取到的refresh_token值放進jmeter參數refresh_token中
獲取數據引用方法
場景一:同一個線程組下的接口調用
直接用${變量名}引用,舉例:${refresh_token}
場景二:不同的線程組下的接口調用
(1)在引用時加一個方法,寫成${__property(refresh_token)}
(2)在前一個接口中把變量變成全局變量,再去跨線程組使用。即在前一個接口中寫一個beanshell後置處理器,代碼: ${__setProperty(refresh_token,${refresh_token},)};