我們在做jmeter接口測試的時候,有時候碰到開發沒返回數據total,只返回了一條條記錄,可是呢,我們又需要知道到底返回了多少條數據時,咋辦呢?咋辦呢?咋辦呢?
不要急,接下來,讓我們見證奇跡是如何誕生的!!!
可能有人在網上看到很多關於解析json返回數據的文章,看來看去都是一樣的,於是乎,我親測了一下,果然沒用!!!(可能是本人技術太渣,無法領悟其中的真髓)沒辦法,只能看log信息一次次試咯!終於在各種大佬的幫助下搞好了!
第一步:將fastjson-1.2.62.jar包置於jmeter的lib目錄下,並將該jar包添加到測試計划的Library中;否則會報:Typed variable declaration : Class: JSONObject not found in namespace的錯誤(保險起見,再將fastjson-1.2.62.jar包同樣置於jmeter的lib/ext目錄下,同樣將該jar包添加到測試計划的Library中)
我們再來看看要解析的數據格式
我們要獲取到item數組長度,即item下有多少條數據。
第二步:我們要獲取到這些數據,來一個接口請求,獲取一下數據,然后在接口請求下加一個后置處理器BeanShell PostProcessor。話不多說,代碼擼起來!(接口你們自己搞一個,我就不貼了)
import com.alibaba.fastjson.*;
//獲取請求的返回值
String response_data = prev.getResponseDataAsString();
//日志打印獲取請求的返回值
log.info("==============response_data=="+response_data+"=========================");
//將String類型的返回值構造成JSONObject對象
JSONObject data_obj = JSON.parse(response_data);
//日志打印data_obj值
log.info("==============data_obj=="+data_obj+"=========================");
//將data轉成JSONObject類型
JSONObject jsonData = data_obj.getJSONObject("data");
//日志打印jsonData值
log.info("==============jsonData=="+jsonData+"=========================");
//獲取作為下一個請求post的參數值item(獲取字符串)
//String item = jsonData.get("item").toString();
//獲取作為下一個請求post的參數值item(獲取JSONArray)
JSONArray item = jsonData.getJSONArray("item");
log.info("==============item=="+item+"=========================");
//獲取item字符串的長度
//int len = item.length();
//獲取item數組的長度
int len = item.size();
String itemLen = Integer.toString(len);
log.info("==============itemLen=="+itemLen+"=========================");
vars.put("itemNum",itemLen);
把上面的代碼就這樣塞到BeanShell PostProcessor進去。各位觀眾,看到沒有,我幾乎是每一行一個Log,我太難了。
第三步:執行一下,運氣好的話就會看到jmeter日志里打印出以下的日志信息了
順便說一下,代碼里最后一行vars.put("itemNum",itemLen);這個是塞一個itemNum變量到jmeter里,方便后面去調用。這樣一來,就獲取到我們想要的數據了。
划重點:BeanShell PostProcessor為啥有標紅的呢?因為網上很多的全是這樣寫的:JSONObject data_obj = new JSONObject(response_data); 結果我也這樣試了,理所當然我失敗了,報錯了,Can't find constructor: com.alibaba.fastjson.JSONObject( java.lang.String ) in class:,然后我去翻json源碼,一看就兩構造器:public JSONObject()和public JSONObject(boolean isNull),壓根兒就沒有public JSONObject(String text)這樣的構造函數,不報錯才怪勒!換個方法轉化JSONObject對象,找到了JSON.parse(String text); 這樣完美解決。