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());
1 log.error("getRequestHeaders: " + prev.getRequestHeaders());
③getUrlAsString 获取 url 并转为 string 1 log.error("getUrlAsString: " + prev.getUrlAsString());
④getSamplerData 获取 sample 数据 1 log.error("getSampleData: " + prev.getSamplerData());
⑤getSampleLabel 获取 sample 名称 1 log.error("getSampleLabel: " + prev.getSampleLabel());
⑥getResponseCode 获取响应码 1 log.error("getResponseCode: " + prev.getResponseCode());
1 log.error("getResponseHeaders: " + prev.getResponseHeaders());
⑧getResponseMessage 获取响应信息 1 log.error("getResponseMessage: " + prev.getResponseMessage());
⑨getResponseDataAsString 获取响应数据并转为字符串 1 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)添加变量 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");