• 玩转jmeter:beanshell必备技能


    beanshell是什么

    BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。(摘抄自网络) 

    下载及运行

    下载地址:https://beanshell.github.io/download.html

     

    java -jar直接运行

      

    测试

    其它方式启动:先把jar包加入到环境变量

    界面UI方式 :java bsh.Console

      

    命令行方式 :java bsh.Interpreter

    运行脚本文件:java bsh.Interpreter filename [args]

    第一个例子

    第二个例子

    运行结果

    如果jar包没加到环境变量,可以这样运行:java -classpath %CLASSPATH%;bsh-2.0b4.jar bsh.Interpreter test.txt

    常用命令

    print() 输出内容到命令行中
    source()读一个bsh脚本到当前解释器(interpreter)中,或者在新的解释器中运行这个脚本

    而我们的jmeter中,已经自带了jar包,下面介绍jmeter中如何使用beanshell

     

    添加变量

    引用变量

    发送请求,可以看到密码加密了

    自定义函数

    上面也可以封装为函数

    下面方法返回类型为void

    import org.apache.commons.codec.digest.DigestUtils;
    
    public static void fun(){
        String password_md5 = DigestUtils.md5Hex("123456");
        vars.put("password_md5", password_md5);
    }
     
    fun(); 

    下面方法返回类型为String 

    import org.apache.commons.codec.digest.DigestUtils;
    
    public static String fun(){
        String password_md5 = DigestUtils.md5Hex("123456");
        print(password_md5);  // 在命令行窗口打印结果
        return password_md5;    
    }
     
    String password_md5 = fun();
    vars.put("password_md5", password_md5);
    

      

    也可以写成这样(方法不写返回类型)

    import org.apache.commons.codec.digest.DigestUtils;
    
    fun(){
        String password_md5 = DigestUtils.md5Hex("123456");
        print(password_md5);  // 在命令行窗口打印结果
        return password_md5;    
    }
     
    String password_md5 = fun();
    vars.put("password_md5", password_md5);
    

      

    甚至写成这样(定义的变量也没类型)

    import org.apache.commons.codec.digest.DigestUtils;
    
    fun(){
        String password_md5_res = DigestUtils.md5Hex("123456");
        print(password_md5_res);  // 在命令行窗口打印结果
        return password_md5_res;    
    }
     
    password_md5 = fun();
    vars.put("password_md5", password_md5);
    

    但是还是推荐按照java的方式写,严格定义。 

    引用java文件、class文件、jar文件

    详见微信公众号:全栈测试笔记

     

    常用内置变量

    JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互。

    log
    
    vars
    
    prev
    
    Failure
    
    FailureMessage
    

    具体用法请百度,本篇的示例中也有使用到。

    beanshell组件

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

    下面举例几个常用的。

    beanshell采样器

    引用变量

    发送请求,可以看到密码加密了

    beanshell前置处理器

    beanshell断言

    pom依赖

        <dependencies>
            <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.49</version>
            </dependency>
        </dependencies> 

    代码及打的jar包

    把jar包复制到jmeter的lib下ext中,重启jmeter

    添加用户定义变量 

    请求

    beanshell前置处理器,加密密码

    beanshell断言

    完整脚本

    import com.uncleyong.JsonToJSONObject;
    import com.alibaba.fastjson.JSONObject;   // 不能少,下面定义了JSONObject类型
    
    print("===========开始执行==========");
    String exp_result = vars.get("exp_result");
    print("exp_result= " + exp_result);
    print("exp_result的类型:" + exp_result.getClass().toString());  // exp_result的类型:class java.lang.String
    //Integer.valueOf返回的是Integer对象,Integer.parseInt返回的是int
    Integer exp_result2 = Integer.valueOf(exp_result);
    print("exp_result2的类型:" + exp_result2.getClass().toString());  // exp_result2的类型:class java.lang.Integer
    
    String jsonString = prev.getResponseDataAsString();
    print("获取到的返回结果:" + jsonString);
    print("返回结果的类型:" + jsonString.getClass().toString());  // 返回结果的类型:class java.lang.String
    
    JSONObject responseJson = new JsonToJSONObject().JSONObjectUtil(jsonString);
    print("转换后的返回结果:" + responseJson);
    print("转换后的返回结果类型:" + responseJson.getClass());  // 转换后的返回结果类型:class com.alibaba.fastjson.JSONObject
    
    String code = responseJson.getString("code");
    print("code = " + code);
    print("code的类型:" + code.getClass());  // code的类型:class java.lang.String
    Integer code2 = responseJson.getInteger("code");
    print("code2 = " + code2);
    print("code2的类型:" + code2.getClass());  // code2的类型:class java.lang.Integer
    
    //if (code.equals(exp_result)==false) {
    if (code2 != exp_result3) {
        print("--------进入if语句--------");
        Failure = true;
        FailureMessage = "code与实际值不一致,期望值" + exp_result + ", 实际值" + code;
    }
    print("===========结束执行==========");

    运行结果

     

    手把手实践

    《jmeter对接口测试入参进行MD5加密的5种方式》,详见微信公众号:全栈测试笔记

    https://www.cnblogs.com/uncleyong/protected/p/9429752.html

    《性能测试:jmeter中通过beanshell把关联转变成参数化》

    https://www.cnblogs.com/uncleyong/p/10986466.html

  • 相关阅读:
    洛谷P3157 [CQOI2011]动态逆序对
    CDQ分治
    快速数论变换(NTT)
    洛谷P3338 [ZJOI2014]力
    洛谷 P1919 A*B Problem升级版
    0-1分数规划
    洛谷P4593 [TJOI2018]教科书般的亵渎
    拉格朗日插值
    20180912-3 词频统计
    20190912-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/uncleyong/p/7189778.html
Copyright © 2020-2023  润新知