目录
BeanShell 预处理程序BeanShell PreProcessor
BeanShell后置处理程序BeanShell PostProcessor
BeanShell是Jmeter的一个脚本编辑器,可对变量等数据进行脚本化处理的容器,需要从别的元件获取入参,并做出参操作给元件调用。语句结尾需加“;”。注释和取消注释快捷键:CTRL+/
BeanShell 预处理程序BeanShell PreProcessor
用于发送请求前对数据做预处理
获取时间戳__time
${__time}获取13位毫秒时间戳
${__time(/1000,)}:获取10位时间戳
${__time(yyyy-MM-dd,)}:生成当前日期,精确到天时间戳
${__time(YMDHMS,)}:生成当前日期,精确到秒时间戳
摘要算法处理__digest
${__digest(SHA-256,${timestamp},${token},${nonce},${timestamp})}:sha256摘要处理
MD5哈希处理
需要下载custom Jmeter functions插件或者导入jar包,之后可以import或者使用函数助手
方法一.函数助手:
1)使用 ${__MD5(w12345678,)} 进行MD5加密(32位小写)
2)使用${__uppercase(,)} 转大写,最终为:${__uppercase(${__MD5(w12345678,)},)}
方法二.Beanshell:
import org.apache.commons.codec.digest.DigestUtils;
String str = "w12345678";
String sign = DigestUtils.md5Hex(str);
vars.put("pw",sign.toUpperCase());
Base64编码处理
需要下载custom Jmeter functions插件或者导入jar包,之后可以import或者使用函数助手
方法一.Beanshell:
import sun.misc.BASE64Decoder;
String str = "w12345678";
String data = new sun.misc.BASE64Encoder().encode(str.getBytes());
vars.put("Auth",data);
toUpperCase()大写处理
String SIGN = sign.toUpperCase()
BeanShell后置处理程序BeanShell PostProcessor
用于处理响应数据
添加BeanShell后置处理器:
跨线程组全局变量__setProperty()
如果要跨线程组共享参数,比如登录返回的token值,就需要该函数
上图中,${gettoken}为登录返回的token值(参考正则提取器目录),setProperty函数将${gettoken}的值赋给变量token并设为全局变量(即属性)
在线程组二引用全局变量token,格式${__property(变量名)}或者${__P(变量名)} :
线程组二调用到了token值:
跨线程组获取变量props.get()
A线程组定义全局变量:${__setProperty(token,${gettoken},)};
B线程组获取全局变量:t = props.get(“token”)
变量处理vars
不可跨线程组,可处理String和Object类型数据
处理String数据:
key2 = vars.get("key"):获取Jmeter元件中的key的值并赋给key2(key2无法给取样器调用)
vars.put(“key3”,Value):保存value的值到Jmeter元件中的变量key3(key3能给取样器调用)
处理Object数据:
vars.getObject("ID").get(0).get("RECID"):取ID对象的RECID列的第一行数据
vars.putObject("OBJECT_NAME", Object):保存对象值到OBJECT_NAME (包括 List、Map、Closure 之类)
转换为字符串.toString()
可将其他类型数据转换为字符串:变量名.toString()
vars.put("ChnlDocId",ChnlDoc.toString()):该语句中ChnlDoc为对象变量
信息输出System.out.println()
输出指定字符内容,需要双引号:
System.out.println("嘻嘻");
输出变量gettoken的值,不能直接System.out.println(gettoken):
tokenvalue = vars.get("gettoken");
System.out.println(tokenvalue);
在启动CMD窗口可以看到输出信息:
文件处理File
如下删除指定文件:
String filename = "D:/JSESSIONID.txt";
File file = new File(filename);//创建file对象
if(file.exists()){file.delete();}//exists方法判断是否存在,delete删除
文件写入FileWriter
如下将cookie和Timestamp参数写入本地文件:
FileWriter out = new FileWriter("D:/JSESSIONID.txt",true);//FileWriter类创建对象out来创建文件
out.write("${cookie}");//out调用write方法写入数据到JSESSIONID.txt文件
out.write(",");
out.write("${Timestamp}");
out.write(System.getProperty("line.separator"));//设置跨行
out.close();//关闭
如图为生成的文件:
文件缓存输出流BufferedWriter
BufferedWriter需要依赖FileWriter但是多次写入文件的速度更快
如下将cookie和Timestamp参数写入本地文件:
FileWriter fstream = new FileWriter("D:/JSESSIONID.txt",true);//FileWriter类创建对象fstream来创建文件
BufferedWriter out = new BufferedWriter(fstream);//BufferedWriter类创建对象out
out.write("${cookie}");//out调用write方法写入数据到JSESSIONID.txt文件
out.write(",");
out.write("${Timestamp}");
out.write(System.getProperty("line.separator"));//设置跨行
out.close();
fstream.close();//关闭
同样生成如下文件: