zoukankan      html  css  js  c++  java
  • Jmeter- Beanshell语法和常用内置对象

          在利用jmeter进行接口测试或者性能测试的时候,我们需要处理一些复杂的请求,此时就需要利用beanshell脚本了,BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法,所以它和java是可以无缝衔接的。beanshell由于内置了一些特有的变量,没法在一些集成代码工具上去调试。今天就和大家分享下常用的2个代码例子,大家可以直接拿来稍微修改下就可以使用。

    Bean Shell内置变量大全

         首先大家需要掌握bean shell本身自带的一些内置变量和一些方法。JMeter在其BeanShell中内置了变量,用户是通过这些变量与JMeter进行交互。

    1.log 打印日志,写入信息到jmeber.log文件。
    2.SampleResult 获取SampleResult对象,能通过这个对象获取想要的信息。
    3.Response 获取Response对象,能通过这个对象获取响应信息。
    4.Failure 查看接口调使用能否成功,假如返回false是成功的,true是失败的。
    5.FailureMessage 失败信息,没有设置的时候失败信息是空的,能set这个信息。
    6.ResponseData 获取response body类型是byte[]。
    7.ResponseCode 返回接口code成功是200。
    8.ResponseMessage 获取msg成功是OK。
    9.ResponseHeaders 获取接口服务端返回的头部信息。
    10.RequestHeaders 获取用户端请求的头部信息。
    11.SampleLabel 获取接口请求的名称。
    12.SamplerData 获取请求的url和body。
    13.ctx 代表上下文信息,能直接用。
    14.vars即JMeterVariables,操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),常用方法:
      a) vars.get(String key):从jmeter中获得变量值;
      b) vars.put(String key,String value):数据存到jmeter变量中;
    15.prev 获取前面的sample返回的信息,常用方法:
      a) getResponseDataAsString():获取响应信息。
      b) getResponseCode() :获取响应code。


    1:Beanshell的基本语法
    1.1:Beanshell的For循环与集合

    String a = "aaa";
    int b = 111;
    
    List list  = new ArrayList();
    //list集合只能保存String类型
    list.add(a);
    list.add(b.toString());
    //普通for循环的写法
    for(int i = 0; i<list.size();i++){
    log.info(">>>>>>>>>>>");
    log.info(list.get(i));
    }
    //增强for循环的写法
    for(object : list){
    log.info("==========");
    log.info(object);
    }

    1.2:Beanshell的数组的写法

    String[] str1 = new String[]{"aa","bb","cc"};//new一个String[]一维数组
    
    String[][] str2 = new String[][]{{"AA","BB"},{"CC","DD"},{"EE","FF"}};
    //遍历str1这个一维数组
    for(int i = 0; i< str1.length ; i++){
    log.info(str1[i]);
    }
    //遍历第二个二维数组
    for (String[] strings : str2) {
    
    for(int i = 0; i< strings.length ; i++){
    
    log.info(strings[i]);
    }
    }

    1.3:Beanshell定义一个函数 并调用

    //定义一个方法
    public void addlist(List list){
    
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    }
    
    List list = new ArrayList();
    //调用方法
    addlist(list);
    //遍历list集合
    for(int i = 0; i < list.size(); i++){
    log.info(list.get(i));
    }

    2:Beanshell常用的内置对象
    2.1:bsh.args对象获取数组参数

    2.2:vars内置对象的使用
    A:示例定义一个用户自定义变量

     

    B:vars.get(String key)获取String变量 

       vars.put(String key,Value)放置一个Map到vars 

       

    2.3:vars内置对象put和get Object对象
    如果需要获取或者放置非String类型数据 需要用putObject()和getObject()

    //Beanshell vars.putObject() vars.getObject()的使用
    List list = new ArrayList();
    
    list.add("aaa");
    list.add("bbb");
    //putObject()可以在vars对象中放置Object类型对象
    vars.putObject("list",list);
    //===========================
    //获取Object list对象
    Object Value = vars.getObject("list");
    //log.info只能输出String类型变量
    log.info(Value.toString());

     3:Beanshell的常用内置对象-ctx
    3.1:ctx内置对象getPreviousResult()方法 调用请求/响应数据

    ctx内置对象来自于JMeterContext 查看Jmeter API发现有下列get方法可以获取请求/响应数据

    //SampleResult需要import对象
    import org.apache.jmeter.samplers.SampleResult;
    
    SampleResult result = ctx.getPreviousResult();
    //getRequestHeaders()方法返回String字符串
    String RequestHeaders = result.getRequestHeaders();
    //getResponseHeaders() 返回响应headers
    String ResponseHeaders = result.getResponseHeaders(); 
    //getResponseCode() 返回响应状态码字符串
    String responseCode = result.getResponseCode();
    //getURL() 返回请求URL对象 
    URL url = result.getURL();
    log.info(RequestHeaders);
    log.info(RequestHeaders);

    4:prev内置对象
    prev是Beanshell后置处理器的内置对象 相当于ctx.getPreviousResult();

    5.  高级用法:假如我们希望线程之间共享一个变量,可以利用BeanShell来完成。

        JMeter中线程间共享变量可以通过定义属性值来完成,JMeter启动时会读取一些属性文件,比如jmeter.properties、user.properties,这些属性值是可以修改的,通过BeanShell可以对其进行更改。通过props.put()来修改属性,props.get()来获取属性。

    6. jmeter中,BeanShell的使用由以下场景:

    前置处理器:BeanShell PreProcessor
    取样器 :BeanShell Sampler
    后置处理器:BeanShell PostProcessor

    Jmeter中包括多种BeanShell,用法差不多,只是作用的地方不同。
    定时器:  BeanShell Timer
    前置处理器:BeanShell PreProcessor,提前处理请求参数,如:加密解密等
    采样器:  BeanShell Sampler
    后置处理器:BeanShell PostProcessor,在请求后对返回结果进行处理
    断言:   BeanShell断言,验证返回结果的正确性
    监听器:  BeanShell Listener

    摘录:https://blog.csdn.net/hujyhfwfh2/article/details/80862134

             https://blog.51cto.com/14010723/2298911

  • 相关阅读:
    Ynoi2016 这是我自己的发明
    Luogu P5268 [SNOI2017]一个简单的询问
    Ynoi2017 由乃的玉米田
    BZOJ4320 [Shanghai2006]Homework
    JOISC2014C 歴史の研究
    莫队
    LOJ6119 「2017 山东二轮集训 Day7」国王
    Luogu P3295 [SCOI2016]萌萌哒
    10.1 进程间通信--消息队列
    9.2 网络协议理论
  • 原文地址:https://www.cnblogs.com/fanpl/p/11946977.html
Copyright © 2011-2022 走看看