Jmeter高阶系列--Beanshell脚本

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:3

Jmeter高阶系列--Beanshell脚本

1 概述

1.1 导语

你是否遇到以下场景时,头疼该如何解决?

  • 测试场景复杂,测试入参需多样化;

  • 自动化测试灵活,参数需动态生成;

  • 操作的数据量大,数据不能直接罗列。


Jmeter的Beanshell脚本可以解决以上问题。

1.2 Beanshell简介 

Beanshell是一种完全符合Java语法规范松散类型脚本语言(这点和JS类似),并且又拥有自己的一些语法和方法。它用Java写成,是一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。解释器Jar文件大小为175k,非常精简。此外,它执行标准Java语句和表达式,也包括一些额外的脚本命令和语法。


Jmeter支持Beanshell脚本,即使用者可通过Beanshell脚本对Jmeter的基本功能进行扩充,实现更多更复杂的测试场景,满足多样化需求,比如自动化测试或者性能测试。

1.3 Beanshell类型

Jmeter中主要有六种Beanshell:

  • 定时器:Beanshell Timer

  • 前置处理器:Beanshell PreProcessor

  • 采样器:Beanshell Sampler

  • 后置处理器:Beanshell PostProcessor

  • 断言:Beanshell断言

  • 监听器:Beanshell Listener


Beanshell的常见使用方法


Jmeter中Beanshell常用的使用方法有四种:自定义函数、导入Jar包、导入class文件、Beanshell常用内置变量。

2.1 自定义函数

自定义函数,即直接在Beanshell中编写Java代码,Java代码可在IDE工具中调试通过后再复制进Jmeter的Beanshell中。

销售订单需要关联物料、客户、组织等基础资料,根据接口定义,可通过各基础数据的编码或者ID等进行关联,基础数据的编码通常由前缀加流水号加时间生成,可在Beanshell中编写生成流水号以及基础资料编码的Java方法,供脚本调用。

如下图,在Beanshell脚本中实现生成物料编码的功能。



代码如下:


Random itemRnd = new Random();
     //生成一个n位的随机数字字符串
     public static String getRandom(int len) {         
            String source = "0123456789";
                 Random r = new Random();
                 StringBuilder rs = new StringBuilder();
                 for (int j = 0; j < len; j++) {
                     rs.append(source.charAt(r.nextInt(10)));
                 }
                 return rs.toString();
             }

String  ItemNumbers="前缀"+getRandom(5);


除了随机生成基础资料编码,我们在测试过程中,常常需要对请求参数进行URl编码和URL解码,进行测试和分析。在Beanshell脚本中实现URL编码和URL解码功能的方法如下。



代码如下:


/**
          * @param  the String needing  decoder
          * @return  the result of decoder
          * @Description 进行url解码
          * @Example:getURLDecoderString("%5B%2240029%22%2C%2240153%22%5D"),result:["40029","40153"]
          */
            public static String URLDecoderString(String strInput) {          
                if (null == strInput) {
                    return "";
                }
                String urldecoder = "";
                try {
                    urldecoder = java.net.URLDecoder.decode(strInput, ENCODE);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                return urldecoder;
            }
            /**
              * @param  the String needing  encoder
              * @return  the result of encoder
              * @Description 进行url编码
              * @Example:getURLEncoderString("[\"40029\",\"40153\"]"),result:%5B%2240029%22%2C%2240153%22%5D
              */
            public static String URLEncoderString(String strInput) { 
                if (null == strInput) {
                    return "";
                }
                String urlencoder = "";
                try {       
                    urlencoder = java.net.URLEncoder.encode(strInput, ENCODE);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                return urlencoder;
            }

2.2 导入Jar包

编写代码内容较多时,推荐通过导入Java的Jar包来实现。

在Java的IDE工具中(比如eclipse)写好代码,然后把该类生成Jar包(在类上【点击右键】->【Export】->【Jar file】)。

导出的Jar包放到Jmeter目录“\apache-Jmeter-2.13\lib\ext”下,或者将Jar包的路径添加到测试计划的Library中,脚本通过调用Jar包中的方法进行使用。

以苍穹人员表单中身份证字段为例,人员中身份证信息要求唯一。创建大批量的人员,需要很多不同的身份证号,可通过代码生成,但由于生成身份证的代码较长,导入Jar包是一种不错的方式。


步骤1:首先在Java的IDE中编写生成身份证的类。



步骤2:导出为Jar包。



步骤3:通过测试计划的Library进行关联。


把Jar包放到Jmeter目录“\apache-Jmeter-2.13\lib\ext”下。



步骤4:在Beanshell中导入JAR包中的类来进行调用。


2.3 导入class文件

语法source(" Java文件路径"),其中文件路径可以使用绝对路径,也可以使用相对路径。放入Jmeter的bin目录下,可直接用文件名;放入其他目录下,需写绝对路径。

此处以生成序列码的方法为例子,调用Java文件中的serialNumber方法,生成8位长度的序列码。

Beanshell示例:

source("D:\\Javafile\\serialNumber.Java");--引入外部Java文件,编写绝对路径,

或者:

source("serialNumber.Javaw"); --文件位于“Jmeter bin”目录下。


步骤1:将代码放入Java文件中—serialNumber.Java



步骤2:在Beanshell脚本中引用。



步骤3:在请求参数中引用


通过vars.put(变量名,变量值),将身份证的值存入Jmeter变量中,如vars.put(“Idcard”,”ID”),在新增人员的http请求中通过${Idcard}引用。



步骤4:Beanshell常用内置变量


Jmeter在它的Beanshell中内置了变量,用户可以通过这些变量与Jmeter进行交互,其中主要的变量及其使用方法如下:

  • log:写入信息到jmeber.log文件,使用方法:log.info(“提交成功!”);

  • ctx:该变量引用了当前线程的上下文,使用方法可参考org.apache.Jmeter.threads.JmeterContext;

  • vars-(JmeterVariables):操作Jmeter变量,这个变量实际引用了Jmeter线程中的局部变量容器(本质上是Map),它是测试用例与Beanshell交互的桥梁,常用方法:

    vars.get(String key):从Jmeter中获得变量值;

    vars.put(String key,String value):数据存到Jmeter变量中。

  • 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("formId"," im_purinbill "); 新增formId的字段,值为im_purinbill

  • prev - (SampleResult):获取前面的sample返回的信息,常用方法:getResponseDataAsString():获取响应信息。

    getResponseCode() :获取响应code。


3 Beanshell脚本的调试 

Beanshell脚本的调试没有Java IDE那么方便,我们可以通过以下方式进行调试。

3.1 查看Log viewer

Log viewer会展示Jmeter一些常规的报错信息,相当于eclipse中的控制台。



3.2 设置log.info()埋点


3.3 使用IDE工具

在Java的IDE工具调试成功,再放入Beanshell,常见的Java的IDE工具有eclipse和IntelliJ IDEA。


3.4 使用Jmeter自带的Debug Sampler

Jmeter变量都可以通过Debug Sampler跟踪,Debug Sampler会实时将变量值打印出来。


3.5 其他

在Jmeter的Beanshell中使用Map和List不能指定数据类型,包括引用Java文件的时候,Java文件也不能这样使用,Jmeter会报错。

Map<String, String> params = new HashMap<String, String>();

需改成:

Map params = new HashMap();




Jmeter高阶系列--Beanshell脚本

1 概述1.1 导语你是否遇到以下场景时,头疼该如何解决?测试场景复杂,测试入参需多样化;自动化测试灵活,参数需动态生成;操作的数据量...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息