Jmeter_Beanshell_使用Java處理JSON塊
【環境】
①Jmeter版本:3.2,JDK:1.8
②前置條件:將json.jar包置於..\apache-jmeter-3.2\lib\下,並將該jar包新增到測試計劃的Library中;否則會報:Typed variable declaration : Class: JSONObject not found in namespace的錯誤;
③處理器:Beanshell處理器,import org.json.*;(一般習慣使用到什麼import什麼,如:import org.json.JSONObject、import org.json.JSONAarry;)
【思路】
①獲取請求的返回值,即Json響應;
String response_data = prev.getResponseDataAsString(); //注意此處獲取到的是String型別;
②利用上一步獲取的字串形式的JSON,結合Java處理Json的方法,將需要的鍵值提取出來;
需要利用JSONObject或者JSONArray構造JSON物件。
JSONObject JsonData = new JSONObject(StrData);
③替換某些需要變更的欄位值,再將新的JSON處理為Jmeter的引數,用於下一個請求的引數化值;
JsonData.put("status", "CLOSED");
String NewData = JsonData.toString();
vars.put("NewStrData",NewData);
【示例1-----JSONObject物件】
①獲取到JSON物件,需要提取其中的data物件,並更換“issueHandleType”欄位的值為“CLOSE”,再構造成引數字串;
A請求後新增BeanShell後置處理器,程式碼如下:
import org.json.JSONObject; String response_data = prev.getResponseDataAsString();//獲取請求返回值。注意此處只能獲取到String型別;log.info(response_data); JSONObject data_obj = new JSONObject(response_data); //將String型別的返回值構造成JSONObject物件,才可使用Java物件的方法對其進行操作; String StrData = data_obj.get("data").toString(); //獲取作為下一個請求post的引數值data; log.info(StrData); //Log中顯示的欄位順序會與“response_data”中的欄位順序有差異,JSON串的正確與否無關欄位順序; JSONObject JsonData = new JSONObject(StrData); //將獲取到的“data”字串構造成JSON物件; JsonData.put("issueHandleType", "CLOSE"); //更新issueHandleType的json值; JsonData.put("solution", "2017_解決方案_效能測試"); JsonData.put("status", "CLOSED"); JsonData.put("handleType", "CLOSE"); JsonData.put("complaintTypeSecondCode", "URGE"); JsonData.put("complaintTypeSecondName", "催件"); JsonData.put("lastUpdateTime", "${timestamp}"); JsonData.put("lastUpdator", "${UserName}"); JsonData.put("lastUpdatorName", "${UserName}"); String NewData = JsonData.toString(); //將JSON物件儲存為String型別,Jmeter中的請求的引數均以字串的形式傳遞; vars.put("NewStrData",NewData); log.info(NewData);
請求的響應結果如下:
【示例2-----JSONArray物件】