Bean shell 内置函数
1. 什么是Bean Shell?
- BeanShell 是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
- BeanShell 是一种松散类型的脚本语言(这点和 JS类似)
- BeanShell 是用于 Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大写为175k
- BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
- 官网: http://www.BeanShell.org/
2. Jmeter有哪些Bean Shell?
- 定时器: BeanShell Timer
- 前置处理器:BeanShell PreProcessor
- 采样器: BeanShell Sampler
- 后置处理器:BeanShell PostProcessor
- 断言: BeanShell 断言
- 监听器: BeanShell Listener
3. Bean Shell 内置变量
1. log
简述: 打印日志,并写入信息到 jmeber.log 文件
使用方法:
- log.info(“这是我想要输出的日志内容”)
- log.error(“这是一个错误日志”)
GUI 界面开始日志查看:
2. ctx
简述:
- 该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext
- ctx 变量是JMeter JSR223功能最强大的内置变量之一
- 通过它可以轻松的访问当前线程的上下文
- 在 JMeter 内部,ctx 映射为 org.apache.jmeter.threads 的 JMeterContext 类
- 由于JMeterContext 不具有线程安全性,故仅适用于在单线程中使用
- 官方文档: https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html
使用方法:
-
获取当前jmeter线程的所有变量 【getVariables】
vars.put("name", "bingtang"); ctx.getVariables().get("name");
-
获取jmeter的内置属性值(jmeter的内置属性可在jmeter.properties中了解详情) 【getProperties】
p = ctx.getProperties().getProperty("sampleresult.default.encoding"); log.info("sampleresult.default.encoding is " + pv)
-
获取前一个取样器的结果 【getPreviousResult】
import org.apache.jmeter.samplers.SampleResult; SampleResult rsp = ctx.getPreviousResult(); String rh = rsp.getResponseDataAsString(); log.info('\n' + rh);
-
获取取样器的对象 【getCurrentSampler】
cname = ctx.getCurrentSampler().getName(); log.info("当前的cname是: " + cname)
-
获取当前线程组下的线程编号(编号从0开始) 【getThreadNum】
tn = ctx.getThreadNum(); log.info("线程号: " + tn)
3. vars
简述:
-
操作 JMeter 变量,这个变量实际引用了 JMeter 线程中的局部变量容器(本质上是Map),它是测试用例与 BeanShell 交互的桥梁,更多方法可参考:org.apache.jmeter.threads.JMeterVariables
-
vars 是最常用的JMeter变量之一
-
在 JMeter 内部,映射 org.apache.jmeter.threads 的 JMeterVariables 类
-
vars 提供了对当前线程变量的读写能力
-
所有的 JMeter 变量都是 java字符串
-
如果你需要把数据存放到一个 JMeter 变量中,需要先将它转换成字符串
-
官方文档:https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html
使用方法:
-
获取线程名 【getThreadName】
-
获取迭代号 【getIteration】
-
创建/更新变量 【put】
// 赋值 vars.put("name","bingtang"); vars.put("age","18"); // 传字符串 // 获取 name = vars.get("name"); age = vars.get("age"); // 打印 log.info("name is : " + name); log.info("age is : " + age); // 修改 vars.put("name", "qingtian"); name = vars.get("name") log.info("name is :" + name);
-
获取变量的值并将其转换为字符串,若变量存在则将值转换为字符串,否则返回 null 【get】
vars.put(“name”, “bingtang”) name = vars.get(“name”) // 取出name的值转为字符串存在name变量中
-
创建或更新一个非字符串变量。key变量名,value变量值 【putObject】
推荐使用JSR233,不知道是beanshell不支持语法还是,beanshell会报错
vars.putObject("number",3.14); vars.putObject("list1",[1,2,3,4]); vars.putObject("array1",[4,3,2,1] as int[]); vars.putObject("map1",["name":"bingtang", "age": 18]); log.info("数字是: " + vars.getObject("number").toString()); log.info("列表是: " + vars.getObject("list1")); log.info("数组是: " + vars.getObject("array1")); log.info("字典是: " + vars.getObject("map1").get("name"))
-
获取变量的值(不转换为字符串)。若变量不存在则返回null 【getObject】
-
删除一个变量,并返回变量的值,若变量不存在则返回 null 【remove】
vars.remove(‘name’)
4. props
简述:
操作 JMeter 属性,该变量引用了 JMeter 的配置信息,可以获取 JMeter 的属性,它的使用方法与 vars 类似,但是只能
put 进去 String 类型的值,而不能是一个对象,对应于 java.util.Properties
- props 映射 java.util 的 Properties 类
- 与 vars 作用大致相同,区别的是 vars 是对变量进行读写操作, 而 props 主要是对属性进行读写操作
- vars 只能在当前线程组内使用,props 可以跨线程组使用 ,因为属性可以跨线程组但是变量不行
- vars 只能保存 String 或者 Object,props 可以是 Hashtable 或者 Object
- java.util.Properties 这个类是线程安全的;多个线程可以共享一个 Properties 对象,而不需要外部同步
- 官方文档: https://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/Properties.html
使用方法:
-
设置属性值和获取属性值 【setProperty】 【getProperty】
用指定的键在此属性列表中搜索属性,如果在此属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null
操作文件指向:jmeter.propertiesprops.setProperty("test", "csinfo") vtest = props.getProperty("test") log.info("vtest的值是: " + vtest)
-
返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键 【propertyNames】
5. prev(SampleResult)
简述:
获取前面的 Sampler 返回的信息,更多方法可参考:org.apache.jmeter.samplers.SampleResult
- prev 提供对当前取样器结果的访问能力
- prev 映射 org.apache.jmeter.samplers 的 SampleResult 类
- 官方文档: https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
使用方法:
-
获取响应状态码 【 getResponseCode】
sc = prev.getResponseCode(); -
判断响应状态码是否为OK对应的状态码(200) 【isResponseCodeOK()】
yn = prev.isResponseCodeOK()
返回True或者False -
获取线程名 【getThreadName()】
tname = prev.getThreadName() -
获取取样器响应Content-Type首部字段的值域(包含参数) 【getContentType()】
ct = prev.getContentType() -
请求报文大小 【getSentBytes()】
sb = prev.getSentBytes() -
响应报文大小 【getBytesAsLong()】
rb = prev.getBytesAsLong() -
获取延迟时间 【getLatency()】
-
获取连接时间 【getConnectTime()】
-
获取取样器URL 【getURL()】
-
响应正文大小 【getBodySizeAsLong()】
sc = prev.getResponseCode(); // 响应状态码 yn = prev.isResponseCodeOK(); // 响应状态码是否为200 返回True或者False tname = prev.getThreadName(); // 当前的线程名 ct = prev.getContentType(); // 连接类型 sb = prev.getSentBytes(); // 请求报文大小 rb = prev.getBytesAsLong(); // 响应报文大小 db = prev.getLatency(); // 延迟时间 cont = prev.getConnectTime(); // 连接时间 url = prev.getURL(); // 取样器的URL rsb = prev.getBodySizeAsLong(); // 响应正文大小 log.info("响应状态码:" + sc) log.info("响应状态码是否为200: " + yn) log.info("线程名: " + tname) log.info("连接类型:" + ct) log.info("请求报文大小: " + sb) log.info("响应报文大小: " +rb) log.info("延迟时间: " + db) log.info("连接时间: "+ cont) log.info("取样器的URL: " + url) log.info("响应正文大小: " + rsb) ```
总结:
- 按需使用,常用的一般使用到的是log、vars、prev等相应功能
- 推荐使用JSR233 ,原因是更好的性能,还有些java的语法解析似乎beanshell没有带导致运行可能会报错