Jmeter常用獲取數據的幾種方式及調用方法

卷皮練習冊 發佈 2024-04-10T22:40:49.631617+00:00

使用jmeter使用過程中經常遇到,需要將前一個接口的返回結果作為下一個接口的入參。大部分接口的返回消息都是json格式,下面介紹最常用的正則提取器和beanshell後置處理器方式,來獲取json消息里的參數值及調用方法。

使用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},)};

關鍵字: