版權聲明:本文為博主原創文章,轉載請注明出處。
【環境】
①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對象】
①需要提取返回值中,每一個對象數組中的每一個 uuid 及 id 的鍵值:獲取JSON對象,再提取data數組內容並獲取data數組長度,最后循環提取每一個 uuid 及 id 的鍵值;備注:1個客服同時與10個客戶聊天,在聊天開始之前,需要撈取到這10個客戶的uuid(uuid)及conversationId(id);
以下代碼刪除某些操作,僅用於提取每一個uuid和id值;
import org.json.JSONObject; import org.json.JSONArray; try { String response_data = prev.getResponseDataAsString(); //獲取請求返回值。注意此處只能獲取到String類型; JSONObject data_obj = new JSONObject(response_data); //將String類型的返回值構造成JSONObject對象; JSONArray data_array = data_obj.getJSONArray("data"); //data為數組 int len = data_array.length(); //獲取data數組的長度 String strlen = Integer.toString(len); vars.put("MessageNum",strlen); //log.info(strlen); int i = 0; for(;i < len;++i) { JSONObject jsonTemp = (JSONObject)data_array.getJSONObject(i); //獲取 data[ i ] 數組對象; switch(i) { case 0: vars.put("uuid_1", jsonTemp.getString("uuid")); vars.put("conversationId_1", jsonTemp.getString("id")); break; case 1: vars.put("uuid_2", jsonTemp.getString("uuid")); vars.put("conversationId_2", jsonTemp.getString("id")); break; //..................................此處省去7次處理 case 10: vars.put("uuid_11", jsonTemp.getString("uuid")); vars.put("conversationId_11", jsonTemp.getString("id")); break; default: break; } } } catch (Throwable ex) { log.error("Failed in Beanshell", ex); throw ex; }
結果如下: