一 引入:
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:获取线程组对象 标签:prev,SampleResult,获取,Sample,如何,取样器,BeanShell,JMeter From: https://www.cnblogs.com/yongheng999/p/18032264