BeanShell是使用Java语法的一套脚本语言,在JMeter的多种组件中都有BeanShell的身影,如:
通过BeanShell可以对请求数据、响应数据或环境变量进行更加灵活的处理和判断。
Beanshell有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互,比如:
log.debu("调试信息")
log.info("响应状态码" + ResponseCode)
log.warn("警告信息")
log.error("出错信息")
ResponseCode:响应状态码(String类型)
ResponseHeaders:响应头(String类型)
prev:获取当前请求结果
?
prew.getResponseDataAsString():获取响应体数据(String类型)
prew.getResponseCode():获取状态码(同ResponseCode,String类型)
vars: 操作jmeter变量
String var1 = vars.get("变量名"):获取变量的值(假设为String类型)
vars.put("变量名", 变量值):设置变量值
props: 操作JMeter属性
props.get(String,String) 可以获取Jmeter中已经生成的属性
props.put(String,String) 可以创建和更新Jmeter属性
ctx:获取当前线程上下文数据(可获取所有信息)
ctx.getVariables("变量名"):获取变量值(同vars.get())
ctx.setVariables("变量名", "变量值"):设置变量(同vars.put())
ctx.getProperties("属性名"):获取属性值(同props.get())
ctx.setProperties("属性名","属性值"):设置属性(同props.put())
ctx.getPreviousResult():获取当前请求结果同(prev)
ctx.getCurrentSampler():获取当前采样器
ctx.getPreviousSampler():获取前一采样器
ctx.getThreadNum():获取线程数
ctx.getThreadGroup():获取线程组
ctx. getThread():获取当前线程
ctx.getEngine():获取引擎
ctx.isSamplingStarted():判断采样器是否启动
ctx.isRecording():判断是否开启录制
ctx.getSamplerContext():获取采样器山下文数据
BeanShell断言中可以通过ResponseCode、ResponseHeaders及pre.getResponseDataAsString()来分别获得String格式的响应状态码、响应头、响应体数据,结合if判断通过变量Failure=false或Failure=true来设置断言是否通过,当设置Failure=true时,还可以设置FailureMessage来设置失败原因。
状态码断言
Copy//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){
Failure=false;
}
else{
Failure=true;
FailureMessage="响应状态码非200"; //指定失败原因
}
?
注:字符串只能使用双引号,字符串相等要使用"".equals("")
Copy//获取响应数据Stringresponse= prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含if(response.contains("登录成功")){
Failure=false;
}
else{
Failure=true;
FailureMessage="响应数据不包含登录成功";
}
将String类型的响应体转为JSON对象并操作需要额外的jar包,可以使用org.json或gson,下载地址如下:
以json.jar为例,下载后将其放入JMeter/lib目录下,重启JMeter,添加BeanShell断言,如下:?
Copy//JSON响应断言import org.json.*; //导入org.json包Stringresponse= prev.getResponseDataAsString(); //获取响应数据JSONObjectresponseJson=newJSONObject(response); //转为JSON对象Stringmessage= responseJson.getString("message");
log.info("响应message字段:" + message);
if(message.equals("成功")){
Failure=false;
}
else{
Failure=true;
FailureMessage="响应message字段非成功";
}
?
JSONObject对象除了getString()方法外,还支持
响应头原本为String类型,可以通过分割遍历组装成Map类型来提取响应头中的项
Copyimport java.util.HashMap;
import java.util.Map;
//将字符串用换行符 截取为adc数组
String [] headersList = ResponseHeaders.split("\n");
MapheadersMap=newHashMap(); //创建HashMap来从新组装headersfor(int i=1;i<headersList.length;i++){
String [] itemList=headersList[i].split(": "); // 将每一条Headerr项按冒号分割
headersMap.put((itemList[0]), itemList[1]); // 分键值放入HashMap
}
StringcontentType= headersMap.get("Content-Type"); // 提取相应项
log.info("响应Content-Type:" + contentType)
?
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取?
?