康体设备网站建设,提高搜索引擎排名,惠东县网站建设,丹东电信网站备案在利用jmeter进行接口测试或者性能测试的时候#xff0c;我们需要处理一些复杂的请求#xff0c;此时就需要利用beanshell脚本了#xff0c;BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法#xff0c;所以它和java是可以无缝衔接的。beans… 在利用jmeter进行接口测试或者性能测试的时候我们需要处理一些复杂的请求此时就需要利用beanshell脚本了BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法所以它和java是可以无缝衔接的。beanshell由于内置了一些特有的变量没法在一些集成代码工具上去调试。今天就和大家分享下常用的2个代码例子大家可以直接拿来稍微修改下就可以使用。
Bean Shell内置变量大全 首先大家需要掌握bean shell本身自带的一些内置变量和一些方法。JMeter在其BeanShell中内置了变量用户是通过这些变量与JMeter进行交互。
1.log 打印日志写入信息到jmeber.log文件。 2.SampleResult 获取SampleResult对象能通过这个对象获取想要的信息。 3.Response 获取Response对象能通过这个对象获取响应信息。 4.Failure 查看接口调使用能否成功假如返回false是成功的true是失败的。 5.FailureMessage 失败信息没有设置的时候失败信息是空的能set这个信息。 6.ResponseData 获取response body类型是byte[]。 7.ResponseCode 返回接口code成功是200。 8.ResponseMessage 获取msg成功是OK。 9.ResponseHeaders 获取接口服务端返回的头部信息。 10.RequestHeaders 获取用户端请求的头部信息。 11.SampleLabel 获取接口请求的名称。 12.SamplerData 获取请求的url和body。 13.ctx 代表上下文信息能直接用。 14.vars即JMeterVariables操作jmeter变量这个变量实际引用了JMeter线程中的局部变量容器本质上是Map常用方法 a) vars.get(String key)从jmeter中获得变量值 b) vars.put(String keyString value)数据存到jmeter变量中 15.prev 获取前面的sample返回的信息常用方法 a) getResponseDataAsString()获取响应信息。 b) getResponseCode() 获取响应code。
1Beanshell的基本语法 1.1Beanshell的For循环与集合
String a aaa; int b 111;
List list new ArrayList(); //list集合只能保存String类型 list.add(a); list.add(b.toString()); //普通for循环的写法 for(int i 0; ilist.size();i){ log.info(); log.info(list.get(i)); } //增强for循环的写法 for(object : list){ log.info(); log.info(object); }
1.2Beanshell的数组的写法
String[] str1 new String[]{aa,bb,cc};//new一个String[]一维数组
String[][] str2 new String[][]{{AA,BB},{CC,DD},{EE,FF}}; //遍历str1这个一维数组 for(int i 0; i str1.length ; i){ log.info(str1[i]); } //遍历第二个二维数组 for (String[] strings : str2) {
for(int i 0; i strings.length ; i){
log.info(strings[i]); } }
1.3Beanshell定义一个函数 并调用
//定义一个方法 public void addlist(List list){
list.add(aaa); list.add(bbb); list.add(ccc); }
List list new ArrayList(); //调用方法 addlist(list); //遍历list集合 for(int i 0; i list.size(); i){ log.info(list.get(i)); }
2Beanshell常用的内置对象 2.1bsh.args对象获取数组参数 2.2vars内置对象的使用 A示例定义一个用户自定义变量
B:vars.get(String key)获取String变量
vars.put(String key,Value)放置一个Map到vars
2.3vars内置对象put和get Object对象 如果需要获取或者放置非String类型数据 需要用putObject和getObject
//Beanshell vars.putObject() vars.getObject()的使用 List list new ArrayList();
list.add(aaa); list.add(bbb); //putObject()可以在vars对象中放置Object类型对象 vars.putObject(list,list); // //获取Object list对象 Object Value vars.getObject(list); //log.info只能输出String类型变量 log.info(Value.toString());
3Beanshell的常用内置对象-ctx 3.1ctx内置对象getPreviousResult()方法 调用请求/响应数据
ctx内置对象来自于JMeterContext 查看Jmeter API发现有下列get方法可以获取请求/响应数据
//SampleResult需要import对象 import org.apache.jmeter.samplers.SampleResult;
SampleResult result ctx.getPreviousResult(); //getRequestHeaders()方法返回String字符串 String RequestHeaders result.getRequestHeaders(); //getResponseHeaders() 返回响应headers String ResponseHeaders result.getResponseHeaders(); //getResponseCode() 返回响应状态码字符串 String responseCode result.getResponseCode(); //getURL() 返回请求URL对象 URL url result.getURL(); log.info(RequestHeaders); log.info(RequestHeaders);
4prev内置对象 prev是Beanshell后置处理器的内置对象 相当于ctx.getPreviousResult();
5. 高级用法假如我们希望线程之间共享一个变量可以利用BeanShell来完成。 JMeter中线程间共享变量可以通过定义属性值来完成JMeter启动时会读取一些属性文件比如jmeter.properties、user.properties这些属性值是可以修改的通过BeanShell可以对其进行更改。通过props.put()来修改属性props.get()来获取属性。
6. jmeter中BeanShell的使用由以下场景
前置处理器BeanShell PreProcessor 取样器 BeanShell Sampler 后置处理器BeanShell PostProcessor
Jmeter中包括多种BeanShell用法差不多只是作用的地方不同。 定时器 BeanShell Timer 前置处理器BeanShell PreProcessor提前处理请求参数如加密解密等 采样器 BeanShell Sampler 后置处理器BeanShell PostProcessor在请求后对返回结果进行处理 断言 BeanShell断言验证返回结果的正确性 监听器 BeanShell Listener
BeanShell与JMeter的关系
JMeter提供5种方式使用BeanShell
•BeanShell Sampler 直接使用BeanShell来编写样例。
•BeanShell PreProcessor 在样例触发前使用BeanShell进行加工处理。
•BeanShell PostProcessor 在样例触发后使用BeanShell进行加工处理。
•BeanShell Assertion 使用BeanShell进行断言处理。
•BeanShell Listener 使用BeanShell做监听器
BeanShell的内置对象 jmeter自带函数获取系统当前时间 浮点时间戳转换为标准时间
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
//10位的秒级时间戳
long time1 ${time}; //获取时间戳变量
String result1 new SimpleDateFormat( yyyy-MM-dd HH:mm:ss ).format( new Date(time1 * 1000 ));
log.info( 10位时间戳秒---Date: result1);//13位的毫秒级时间戳
//double time2 1515730332000d;
//String result2 new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(time2);
//System.out.println(13位数的时间戳毫秒---Date: result2);解析jsonlist
//利用beanshell获取到json响应而后经过JSONObject 和JSONArray 将数组解析遍历数组的length以后提取参数值
//导入json包
import org.json.*;
//获取获取请求的返回值
String response_data prev.getResponseDataAsString();
//日志打印获取请求的返回值
log.info(response_data);
//将String类型的返回值构形成JSONObject对象
JSONObject data_obj new JSONObject(response_data);
//获取做为下一个请求post的参数值Province(两种方式)
//String Provincelist_str data_obj.get(Province).toString();
JSONArray Provincelist_str data_obj.getJSONArray( Province );
//log.info(Provincelist_str);
//获取Province数组的长度
int len Provincelist_str.length();
String strlen Integer.toString(len);
vars.put( MessageNum ,strlen);
log.info(strlen);
int i 0 ;
for (;i len;i)
{
//获取 data[ i ] 数组对象JSONObject jsonTemp (JSONObject)Provincelist_str.getJSONObject(i);switch (i){case 0 ://两种提取参数的写法String NameItems jsonTemp.getString( Name );// String NameItems jsonTemp.get(Name).toString();// 两种打印参数的方法// vars.put(Name_1, jsonTemp.getString(Name)); vars.put( Name_1 , NameItems); log.info(NameItems);}
}