Jmeter_Beanshell_使用Java處理JSON塊

版權聲明:本文爲博主原創文章,轉載請註明出處。shell


 【環境】apache

  ①Jmeter版本:3.2,JDK:1.8json

  ②前置條件:將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;)post

【思路】性能

  ①獲取請求的返回值,即Json響應;測試

    String response_data = prev.getResponseDataAsString();  //注意此處獲取到的是String類型;ui

  ②利用上一步獲取的字符串形式的JSON,結合Java處理Json的方法,將須要的鍵值提取出來;spa

    須要利用JSONObject或者JSONArray構造JSON對象。code

    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;
}

   結果以下:

相關文章
相關標籤/搜索