场景:在测试公司智能家居的 TCP 接口过程中发现有些 TCP 响应 body 返回的是多个不连续的 json 串,JSON 提取器使用 jsonpath 提取参数的时候默认选择了第一个 json 串,导致不能正确的提取到变量。所以尝试通过改造 JSON 提取器组件,根据关键字的方式过滤出目标 json 串再做变量提取。
响应 body 使用换行符分割,下方是多个不连续的 json 串:
{"":"","A":""}
{"":"","B":""}
{"":"","C":""}
先配置好 Ant、jdk 环境变量
打开 Eclipse 创建一个 Java 工程
右键 Java 工程,选择import-general-file system
,选中下载的 jmeter 源码文件夹导入到 Java 工程中
然后根据报错一个个解决,参考:https://jmeter.apache.org/building.html
在 Java 工程下使用命令 ant 重新构建 jmeter。如果成功则提示 build successful,失败则提示 build failed
1.先找到 JSON 提取器的 Java 源文件
2.找到对应的处理方法
3.使用 ant 构建
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串";
多个变量提取
var1,key;var2;var3
var1
、var2
、var3
表示引用变量名称,变量之间使用英文分号分割
key
表示关键字,使用该关键字来提取目标 json 串,使用英文逗号追加在变量后边
a;b;c
多个变量提取时默认值个数与变量个数必须一致(Jmeter 原有逻辑)
单个变量提取
在 JSON 提取器组件的引用变量中输入:var1,key
默认值输入框可填可不填
备注:原则上说一个 key 就足够过滤出目标 json 串来提取引用变量,所以没必要使用多个 key 的方式
结果验证
ant 构建之前,先设置好工程的编码格式(UTF-8),否则重新构建的 jmeter 面板、组件都会乱码
切勿使用 ant clean install 会把依赖的插件清除掉