Jmeter 原始碼改造入門

onesbyones發表於2020-06-09

緣由

場景:在測試公司智慧家居的TCP介面過程中發現有些TCP響應body返回的是多個不連續的json串,JSON提取器使用jsonpath提取引數的時候預設選擇了第一個json串,導致不能正確的提取到變數。所以嘗試通過改造JSON提取器元件,根據關鍵字的方式過濾出目標json串再做變數提取。

響應body使用換行符分割,下方是多個不連續的json串:

{"":"","A":""}
{"":"","B":""}
{"":"","C":""}

工具準備

  1. Eclipse
  2. Apache Ant
  3. Jmeter原始碼包
  4. JDK1.8

環境搭建

先配置好Ant、jdk環境變數

  1. 開啟Eclipse建立一個Java工程

  2. 右鍵Java工程,選擇import-general-file system,選中下載的jmeter原始碼資料夾匯入到Java工程中

  3. 然後根據報錯一個個解決,參考:https://jmeter.apache.org/building.html

  4. 在Java工程下使用命令ant重新構建jmeter。如果成功則提示build successful,失敗則提示build failed

改造方法

1.先找到JSON提取器的Java原始檔

2.找到對應的處理方法

3.使用ant構建

變數提取寫法

第一種:使用Beanshell斷言元件

import com.alibaba.fastjson.*;


String responseStr = prev.getResponseDataAsString();
log.info("獲取到的responseStr: " + responseStr);

String[] strArray = responseStr.split("\\n");

for (String str : strArray) {
JSONObject responseJsonObject = JSONObject.parseObject(str);
JSONObject contentJsonObject = responseJsonObject.getJSONObject("content");
String contentStr = contentJsonObject.getString("method");
if(contentStr.equalsIgnoreCase("這裡輸入關鍵字")){
String msg = contentJsonObject.getString("msg");
int code = contentJsonObject.getIntValue("code");
JSONObject resultJsonObject = contentJsonObject.getJSONObject("result");
vars.put("router_id", resultJsonObject.getString("router_id"));
if( !msg.equalsIgnoreCase("OK") || !(code == 0) ){
Failure = true;
FailureMessage = "msg的值不是O K或者 code的值不是0";
}else{
FailureMessage = "msg、code都是期望值";
return ;
}
}
}

Failure = true;
FailureMessage = "沒有找到包含 關鍵字的json串";

第二種:使用改造的方式提取變數

多個變數提取

  1. 在JSON提取器元件的引用變數中輸入: var1,key;var2;var3

var1var2var3表示引用變數名稱,變數之間使用英文分號分割

key表示關鍵字,使用該關鍵字來提取目標json串,使用英文逗號追加在變數後邊

  1. 在JSON提取器元件的預設值輸入框中輸入:a;b;c

多個變數提取時預設值個數與變數個數必須一致(Jmeter原有邏輯)

單個變數提取

  1. 在JSON提取器元件的引用變數中輸入:var1,key

  2. 預設值輸入框可填可不填

備註:原則上說一個key就足夠過濾出目標json串來提取引用變數,所以沒必要使用多個key的方式

結果驗證

注意事項

  1. ant構建之前,先設定好工程的編碼格式(UTF-8),否則重新構建的jmeter皮膚、元件都會亂碼

  2. 切勿使用ant clean install 會把依賴的外掛清除掉

相關文章