• Jmeter——BeanShell 内置变量vars、props、prev的使用


    在使用Jmeter过程中,或多或少都会接触些BeanShell,它会使工具的使用,变得更灵活。

    Jmeter中关于BeanShell的有:
     
      1.BeanShell Sampler 取样器:完成Beanshell请求组件中定义的脚本功能;

      2.BeanShell PostProcessor 后置处理器:可通过编程方式获取对应请求的响应结果;  

      3.BeanShell PreProcessor 前置处理器:可通过编程方式在发起请求以前做预处理,比如编码或者加密;

      4.Beanshell 断言:可通过编程方式实现复杂的断言逻辑;

      5.Beanshell 计时器:编码实现条件定时功能;

      6.BeanShell Listener 监听器:监听Beanshell运行结果。

    目前我使用较多的是前三种元件。使用过程中,就会使用一些内置变量,所以这也是今天的主要内容。

    vars

    vars 在 JMeter 内部,映射 org.apache.jmeter.threads 的 JMeterVariables 类,官方文档:https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html

    注意点:

    • vars 提供了对当前线程变量的读写能力
    • 所有的 JMeter 变量都是 java字符串
    • 把数据存放到一个 JMeter 变量中,需要先将它转换成字符串

    getThreadName

    方法声明
    public String getThreadName()

    功能
    获取当前运行线程名

    String threadName = vars.getThreadName();
    
    log.info("threadName:"  + threadName);
    

    getIteration

    方法声明
    public int getIteration()

    功能
    获取线程当前的迭代号

    int itNum = vars.getIteration();
    String num = String.valueOf(itNum);
    log.info("itNum:"  + num);
    

    这里有个注意点,就是在开始时候提到的,数据放到变量中,需要将数据转换成String类型。

    put

    方法声明
    public void put(String key, String value)

    Parameters:
    key - the variable name
    value - the variable value

    功能
    创建或更新字符串变量

    创建变量

    vars.put("name","温一壶清酒");
    vars.put("age","5");
    
    String varsName = vars.get("name");
    log.info("varsName:"+ varsName);
    String varsAge = vars.get("age");
    log.info("varsAge:"+ varsAge);
    

    注意点:age字段值5,需要是字符串类型,否则会报错。

    Error in method invocation: Method put( java.lang.String, int ) not found in class'org.apache.jmeter.threads.JMeterVariables'

    修改变量

    vars.put("name","温一壶清酒 博客园");
    String varsName = vars.get("name");
    log.info("varsName:"+ varsName);
    

    get

    方法声明
    public String get(String key)

    功能
    获取变量的值并将其转换为字符串,若变量存在则将值转换为字符串,否则返回 null

    String varsSex = vars.get("sex");
    log.info("varsSex:"+ varsSex);
    

    在put方法中,已经使用了get的方法,这里列举个获取不到变量的情况,返回null

    putObject

    方法声明
    public void putObject(String key,Object value)

    Parameters:
    key - the variable name
    value - the variable value

    功能
    创建或更新一个非字符串变量。

    vars.putObject("number",8);
    vars.putObject("list",[2,4,6,8,10]);
    vars.putObject("array",[1,3,5,7,9,11] as int[]);
    vars.putObject("map",["name":"温一壶清酒","source":"博客园"]);
    log.info("number:"+ vars.getObject("number").toString());
    log.info("list:"+ vars.getObject("list").size());
    log.info("array:"+ vars.getObject("array").length);
    log.info("map:"+ vars.getObject("map").get("name"));
    

    getObject

    方法声明
    public Object getObject(String key)

    功能
    获取变量的值(不转换为字符串)。若变量不存在则返回null

    remove

    方法声明
    public Object remove(String key)

    功能
    删除一个变量,并返回变量的值,若变量不存在则返回 null

    vars.put("name","温一壶清酒 博客园");
    vName = vars.remove("name");
    log.info("vName:"+ vName);
    
    vSex = vars.remove("sex");
    log.info("vSex:"+ vSex);
    
    

    props

    props 映射 java.util 的 Properties 类。java.util.Properties 这个类是线程安全的;多个线程可以共享一个 Properties 对象

    vars跟props的区别

    • vars 是对变量进行读写操作, 而 props 主要是对属性进行读写操作
    • vars 只能在当前线程组内使用,props 可以跨线程组使用 ,因为属性可以跨线程组但是变量不行
    • vars 只能保存 String 或者 Object,props 可以是 Hashtable 或者 Object

    getProperty

    方法声明
    public String getProperty(String key)

    public String getProperty(String key, String defaultValue):当 key 不存在则返回默认值

    功能
    用指定的key在此属性列表中搜索属性,如果在此属性列表中未找到该key,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null

    timeFormat = props.getProperty("jmeter.save.saveservice.timestamp_format");
    log.info("timeFormat:"+ timeFormat);
    
    
    propsTest = props.getProperty("jmeter.save.saveservice.timestamp");
    log.info("propsTest:"+ propsTest);
    
    
    propsTest = props.getProperty("jmeter.save.saveservice.timestamp","温一壶清酒 博客园");
    log.info("propsTest:"+ propsTest);
    
    

    get

    方法声明
    public synchronized V get(Object key)

    功能
    获取属性值,跟 getProperty 类似

    pTimeFormat = props.get("jmeter.save.saveservice.timestamp_format");
    log.info("pTimeFormat:"+ pTimeFormat);
    
    
    pPropsTest = props.get("jmeter.save.saveservice.timestamp");
    log.info("pPropsTest:"+ pPropsTest);
    

    setProperty

    方法声明
    public Object setProperty(String key,String value)

    功能
    设置属性值

    props.setProperty("pName","温一壶清酒");
    propsName = props.getProperty("pName");
    log.info("propsName:"+ propsName);
    

    put

    方法声明
    public synchronized V put(Object key)

    功能
    设置属性值,跟 setProperty 类似

    props.put("pName","温一壶清酒");
    pPropsName = props.get("pName");
    log.info("pPropsName:"+ pPropsName);
    

    propertyNames

    方法声明
    public Enumeration propertyNames()

    功能
    返回属性列表中所有key的枚举,如果在主属性列表中未找到同名的key,则包括默认属性列表中不同的key

    propsNames = props.propertyNames();
    propsNames.each{
    	log.info(it)
    	}
    

    size

    方法声明
    public int size()

    功能
    返回有多少个属性

    pPropsCount = props.size();
    log.info("pPropsCount:"+ pPropsCount);
    

    remove

    方法声明
    public synchronized V remove(Object key)

    功能
    删除一个变量,并返回变量的值,若变量不存在则返回 null

    props.put("pName","温一壶清酒");
    rName = props.remove("pName");
    log.info("rName:"+ rName);
    
    rSex = props.remove("sex");
    log.info("rSex:"+ rSex);
    

    prev

    prev 提供对当前取样器结果的访问能力,映射 org.apache.jmeter.samplers 的 SampleResult 类
    官方文档: https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html

    getResponseCode

    方法声明
    public String getResponseCode()

    功能
    获取响应状态码

    responseCode = prev.getResponseCode() ;
    log.info("responseCode:" + responseCode);
    
    2022-10-04 15:34:29,057 INFO o.a.j.u.BeanShellTestElement: responseCode:200
    

    isResponseCodeOK

    方法声明
    public boolean isResponseCodeOK()

    功能
    判断响应状态码是否为OK对应的状态码(200),结果只有true和false

    responseCodeBoolean = prev.isResponseCodeOK();
    log.info("responseCodeBoolean:" + responseCodeBoolean);
    
    2022-10-04 15:36:35,077 INFO o.a.j.u.BeanShellTestElement: responseCodeBoolean:true
    
    

    getThreadName

    方法声明
    public String getThreadName()

    功能
    获取线程名

    
    prevThreadName = prev.getThreadName();
    log.info("prevThreadName:" + prevThreadName);
    
    2022-10-04 15:39:17,955 INFO o.a.j.u.BeanShellTestElement: prevThreadName:prevThreadName
    
    

    getResponseDataAsString

    方法声明
    public String getResponseDataAsString()

    功能
    获取String类型的响应结果

    prevResponse = prev.getResponseDataAsString();
    log.info("prevResponse:" + prevResponse);
    

    getStartTime

    获取请求开始时间

    getEndTime

    获取请求结束时间

    getSamplerData

    获取请求内容

    好了,以上就是平时经常用到的一些内置变量的方法,还有其他的方法,可以参考源码或官方文档。


    __EOF__

  • 本文作者: 温一壶清酒
  • 本文链接: https://www.cnblogs.com/hong-fithing/p/16747326.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    网络协议层次模型
    4 redis的HyperLogLog入门&原理
    linux crontab: ip: command not found
    第K位数字
    java之Number与Math及Random类
    OpenGL —— 2.7、绘制多个自旋转的贴图正方体(附源码,glfw+glad)
    uniapp引入uniapp打包的H5跳转H5以及H5返回app方法
    ChartMuseum的安装教程和基本配置
    MySQL数据库性能优化方法,一篇给你总结了
    GBase 8a存储过程和函数
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/16747326.html