为了能到远方,脚下的每一步都不|

明天是spring

园龄:2年4个月粉丝:0关注:1

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

2 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();

本文作者:明天是spring

本文链接:https://www.cnblogs.com/mingtingspring/p/18729632/jmeter-gao-jie-xi-liebeanshell-jiao-ben

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   明天是spring  阅读(30)  评论(0编辑  收藏  举报
/雪花飘落效果
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起