Jmeter BeanShell 的用法大全(JSR223通用)

Bean shell 内置函数

1. 什么是Bean Shell?

  1. BeanShell 是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
  2. BeanShell 是一种松散类型的脚本语言(这点和 JS类似)
  3. BeanShell 是用于 Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大写为175k
  4. BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
  5. 官网: 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

使用方法:

  1. 获取当前jmeter线程的所有变量 【getVariables】

    vars.put("name", "bingtang");
    ctx.getVariables().get("name");
    
  2. 获取jmeter的内置属性值(jmeter的内置属性可在jmeter.properties中了解详情) 【getProperties】

    p = ctx.getProperties().getProperty("sampleresult.default.encoding");
    log.info("sampleresult.default.encoding is " + pv)
    

    在这里插入图片描述
    在这里插入图片描述

  3. 获取前一个取样器的结果 【getPreviousResult】

    import org.apache.jmeter.samplers.SampleResult;
    SampleResult rsp = ctx.getPreviousResult();
    String rh = rsp.getResponseDataAsString();
    log.info('\n' + rh);
    

    在这里插入图片描述

  4. 获取取样器的对象 【getCurrentSampler】

    cname = ctx.getCurrentSampler().getName();
    log.info("当前的cname是: " + cname)
    

    在这里插入图片描述

  5. 获取当前线程组下的线程编号(编号从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

使用方法:

  1. 获取线程名 【getThreadName】

  2. 获取迭代号 【getIteration】

  3. 创建/更新变量 【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);
    
  4. 获取变量的值并将其转换为字符串,若变量存在则将值转换为字符串,否则返回 null 【get】

    vars.put(“name”, “bingtang”)
    name = vars.get(“name”)  // 取出name的值转为字符串存在name变量中
    
  5. 创建或更新一个非字符串变量。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"))
    

    在这里插入图片描述

  6. 获取变量的值(不转换为字符串)。若变量不存在则返回null 【getObject】

  7. 删除一个变量,并返回变量的值,若变量不存在则返回 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

使用方法:

  1. 设置属性值和获取属性值 【setProperty】 【getProperty】

    用指定的键在此属性列表中搜索属性,如果在此属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null
    操作文件指向:jmeter.properties

    props.setProperty("test", "csinfo")
    vtest = props.getProperty("test")
    log.info("vtest的值是: " + vtest)
    

    在这里插入图片描述

  2. 返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键 【propertyNames】
    在这里插入图片描述

5. prev(SampleResult)

简述:
获取前面的 Sampler 返回的信息,更多方法可参考:org.apache.jmeter.samplers.SampleResult

使用方法:

  1. 获取响应状态码 【 getResponseCode】
    sc = prev.getResponseCode();

  2. 判断响应状态码是否为OK对应的状态码(200) 【isResponseCodeOK()】
    yn = prev.isResponseCodeOK()
    返回True或者False

  3. 获取线程名 【getThreadName()】
    tname = prev.getThreadName()

  4. 获取取样器响应Content-Type首部字段的值域(包含参数) 【getContentType()】
    ct = prev.getContentType()

  5. 请求报文大小 【getSentBytes()】
    sb = prev.getSentBytes()

  6. 响应报文大小 【getBytesAsLong()】
    rb = prev.getBytesAsLong()

  7. 获取延迟时间 【getLatency()】

  8. 获取连接时间 【getConnectTime()】

  9. 获取取样器URL 【getURL()】

  10. 响应正文大小 【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)
    	```
    

在这里插入图片描述

总结:

  1. 按需使用,常用的一般使用到的是log、vars、prev等相应功能
  2. 推荐使用JSR233 ,原因是更好的性能,还有些java的语法解析似乎beanshell没有带导致运行可能会报错

猜你喜欢

转载自blog.csdn.net/Python_BT/article/details/124191318