Jmeter自動化測試常見的問題解決方案彙總2018.12.21
一、如何解決response內容中文亂碼問題?
解決方案:新增一個BeanShell PreProcessor,然後在Script程式碼區域新增:prev.setDataEncoding("utf-8");
如圖:
二、如何提取response中json格式的內容?
解決方案:在請求Samper,新增一個後置處理器(Json提取器)。
格式:$.data.report.reportCode
data代表父節點,report代表子節點,reportCode代表子節點下面的節點,用點來一層一層定位。
例子:
三、關於BeanShell引數傳遞如何使用?
解決方案:右鍵新增一個BeanShell PostProcessor, 將前面提取出來的引數,以java程式碼傳入到嵌入的指令碼中。
程式碼:String reportCode = vars.get("reportCode");
例子:
四、如何使用BeanShell處理response 中json格式的內容。
解決方案:
步驟1:新增一個json.jar 包。下載地址:https://mvnrepository.com/artifact/org.json/json/20180813
步驟2:將json.jar包新增到D:\apache-jmeter-2.13\lib\ext 和 D:\apache-jmeter-2.13\lib 目錄中
步驟3:在測試計劃中新增json.jar 包,介面最下面,Add directory or jar to classpath
步驟4: 重啟jmeter
步驟5:新增一個BeanShell PostProcessor,使用java程式碼解析json,
程式碼例子:
import org.json.*; //獲取獲取請求的返回值 String response_data = prev.getResponseDataAsString(); //日誌列印獲取請求的返回值 //log.info(response_data); //將String型別的返回值構造成JSONObject物件 JSONObject data_obj = new JSONObject(response_data); //獲取data裡面的內容String list_str = data_obj.get("data").toString(); //JSONArray list_str = data_obj.getJSONArray("data"); //將data裡面的內容轉成jsonObject JSONObject jsonTemp = new JSONObject(list_str); //得到answer裡面的內容 JSONArray answer_obj = (JSONArray)jsonTemp.get("answer"); //log.info(answer_obj.get(0).toString()); //宣告一個list陣列用於存放拼接answer裡面的內容 List answerList = new ArrayList(); //拼接answer數組裡面每一個內容變成一個["*","*","*"]格式的引數 for (int i=0; i<answer_obj.length(); i++){ JSONArray answer_arry = (JSONArray)answer_obj.get(i); //log.info(answer_arry.get(0).toString()); answerList.add("\""+ answer_arry.get(0).toString() + "\""); } log.info(answerList.toString()); String trueAnswerList = answerList.toString(); vars.put("trueAnswerStr",trueAnswerList);
五、如何將從response得到的資料回寫到csv,並且可以追加
解決方案:在請求samper ,新增一個BeanShell PostProcessor
程式碼:
String filePath = "D:/apache-jmeter-2.13/reportCodeData.csv"; BufferedOutputStream bos = null; FileOutputStream fos = null; File file = null; String reportCode = vars.get("reportCode"); BufferedWriter out = null; try { out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(filePath, true))); out.write(reportCode +"\r\n"); } catch (Exception e) { e.printStackTrace(); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } }
六、if控制器,處理判斷response中的引數
解決方案:將引數提取出來然後判斷
程式碼:"${topicFinished}"=="false"
例子:
七、使用正則處理response
解決方案:新增一個BeanShell Sampler,裡面使用java程式碼將提取出來的引數重新處理
程式碼:
import java.util.regex.*; import java.util.*; String tempString = vars.get("SelectAnswer"); //SelectAnswer = "[[\"*\"],[\"*\"],[\"*\"]]"; String[] array = tempString.split(","); List templist = new ArrayList(); for(int i = 0; i < array.length; i++){ //正則雙引號中間的所有內容 String pattern = "\"(.*?)\""; //建立Patten物件 Pattern r = Pattern.compile(pattern); //建立mather物件 Matcher m = r.matcher(array[i]); if(m.find()){ templist.add(m.group(0)); } } String exceptValue = templist.toString();//String exceptValue = "[\"*\",\"*\",\"*\"]"; vars.put("newSelectAnswer",exceptValue);