JMeter中的BeanShell断言,可以使用BeanShell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用BeanShell语。
Beanshell是一种类似JAVA的脚本语言,通过BeanShell可以对请求数据、响应数据或环境变量进行更加灵活的处理和判断。还可以直接调用外部的JAR包,例如:可以直接引入现成的第三方JSON解析包来使用。
在JMeter的多种组件中都有BeanShell的身影,如下:
在JMeter运行的流程控制中,BeanShell出现的位置,如下图所示:
Beanshell有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互,
例如:
log.debu(“调试信息”)
log.info(“响应状态码” + ResponseCode)
log.warn(“警告信息”)
log.error(“出错信息”)
prew.getResponseDataAsString():获取响应体数据(String类型)。
prew.getResponseCode():获取状态码(同ResponseCode,String类型)。
String var1 = vars.get(“变量名”):获取变量的值(假设为String类型)。
vars.put(“变量名”, 变量值):设置变量值。
props.get(String,String) 可以获取JMeter中已经生成的属性。
props.put(String,String)可以创建和更新JMeter属性。
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():获取采样器山下文数据。
提示:ctx详细API可参考:JMeter上下文
添加BeanShell断言组件操作:选中“取样器”右键 —> 添加 —> 断言 —> BeanShell断言。
界面如下图所示:
BeanShell断言组件的详细说明:
BeanShell断言中可以通过ResponseCode、ResponseHeaders及pre.getResponseDataAsString()来分别获得String格式的响应状态码、响应头、响应体数据。结合if判断,通过变量Failure=false或Failure=true来设置断言是否通过。当设置Failure=true时,还可以设置FailureMessage来设置失败原因。
我们以一个登陆接口,来演示BeanShell断言组件的应用。
(1)测试计划内包含的元件
添加元件操作步骤:
1、创建测试计划。
2、创建线程组:选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组。
3、在线程组里面,添加取样器“HTTP请求”组件:选中“线程组”右键 —> 添加 —> 取样器 —> HTTP请求。
4、在取样器下,添加断言“BeanShell断言”组件:选中“取样器”右键 —> 添加 —> 断言 —> BeanShell断言。
5、在取样器下,添加监听器“断言结果”组件:选中“取样器”右键 —> 添加 —> 监听器 —> 断言结果。
6、在线程组里面,添加监听器“察看结果树”组件:查看结果,选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树。
最终测试计划中的元件如下:
点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。
(2)登陆接口请求界面内容
标准的Post请求,填写请求的基本信息和参数即可。
编写内容如下:
(3)BeanShell断言界面内容
我把只要把自己编写的BeanShell代码,复制到Script (see below for variables that are defined)下的输入框即可。
如果需要进行模拟压力测试的时候,可以勾选上Reset bsh.Interpreter before each call选项。我们这里不用。
编辑好的界面,如下图所示:
说明:
1)状态码断言代码:
//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){
Failure=false; // 表示断言成功
}
else{
Failure=true; // 表示断言失败
FailureMessage="响应状态码非200"; // 自定义的失败信息
}
注:字符串只能使用双引号,字符串相等要使用" “.equals(” ")表达式。
2)响应体包含特定内容断言代码:
//获取响应数据
String response = prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含
if(response.contains("登录成功")){
Failure=false; // 表示断言成功
}
else{
Failure=true; // 表示断言失败
FailureMessage="响应数据不包含登录成功";
}
(4)查看运行结果
我们在察看结果树组件中,观察脚本运行之后的结果。
如果断言正确,和正常发送请求一样,如下图:
如果断言失败,则会出现断言失败的提示,如下图所示:
(5)断言结果组件说明
也添加断言结果监听器,通过断言结果组件来判断断言是否通过。
如下图所示:
说明:
(1)JSON响应体字段提取及断言
将String类型的响应体转为JSON对象并操作需要额外的JAR包,可以使用org.json.jar或gson.jar。
以json.jar为例,下载后将其放入JMeter/lib目录下,重启JMeter,添加BeanShell断言代码,如下:
//JSON响应断言
import org.json.*; //导入org.json包
String response = prev.getResponseDataAsString(); //获取响应数据
JSONObject responseJson = new JSONObject(response); //转为JSON对象
String message = responseJson.getString("message");
log.info("响应message字段:" + message);
if(message.equals("成功")){
Failure=false;
}
else{
Failure=true;
FailureMessage="响应message字段非成功";
}
JSONObject对象除了getString()方法外,还支持:
(2)响应头解析
响应头原本为String类型,可以通过分割遍历组装成Map类型来提取响应头中的项
Copyimport java.util.HashMap;
import java.util.Map;
//将字符串用换行符 截取为adc数组
String [] headersList = ResponseHeaders.split("\n");
Map headersMap = new HashMap(); //创建HashMap来从新组装headers
for(int i=1;i<headersList.length;i++){
String [] itemList=headersList[i].split(": "); // 将每一条Headerr项按冒号分割
headersMap.put((itemList[0]), itemList[1]); // 分键值放入HashMap
}
String contentType = headersMap.get("Content-Type"); // 提取相应项
log.info("响应Content-Type:" + contentType)
最后:凡事要趁早,特别是技术行业,一定要提升技术功底。
其实每个程序员也能意识到目前自己面临的窘境,但能够及时作出改变,顺应时代变化的人太少了。毕竟更多人的情况是,忙着上班,也没人引路,自己也不太会规划。多数人明明“泰山崩于前,而面色如土”只能眼睁睁看着自己被行业淘汰吗?
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
关注我的微信公众号:【伤心的辣条】免费获取~
我的软件测试学习交流群:902061117 群里有技术大牛一起交流分享~
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
35岁之后软件测试工程师靠什么养家?我能继续做测试!
App公共测试用例梳理
Python简单?先来40道基础面试题测试下
阿里二黑叹息:越来越多的年轻人从职场撤退了?
从一名开发人员转做测试的一些感悟