BeanShell断言可以使用beanshell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用beanshell脚本
在这里除了可以使用beanshell的内置变量外,主要通过 Failure 和 FailureMessage来设置断言结果。
 

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():获取采样器山下文数据。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐