jmeter BeanShell PreProcessor组件

jmeter是个很小巧的压测工具,一般的压测场景都能搞定。但是压测时,可能某些接口需要签名、鉴权。这时候就需要一些加密算法了,jmeter虽然也自带了一些函数,但是没有加解密函数,不过jmeter却提供了用户自定义脚本的方法,除了自己写java request外,还有另一中更简单的方法,就是bean shell,我们可以使用BeanShell PreProcessor这个前置处理器。

  1. 什么是bean shell
    BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。
  2. jmeter中的BeanShell PreProcessor组件
    使用BeanShell PreProcessor组件,可以写自定义的java代码,并且把代码中的变量传递给jmeter使用,这样我们就能在压测请求之前,初始化一些变量,如加解密等。

在jmeter中添加BeanShell PreProcessor组件方法如下:

组件界面如下:

  1. 参数描述如下:
    属性描述
    名称该元件的描述性名称,用于在测试树种标识元件
    Reset bsh.Interpreter before each call如果设置该项,那么就会为每个采样器重新创建解释器。
    Parameters to be passed to Bean Shell传递给BeanShell脚本的参数。参数存在于如下变量表中: 1)String Parameters:包含有参数的字符串,作为单个变量存在;2)String []bsh.args:包含有参数的字符串数组,以空格作为间隔
    Script file一个文件,其中包含有待运行的BeanShell脚本
    ScriptBeanShell脚本。返回值将被忽略。
  • Bean Shell常用内置变量
    JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

  • + log:用来记录日志文件,写入到jmeber.log文件,使用方法:log.info(“This is log info!”);
    + ctx(JmeterContext)通过它来访问context,使用方法可参考:org.apache.jmeter.threads.JMeterContext。
    + vars - (JMeterVariables):操作jmeter变量,提供读取/写入访问变量的方法。这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:
    + vars.get(String key):从jmeter中获得变量值
    + vars.put(String key,String value):数据存到jmeter变量中
    + vars.putObject("OBJ1",new Object());
    + 更多方法可参考:org.apache.jmeter.threads.JMeterVariables
    + props - (JMeterProperties - class Java.util.Properties):
    操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
    + props.get("START.HMS");  注:START.HMS为属性名,在文件jmeter.properties中定义
    + props.put("PROP1","1234");
    + prev - (SampleResult):获取前面的sample采样的结果,常用方法:
    + getResponseDataAsString():获取响应信息
    + getResponseCode() :获取响应code
    + 更多方法可参考:org.apache.jmeter.samplers.SampleResult
    + sampler - (Sampler):gives access to the current sampler 访问当前采样

    简单写了个md5的加密算法,如下:

        import java.security.MessageDigest;
    
        public static String bytesToHex(byte[] bytes) {  
            StringBuffer hexStr = new StringBuffer();  
             int num;  
             for (int i = 0; i < bytes.length; i++) {  
                num = bytes[i];  
                if(num < 0) {  
                    num += 256;  
                }  
                if(num < 16){  
                    hexStr.append("0");  
                }  
              hexStr.append(Integer.toHexString(num));  
             }  
             return hexStr.toString().toUpperCase();  
        }  
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        String source = vars.get("username");
        messageDigest.update(source.getBytes());
        String sign = bytesToHex(messageDigest.digest());
        vars.put("sign", sign);
    

    这样就把md5的结果存放在了sign变量中,在jmeter中可以使用${sign}来获取。

    版权声明

    本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

    © 空空博客,本文链接:https://www.yeetrack.com/?p=1280