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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步