Jmeter-beanshell详解

Jmeter-beanshell详解

Posted by 青夜梓藤 on 2019-01-13

1、beanshell 是什么

BeanShell 是一个小型嵌入式 Java 源代码解释器,完全兼容 java 语法。同时 beanshell 也支持 javascript 和 python 的一些语法。

2、beanshell 常用内置变量

1)log

写入信息到 jmeber.log 文件,使用方法:log.info(“This is log info!”);

2)vars

操作 jmeter 变量,常用方法:</br>
a) vars.get(String key):从 jmeter 中获得变量值</br>
b) vars.put(String key,String value):数据存到 jmeter 变量中</br>

3)ctx

引用了当前线程的上下文,使用方法参考 org.apache.jmeter.threads.JMeterContext

4)props

操作 jmter 属性,该变量引用了 jmeter 的配置信息,可获取 jmeter 属性,使用方法与 vars 类似,但是只能 put 进去 string 类型的值,不能是对象。一般用于线程组间传递变量。
线程组之间传参
props.put(“name”,”value”);添加变量,非临时的,只要添加进去,就保存下来,一直有。
props.remove(“name”);删除变量
有时线程组间获取不到值:两个线程组同时运行,还没传值就开始取
两种方案:① 测试计划中勾选独立运行 ② 线程组,添加 setUp Thread Group
prev-SampleResult

5)prev

获取当前 sample 返回信息,常用如下:

①getThreadName 获取线程名

1
log.error("getThreadName: " + prev.getThreadName());

image

②getRequestHeaders 获取请求头

image

1
log.error("getRequestHeaders: " + prev.getRequestHeaders());

③getUrlAsString 获取 url 并转为 string

1
log.error("getUrlAsString: " + prev.getUrlAsString());

image

④getSamplerData 获取 sample 数据

1
log.error("getSampleData: " + prev.getSamplerData());

image

⑤getSampleLabel 获取 sample 名称

1
log.error("getSampleLabel: " + prev.getSampleLabel());

image

⑥getResponseCode 获取响应码

1
log.error("getResponseCode: " + prev.getResponseCode());

image

⑦getResponseHeaders 获取响应头

1
log.error("getResponseHeaders: " + prev.getResponseHeaders());

image

⑧getResponseMessage 获取响应信息

1
log.error("getResponseMessage: " + prev.getResponseMessage());

image

⑨getResponseDataAsString 获取响应数据并转为字符串

1
log.error("getResponseDataAsString: " + prev.getResponseDataAsString());

image

3、beanshell 常用命令

1)print()

输出内容到命令行中。

2)show()

自动显示你打入的每一行。

3)source(),run()

读一个 bsh 脚本到当前解释器(interpreter)中,或者在新的解释器中运行这个脚本

4)load(),save()

从文件中加载一个序列化对象(serializable object),或者把它保存到文件中

5)cd(),cat(),dir(),pwd(),etc

类似于 Unix 中的命令

4、beanshell 常见用法

1)添加变量

1
2
3
4
5
6
7
8
import java.util.*;
import java.text.*;

Date d = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = df.format(d);
log.info("CureentDte:"+str);
vars.put("CureentDte",str);

2)自定义函数

1
2
3
4
5
6
7
getDateStr(String format){
DateFormat df = new SimpleDateFormat(format);
return df.format(new Date());
}
dateStr = getDateStr("yyyy-MM-dd");
print(dateStr);
var.put("current_date",dateStr);

3)引入外部 java 文件

①test-beanshell.java 文件内容

1
2
3
4
5
public class TestBeanShell{
public String hi(String name){
return "Hi,"+name;
}
}

②jmeter beanshell 中使用

1
2
3
4
source("D:\\test-beanshell.java");//只能导入.java文件,转义windows路径需要2个\
TestBeanShell shell = new TestBeanShell();
String getMsg = shell.hi("marly");
log.info(getMsg);

4)导入外部 jar 包

① 在 eclipse 写好代码,然后把该类打成 jar 包(在类上点击右键->Export->jar file)

② 把 jar 包放到 jmeter 目录\apache-jmeter-2.13\lib\ext 下

③ 打开 jmeter,添加一个 http sampler,在 sampler 下添加一个 BeanShell Sampler

④ 在 BeanShell 中的头文件中导入该 jar 包,例 import testmail.src.hyq.utils.*

5、beanshell 应用

1)BeanShell PreProcessor

提前处理请求参数,如:图片处理,加密解密、日期处理等。如下是时间处理

1
2
3
4
5
6
7
8
9
10
11
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);

2)BeanShell PostProcessor

在请求后对返回结果进行处理,如下是在获取到考试试题后的处理,拼接答题记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.lang.reflect.Array;

String getExamRecord = "";
int length = ${getMnExamInfo_matchNr} + 1 ;
for(int i=1;i<length;i++)
{
try{
String tempVar = "getMnExamInfo_" + String.valueOf(i);
String tempVar2 = vars.get(tempVar);

if(null != tempVar2)
{
getExamRecord += "${projectId}" + "," + tempVar2 + ",A;" ;
}
else
{
log.error("tempVar2是空的,i="+String.valueOf(i));
}

}catch(Exception e ){
vars.put("error",e.getMessage());
}
}
vars.put("examMnRecord",getExamRecord);

//解决乱码问题

1
prev.setDataEncoding("utf-8");

3)BeanShell 断言

验证返回结果的正确性,如下验证 noticeId 的长度

1
2
3
4
5
if("${noticeId}".length() != 36)
{
Failure = true;
FailureMessage = "error";
}

4)BeanShell Sampler

发送 beanshell 请求,如下是随意写的内容,直接放在 beanshell sample 下

1
2
3
4
5
x=2;
y=x+2;
print("just for test !");//print打印的结果可以在jmeter控制台查看
log.info(y+"");//log只能传字符串变量,log输出内容在日志可直接看
vars.put("name","test20190517");