1. 程式人生 > >Jmeter自動化測試常見的問題解決方案彙總2018.12.21

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