BeanShell Sample 如何使用?

一 引入:

  

eanShell Sample主要用于生成一些逻辑复杂的数据,例如用于加解密数据;

**每次调用前重置bsh.Interpreter:每个BeanShell副本都有自己的解释器副本(每个线程都有),**

在循环内,如果没有勾选重置bs.Interpreter,那么解释器会保留在调用过程中,一些长时间运行的测试就会占用大量内存。

由于BeanShell的bsh.Interpreter存在内存泄漏,所以使用BeanShell时无法支持长时间的压力测试,所以如果是使用BeanShell性能脚本有BeanShell那么建议勾选重置bs.Interpreter,防止内存泄漏

(下图是bsh.Interpreter的部分源码截图,可以看到,它主要设置了ctx、Label、prev、props、vars等参数)

![image.png](https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/16194/1663307082040/7d431cd355464129bf9c9b3d31c8d708.png)

**参数(-> String Parameters 和 String []bash.args):** 传递给BeanShell脚本的参数

例如:\${p1} \${p2} 会传递给BeanShell奥本中的bsh.args,然后通过bsh.args[0]、bsh.args[1]来读取

**脚本文件:** 包含BeanShell脚本的文件,这个文件名存储在变量FileName中,需要注意的是,一旦设置了脚本文件,那么JMeter就不再使用JMeter GUI界面脚本区域写的脚本了

**脚本(见下文所定义的变量):** 编写BeanShell脚本的区域
 

二 内置对象的使用:

  
BeanShell取样器脚本中,有一些内置的对象可以直接使用

主要包括:

* SampleResult
* ResponseCode
* ResponseMessage
* IsSuccess
* Label
* FileName
* ctx
* vars
* prev
* props
* log

![image.png](https://fynotefile.oss-cn-zhangjiakou.aliyuncs.com/fynote/fyfile/16194/1663307082040/33eb0e42eb5344ce91f4135e614393d7.png)

其中,ctx、Label、prev、props、vars是所有BeanShell都具有的通用对象;

而SamplerResult、ResponseCode、ResponseMessage、IsSuccess、FileName、log是BeanShell取样器中定义的,这些知识可以通过阅读JMeter源码得知

 

三 每个参数的使用方法:

  
**SampleResult:** 顾名思义SampleResult是取样器结果的意思,JMeter的响应结果都是通过SampleResult对象去操作的。我们可以使用SampleResult设置响应数据

例如:

* SampleResult.setResponseData("Data的内容") :设置响应体
* SampleResult.setResponseHeaders("Content-Type:application/json"); 设置响应头
* SampleResult.setSamplerData("请求数据"):设置显示的请求数据
* SampleResult.setRequestHeaders("Connection: keep-alive"):设置显示的请求头

注意:由于JMeter源码中有运行流程上的Bug,有部分属性配置通过SampleResult设置时无法生效

**ResponseCode:响应状态码**

**ResponseMessage:状态消息**

**IsSuccess:执行是否成功,是布尔类型**

**Label: 取样器的名称**

**FileName:要读取的BeanShell脚本的名称**

**vars:操作JMeter变量,对应org.apache.jmeter.threads的JMeterVariables 类**

* vars.get("变量名") :获取变量
* vars.put("变量名", "变量值"): 保存当前结果到JMeter变量

**prev:操作前一个取样器的结果对象SampleResult  对应org.apache.jmeter.samplers 的 SampleResult 类**
 

四  常用方法:

* prev.getResponseDataAsString(): 获取前一个取样器的响应数据
* prev.getResponseCode():获取前一个取样器的状态码
* prev.getAssertionResults(): 获取前一个取样器的断言结果
* prev.getContentType(): 获取前一个取样器的请求头
* prev.getUrlAsString():获取前一个取样器的URL
* prev.getConnectTime():获取前一个取样器的连接时间

**props:操作JMeter属性,对应java.util的Properties类**

* props.get("属性名"):获取属性
* props.put("属性名", "属性值"):设置属性

**log:打印日志**

常用用法:

* log.info("日志内容"): 打印info级别的日志

**ctx:** 是JMeter的上下文,org.apache.jmeter.threads的JMeterContext类,可以参考官网API学习:https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html

常用方法:

* getVariables:获取当前JMeter的全部变量
* getProperties:获取JMeter全部属性
* getPreviousResult:获取前一个取样器的SampleResult结果
* getCurrentSampler:获取当前取样器对象
* getPreviousSampler:获取前一个取样器对象
* getThreadNum:获取当前线程的线程编号
* getThread:获取线程对象
 
* getThreadGroup:获取线程组对象
posted @ 2024-02-25 12:37  yongheng999  阅读(172)  评论(0)    收藏  举报