BeanShell断言可以使用beanshell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用beanshell脚本
在这里除了可以使用beanshell的内置变量外,主要通过 Failure 和 FailureMessage来设置断言结果。
Failure = false;-----表示断言成功
FailureMessage = “......";---自定义的成功信息
Failure = true;----表示断言失败
FailureMessage="......";------自定义的失败信息
一、添加断言方式
根据需要可在【测试计划】、【线程组】、【线程请求】下添加断言,一般在对应的【线程请求】下添加,如下图所示,即本文所介绍的。
添加路径:【线程请求-点击右键-添加-断言-最后一个BeanShell断言】
二、BeanShell断言
响应断言界面设置,如下图:
2.1.BeanShell断言界面详解
【名称】BeanShell断言组件的自定义名称,见名知意最好。
【注释】即添加一些备注信息,对该BeanShell断言组件的简短说明,以便后期回顾时查看。
【Reset bsh.Interpreter before each call】每个BeanShell测试元素都有自己的解释器副本(对于每个线程)。
如果重复调用测试元素,例如:在循环内,除非选择在每次调用之前重置bsh.Interpreter选项,否则解释器将保留在调用之间。一些长时间运行的测试可能会导致解释器使用大量内存。
由于BeanShell的bsh.Interpreter存在内存泄露,常规方法无法支持长时间的压力测试。
JMeter官网推荐,在使用BeanShell进行长时间测试时,打开选项【每次调用前置 bsh.Interpreter】=【Reset bsh.Interpreter before each call**】,则在每次调用BeanShell程序前,都把解释器重置,以释放解释器之前占用的内存。
【参数 (-> String Parameters和String[]bsh.args)】输入String参数。String[]bsh.args是主类main函数的形式参数,是一个String 对象数组,可以用来获取命令行用户输入进去的参数。
【脚本文件】脚本文件(可以填入脚本文件路径),可以点击后边的浏览选择脚本文件。
【脚本】:编写脚本,参照下文定义的变量(使脚本文件参照定义的变量来运行)
2.2.断言源码
状态码断言-源码信息,如下:
//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){
Failure=false; // 表示断言成功
}
else{
Failure=true; // 表示断言失败
FailureMessage="响应状态码非200"; // 自定义的失败信息
}
注:字符串只能使用双引号,字符串相等要使用" “.equals(” ")表达式。
响应数据断言-源码信息,如下:
//获取响应数据
String response = prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含
if(response.contains("token")){
Failure=false; // 表示断言成功
}
else{
Failure=true; // 表示断言失败
FailureMessage="响应数据不包含token";
}
三、断言结果查看
3.1.【断言结果】组件
添加路径:【测试计划-点击右键-添加-监听器-断言结果】
整个测试计划下所有请求的所有断言结果报错信息均会在此显示,如下图所示,将所有断言结果的报错信息直接展示出来。
3.2.【察看结果树】组件
添加路径:【测试计划-点击右键-添加-监听器-查看结果树】,整个测试计划下所有请求的所有断言结果报错信息均会在此显示,如下图的形式,切换查看。
四、实例演示
已知请求的接口,响应状态码:200,响应结果包含:token字段,如下图,按照【2.2.断言源码】设置脚本,断言成功通过
修改断言脚本如下图所示:
查看断言结果:2个断言均不通过,如下图所示
1、【察看结果树】组件,查看断言结果
2、【断言结果】组件,查看断言结果
五、BeanShell简介
Beanshell是一种类似JAVA的脚本语言,通过BeanShell可以对请求数据、响应数据或环境变量进行更加灵活的处理和判断。还可以直接调用外部的JAR包,例如:可以直接引入现成的第三方JSON解析包来使用。
在JMeter的多种组件中都有BeanShell的身影,如下:
定时器:BeanShell Timer
前置处理器:BeanShell PreProcessor
采样器:BeanShell Sampler
后置处理器:BeanShell PostProcessor
断言:BeanShell Assert
监听器:BeanShell Listener
在JMeter运行的流程控制中,BeanShell出现的位置,如下图所示:
Beanshell的内置变量和方法
Beanshell有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互,例如:
1、prInt:非GUI模式下打印信息(输出信息到stdout,标准输出控制台)。
2、log:输出信息到日志(文件)
- log.debu(“调试信息”)
- log.info(“响应状态码” + ResponseCode)
- log.warn(“警告信息”)
log.error(“出错信息”)
3、ResponseCode:响应状态码(String类型)。
4、ResponseHeaders:响应头(String类型)。
5、prev:获取当前请求结果
- prew.getResponseDataAsString():获取响应体数据(String类型)。
- prew.getResponseCode():获取状态码(同ResponseCode,String类型)。
6、vars:操作JMeter变量
- String var1 = vars.get(“变量名”):获取变量的值(假设为String类型)。
- vars.put(“变量名”, 变量值):设置变量值。
7、props:操作JMeter属性
- props.get(String,String) 可以获取JMeter中已经生成的属性。
- props.put(String,String)可以创建和更新JMeter属性。
8、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():获取采样器山下文数据。