Jmeter中的BeanShell工具使用
BeanShell是一个小型嵌入式Java源代码解释器,完全兼容java语法。同时BeanShell也支持javascript和python的一些语法,可谓是一个精巧、集大成的小工具,本文我们就重点说说这个小工具能在jmeter接口测试、压测过程中的一些用法。
一、BeanShell简介
1、BeanShell应用场景
- 提供的java语法,可以做复杂的逻辑或者业务场景的判断
- 可以引用开发编写好的jar包实现功能,需要借助”测试计划“模块的jar包导入功能
- 接口测试中处理关联数据
- 跨线程组共享变量
2、jmeter中的BeanShell类型
- 取样器BeanShell
- 前置处理器BeanShell
- 后置处理器BeanShell
- 定时器BeanShell
- 断言BeanShell
- 监听器BeanShell
二、BeanShell常用内置变量
1、log日志模块
提供不同等级的日志信息输出。
log.info("这是我的第一个beanshell脚本");
log.error("这是一条报错的日志");
2、vars模块
全称为JmeterVariables,表示jmeter变量,vars的变量作用域在同一线程组,不可跨线程组。
- vars.get(String key):从jmeter中获得变量值
- vars.put(String key,String value):数据输出到jmeter变量中
// 先获取token值,java语法
String aa = vars.get("token");
// 在aa的前面添加Token前缀
String token1 = "Token "+aa;
log.info(token1);
//将拼接后的数据再写回到jmeter变量中
vars.put("token",token1);
3、props模块
操作jmter属性,该变量引用了jmeter的配置信息,可获取jmeter属性,使用方法与vars类似,这个全局变量是可以跨线程组的。
props.put("name","value");//添加变量,非临时的,只要添加进去,就保存下来,一直有。
props.remove("name");//删除变量
props.get(key); //获得一个变量
4、prev模块
获取当前sample返回响应信息,常用如下:
//获取到第一个接口的返回码和返回数据
log.info(prev.getResponseCode())
log.info(prev.getResponseDataAsString())
- getThreadName获取线程名:log.error("getThreadName: " + prev.getThreadName());
- getRequestHeaders获取请求头:log.error("getRequestHeaders: " + prev.getRequestHeaders());
- getUrlAsString获取url并转为string:log.error("getUrlAsString: " + prev.getUrlAsString());
- getSamplerData获取sample数据:log.error("getSampleData: " + prev.getSamplerData());
- getSampleLabel获取sample名称:log.error("getSampleLabel: " + prev.getSampleLabel());
- getResponseCode获取响应码:log.error("getResponseCode: " + prev.getResponseCode());
- getResponseHeaders获取响应头:log.error("getResponseHeaders: " + prev.getResponseHeaders());
- getResponseMessage获取响应信息:log.error("getResponseMessage: " + prev.getResponseMessage());
- getResponseDataAsString获取响应数据并转为字符串:log.error("getResponseDataAsString: " + prev.getResponseDataAsString());
三、BeanShell常见应用场景
1、java文件处理
BeanShell是可以使用source()方法直接导入外部的java文件,并进行直接编程的。
//导入本地java文件,注意使用\\
source("E:\\3-Learning\\22-BK2301\\javademo\\mianxiangduixiang\\Student.java");
//直接调用java文件中的类生成对象,并且通过这个对象调用里面的方法
Student s= new Student();
String id =s.id;
log.error("student对象s的id属性值为:"+id);
2、导入外部jar包
从测试计划模块直接导入外部开发完成的jar包,即可导入、使用其中的类和方法。
- 添加ToImage.jar包
- 添加sun.misc.BASE64Decoder.jar包
- 定义一个变量code,用于中转存储验证码数据
BeanShell中即可直接导入使用:
import com.qf.ToImage;
//先将图像文件读入到此处,转为base64
String aaa = ToImage.GetImageStr("E:/1.png");
System.out.println(aaa);
//使用put方法将加密的图片数据输出到code变量(测试计划中定义)中
vars.put("code",aaa);
补充:也可以将jar文件放到jmeter/lib/ext目录下,重启jmeter即可使用beanshell封装import调用jar包内的方法
3、BeanShell PreProcessor
提前处理请求参数,如:图片处理,加密解密、日期处理等。
import java.text.SimpleDateFormat;
import java.util.Calendar;
Calendar cal = Calendar.getInstance();//使用默认时区时间获取一个日历
SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd");
String time1= df.format(cal.getTime());
cal.add(Calendar.DAY_OF_MONTH, +2);
String time2= df.format(cal.getTime());
vars.put("Time1",time1);
vars.put("Time2",time2);
4、BeanShell PostProcessor
可以对请求完成后的响应数据的处理,实现接口关联、数据加密处理、解决乱码、中文显示等。
下面代码实现将响应正文的unicode编码转为中文显示:
String s=new String(prev.getResponseData(),"UTF-8");
char aChar;
int len= s.length();
StringBuffer outBuffer=new StringBuffer(len);
for(int x =0; x <len;){
aChar= s.charAt(x++);
if(aChar=='\\'){
aChar= s.charAt(x++);
if(aChar=='u'){
int value =0;
for(int i=0;i<4;i++){
aChar= s.charAt(x++);
switch(aChar){
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
value=(value <<4)+aChar-'0';
break;
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
value=(value <<4)+10+aChar-'a';
break;
case'A':
case'B':
case'C':
case'D':
case'E':
case'F':
value=(value <<4)+10+aChar-'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");}}
outBuffer.append((char) value);}else{
if(aChar=='t')
aChar='\t';
else if(aChar=='r')
aChar='\r';
else if(aChar=='n')
aChar='\n';
else if(aChar=='f')
aChar='\f';
outBuffer.append(aChar);}}else
outBuffer.append(aChar);}
prev.setResponseData(outBuffer.toString());
5、BeanShell断言
验证返回结果的正确性,如下验证noticeId的长度。
if("${noticeId}".length() != 36)
{
Failure = true;
FailureMessage = "error";
}
6、BeanShell Sampler
发送beanshell请求,如下是随意写的内容,直接放在beanshell sample下。
x=2;
y=x+2;
print("just for test !");//print打印的结果可以在jmeter控制台查看
log.info(y+"");//log只能传字符串变量,log输出内容在日志可直接看
vars.put("name","test20190517");
浙公网安备 33010602011771号