BeanShell简介
BeanShell是使用Java语法的一套脚本语言,在JMeter的多种组件中都有BeanShell的身影,如:
- 定时器:BeanShell Timer
- 前置处理器:BeanShell PreProcessor
- 采样器:BeanShell Sampler
- 后置处理器:BeanShell PostProcessor
- 断言:BeanShell Assert
- 监听器:BeanShell Listener
通过BeanShell可以对请求数据、响应数据或环境变量进行更加灵活的处理和判断。
Beanshell有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互,比如:
- prInt:非GUI模式下打印信息(输出信息到stdout)
- log:输出信息到日志(文件)
- 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():获取采样器山下文数据ctx详细API可参考:
BeanShell断言
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
//获取响应数据 String response = prev.getResponseDataAsString(); log.info("响应体:" + response); //响应数据包含 if(response.contains("登录成功")){ Failure=false; } else{ Failure=true; FailureMessage="响应数据不包含登录成功"; }
JSON响应体字段提取及断言#
将String类型的响应体转为JSON对象并操作需要额外的jar包,可以使用org.json或gson,下载地址如下:
- json.jar:下载地址 密码:8it7
- gson.jar:下载地址 密码:6a7v
以json.jar为例,下载后将其放入JMeter/lib目录下,重启JMeter,添加BeanShell断言,如下:
Copy
//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()方法外,还支持
- getBoolean("字段名") :获取布尔类型字段值
- getInt("字段名"):获取整型字段值
- getLong("字段名"):获取长整型字段值
- getDouble("字段名"):获取双精型字段值
- getJSONObject("字段名"):获取嵌套Object类型字段值,JSONObject类型
- getJSONArray("字段名"):获取嵌套Array类型,JSONArray类型
响应头解析#
响应头原本为String类型,可以通过分割遍历组装成Map类型来提取响应头中的项
Copy
import 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)
下面分享我整理的这份2023年可能是最全的自动化测试工程师发展方向知识架构体系图。
码尚教育软件测试全职业生涯进阶从零到测试开发VIP课程| ProcessOn免费在线作图,在线流程图,在线思维导图
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励,也方便你下次能够快速查找,感谢。
如果你想获取该文章配套的视频视频教程以及练手的接口。请狠狠点击文章末尾推广小卡片
并把所需的资料的文章链接发给我即可领取
如果你想获取简历模板+面试技术宝典+求职视频+上千份测试真题,
请狠狠点击文章末尾推广小卡片
并把所需的资料的文章链接发给我即可领取