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

Jmeter高阶系列--Beanshell脚本的更多相关文章

  1. Jmeter高阶学习,运用NotePad++编写工程,随意复制多个工程到同一个工程

    Jmeter创建了工程之后,保存文件后就是一个jmx后缀的文件,你有没有试过单独用文本编辑器打开文件,编辑文件? Step1: 最简单的Jmeter工程,只有一个测试计划 <?xml versi ...

  2. JMeter博客系列:JMeter BeanShell示例

    1.简介 Apache JMeter是一个基于Java的开源工具,使您可以在应用程序上执行功能,负载,性能和回归测试.应用程序可以在Web服务器上运行,也可以是独立的.它支持在包含静态和动态资源的客户 ...

  3. [SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解

    目录 1.前言 2.ZMQ 块的类型 3.ZMQ 块的使用 4.DEMO 4.1 同一台电脑上的两个流程图 4.2 不同电脑上的两个流程图 4.3 作为 REQ/REP 服务器的 Python 程序 ...

  4. JMeter学习-033-JMeter BeanShell 脚本应用实例之参数变量修改

    BeanShell脚本是JMeter自动化测试过程中不可或缺的提升技能之一,BeanShell脚本编写类似于Java脚本.它可以获取.修改系统定义或用户定义的变量值,同时也可以进行一些相应的测试数据处 ...

  5. 深入理解javascript函数进阶系列第一篇——高阶函数

    前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...

  6. jmeter(四十五)常用Beanshell脚本

    整理了一批jmeter常用的beanshell脚本供大家参考! 时间戳 import java.text.SimpleDateFormat; import java.util.Calendar; im ...

  7. 学习React系列(九)——高阶函数

    定义:高阶组件就是一个函数,且该函数接收一个组件作为参数,并返回一个新的组件. (上一篇已经说过了高阶组件可以用来解决交叉问题) 一.不要改变原始组件,使用组合 class A extends Rea ...

  8. docker 系列 - Dock高阶知识点文章汇集

    docker 技术已经研究了一段时间, 基本的知识点和使用场景比较清楚了, 还有一些比较高阶的内容未曾尝试, 将来工作中如果能用到, 再深入研究吧. 这篇博文汇总了一些有用的文章链接. ======= ...

  9. Python学习笔记系列——高阶函数(map/reduce)

    一.map #变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数被称之为高阶函数 def add(x,y,f): return f(x)+f(y) print( ...

  10. react系列(二)高阶组件-HOC

    高阶组件 简单来说,高阶组件可以看做一个函数,且该函数接受一个组件作为参数,并返回一个新的组件. 我在之前的博客<闭包和类>中提到一个观点,面向对象的好处就在于,易于理解,方便维护和复用. ...

随机推荐

  1. vue.js 计算属性与$watch的区别?

    作者:日知链接:https://www.zhihu.com/question/55846720/answer/331760496来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  2. ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型

    https://github.com/THUDM/ChatGLM-6B ChatGLM-6B 是一个开源的.支持中英双语的对话语言模型,基于 General Language Model (GLM)  ...

  3. Hadoop 集群配置免密 SSH 登录

    Hadoop 集群包含 1 个主节点和 3 个从节点,需要实现各节点之间的免密码登录 Hadoop集群环境 节点名称 节点IP node-01 192.168.229.21 node-02 192.1 ...

  4. bash的declare用法记录

    通过declare制作字典,并且找到字典的key,和value declare -A dict dict=( [heihei]="1 2 3 4" ) for key in ${! ...

  5. 简易数字电压表+ADC0832+串行SPI方式实现1路数据转换

    1 实物与模型 (1)为什么DO和DI引脚连在一个引脚上? 由于ADC0832在通信时并不是会同时使用DO和DI端口,并且DO和DI端口与单片机的接口是双向的,所以在设计电路中可以用一根线将DO端和D ...

  6. Json、String、Object转换

    //List<Map<String, Object>>转字符串String taxiJsonList = JSONArray.toJSONString(taxiExpendLi ...

  7. Rust异步运行时最小实现 - extreme 分享

    Rust语言通过定义了Future Trait , 奠定了异步语法的基石,而Rust的异步代码时惰性的,必须有一个运行时来驱动,Rust本身还没提供这样的实现,社区中有不少开源方案,比如tokio等. ...

  8. 183天打造行业新标杆!BOE(京东方)国内首条第8.6代AMOLED生产线提前全面封顶

    2024年9月25日,BOE(京东方)投建的国内首条第8.6代AMOLED生产线全面封顶仪式在成都市高新区举行,该生产线从开工到封顶仅用183天,以科学.高效.高质的速度再树行业新标杆.这不仅是BOE ...

  9. IPv4向IPv6平滑过渡综合技术方案

    1 过渡技术选型与概述 IPv4向IPv6的过渡通常采用双栈技术.隧道技术和协议转换技术三种主要方式.选择哪种技术取决于你的网络环境.业务需求和资源状况. 1.1 技术对比与选型建议 技术类型 适用场 ...

  10. H5开发之meta设置

    标准化H5开发的meta设置: <head> <meta charset="utf-8"> <!-- 兼容ie8浏览器 --> <meta ...