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();
Jmeter高阶系列--Beanshell脚本的更多相关文章
- Jmeter高阶学习,运用NotePad++编写工程,随意复制多个工程到同一个工程
Jmeter创建了工程之后,保存文件后就是一个jmx后缀的文件,你有没有试过单独用文本编辑器打开文件,编辑文件? Step1: 最简单的Jmeter工程,只有一个测试计划 <?xml versi ...
- JMeter博客系列:JMeter BeanShell示例
1.简介 Apache JMeter是一个基于Java的开源工具,使您可以在应用程序上执行功能,负载,性能和回归测试.应用程序可以在Web服务器上运行,也可以是独立的.它支持在包含静态和动态资源的客户 ...
- [SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解
目录 1.前言 2.ZMQ 块的类型 3.ZMQ 块的使用 4.DEMO 4.1 同一台电脑上的两个流程图 4.2 不同电脑上的两个流程图 4.3 作为 REQ/REP 服务器的 Python 程序 ...
- JMeter学习-033-JMeter BeanShell 脚本应用实例之参数变量修改
BeanShell脚本是JMeter自动化测试过程中不可或缺的提升技能之一,BeanShell脚本编写类似于Java脚本.它可以获取.修改系统定义或用户定义的变量值,同时也可以进行一些相应的测试数据处 ...
- 深入理解javascript函数进阶系列第一篇——高阶函数
前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...
- jmeter(四十五)常用Beanshell脚本
整理了一批jmeter常用的beanshell脚本供大家参考! 时间戳 import java.text.SimpleDateFormat; import java.util.Calendar; im ...
- 学习React系列(九)——高阶函数
定义:高阶组件就是一个函数,且该函数接收一个组件作为参数,并返回一个新的组件. (上一篇已经说过了高阶组件可以用来解决交叉问题) 一.不要改变原始组件,使用组合 class A extends Rea ...
- docker 系列 - Dock高阶知识点文章汇集
docker 技术已经研究了一段时间, 基本的知识点和使用场景比较清楚了, 还有一些比较高阶的内容未曾尝试, 将来工作中如果能用到, 再深入研究吧. 这篇博文汇总了一些有用的文章链接. ======= ...
- Python学习笔记系列——高阶函数(map/reduce)
一.map #变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数被称之为高阶函数 def add(x,y,f): return f(x)+f(y) print( ...
- react系列(二)高阶组件-HOC
高阶组件 简单来说,高阶组件可以看做一个函数,且该函数接受一个组件作为参数,并返回一个新的组件. 我在之前的博客<闭包和类>中提到一个观点,面向对象的好处就在于,易于理解,方便维护和复用. ...
随机推荐
- LeetCode解题----C语言基本库函数的使用
在做题的时候,借助标准库中的函数,可以使我们更加专注于算法和题目本身.库函数的熟练使用,有助于我们聚焦于思路,快速解决问题.因此,很有必要熟练库函数了.以下库函数是本人在做题中经常遇到使用到的库函数, ...
- 扣子Coze智能体实战:1分钟自动仿写公众号爆文,一键自动发布
大家好,我是汤师爷,专注AI智能体分享,致力于帮助100W人用智能体创富~ 你有没有遇到过这样的情况: 看到一篇爆文,想改成自己的风格却不知从何下手? 每天为公众号内容发愁,想发又怕质量不高? 文章改 ...
- 已经写了一个linux下可运行的全屏程序,如何让系统启动的时候自动起来,不要看到操作系统的桌面界面
要在Linux系统启动时自动运行你的全屏程序,并且不显示操作系统的桌面界面,你可以按照以下步骤进行设置: 1. **设置默认运行级别(或目标)**: - 对于使用Systemd的现代Linux发行版( ...
- Javascript 判断 IE 版本,实现插入不同的 Style 标签和样式
由于 IE 浏览器的兼容性问题,IE 10 以下的版本会出现兼容性问题,有时需要编写不同的样式来达到兼容的效果, 下面的代码可以实现判断 IE 版本号,并根据不同版本插入 Style CSS < ...
- Wordpress 通过 SQL 直接获取文章链接
SELECT wpp.post_title, wpp.guid, wpp.post_date, REPLACE( REPLACE( REPLACE( REPLACE( wpo.option_value ...
- Qt 嵌入浏览器 QWebEngineView实现浏览器基本功能
本篇简介 本篇的小目标: 借助Qt自家的QWebEngineView实现浏览器的基本功能:输入地址访问页面和刷新页面 定制QWebEngineView的ContextMenu,实现Inspector调 ...
- 高精密SMA型 4孔法兰连接器——专为射频玻璃绝缘子优化的毫米波互联解决方案
在毫米波通信和高端射频系统领域,连接器的性能直接影响整个系统的信号完整性.成都恒利泰专为射频玻璃绝缘子研发的SMA型法兰连接器,凭借其超宽带性能.精密机械适配性和军工级可靠性,已成为5G基站.卫星通信 ...
- false == ''在js中为何判断为true
当用==操作符将false对象和其他对象进行比较的时候 只有0和空字符串.空数组等于false: undefined和null对象并不等于false对象,而null和undefined是相等的. le ...
- IE11 不可用扩展清理路径
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Extensions
- 探店智界S7:试驾后确认就是这个范儿!
终于可以试驾智界S7了!在下定前,懂懂已经看过真车很多次,但是这一次要自己亲自驾驶智界S7,还是充满了期待和兴奋! 一踏进门店,就被里面拥挤的人群"挡住"了,原来问界M9现车刚刚到 ...