1、beanshell 是什么
BeanShell 是一个小型嵌入式 Java 源代码解释器,完全兼容 java 语法。同时 beanshell 也支持 javascript 和 python 的一些语法。
2、beanshell 常用内置变量
1)log
写入信息到 jmeber.log 文件,使用方法:log.info (“This is log info!”);
2)vars
操作 jmeter 变量,常用方法:
a) vars.get(String key):从 jmeter 中获得变量值
b) vars.put(String key,String value):数据存到 jmeter 变量中
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 获取线程名
log .error ("getThreadName: " + prev.getThreadName());
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());
log .error ("getResponseHeaders: " + prev.getResponseHeaders());
⑧getResponseMessage 获取响应信息
log .error ("getResponseMessage: " + prev.getResponseMessage());
⑨getResponseDataAsString 获取响应数据并转为字符串
log .error ("getResponseDataAsString: " + prev.getResponseDataAsString());
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)添加变量
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)自定义函数
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 文件内容
public class TestBeanShell { public String hi (String name) { return "Hi," +name; } }
②jmeter beanshell 中使用
source("D:\\test-beanshell.java" ) 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
提前处理请求参数,如:图片处理,加密解密、日期处理等。如下是时间处理
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
在请求后对返回结果进行处理,如下是在获取到考试试题后的处理,拼接答题记录
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);
//解决乱码问题
prev.setDataEncoding("utf-8" )
3)BeanShell 断言
验证返回结果的正确性,如下验证 noticeId 的长度
if ("${noticeId} " .length() != 36 ){ Failure = true ; FailureMessage = "error" ; }
4)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" );