1-JMeter - Beanshell
about
beanshell是一种完全符合java语法规范的脚本语言,并且又拥有自己的语法规范,beanshell是一种松散类型的脚本语言,跟js差不多。beanshell使用java开发的小型、免费、嵌入式的java源码解释器,具有对象脚本语言的特征,beanshell执行标准的java语法和表达式,还包括一些脚本命令和语法。
简单来说,beanshell是java语言开发的脚本语言,兼容java语言;
为什么要学这个呢?因为对于复杂的接口,使用jmeter封装好的元件等,就很勉强。所以,我们要自己去码代码定义复杂逻辑,对jmeter做些扩展。
内置变量
beanshell脚本中不用定义就可以使用变量,常用的内置变量和方法:
- log:写日志到控制台和jmeter.log文件,如log.info(“xxx”)
- vars:操作jmeter变量。
- vars.get(“name”),调用jmeter中的变量。
- vars.put(“name”),向jmeter中添加变量。
- prev:获取取样器中返回的数据。
- getResponseDataAsString()获取响应信息。
- getResponseCode()获取响应code。
怎么使用呢?beanshell的脚本可以用三种方式:
- 直接编写脚本代码
- 导入外部的jar包
- 导入外部的java源文件
反正对于不会java的人来说,都挺难........
beanshell前/后置处理器
beanshell前/后置处理器的用法基本一致,也就是一个在请求前执行和请求后执行这么多分别,这里我们演示一个以请求前执行的操作,使用beanshell预处理程序来完成。
来个场景,我们访问查询库存接口,根据返回的库存数据来决定后续的访问下单接口的下单数量。如果库存小于等于500,下一件单,否则下十件单。
beanshell使用1:编写代码
刚才的场景说了两件事:
- 访问查询库存接口,使用后置处理器提取库存数
- 访问下点接口,在前置处理器中,判断应该下单的件数,然后接口请求参数中引用即可。
# 查询库存接口
http://www.neeo.cc:6002/pinter/com/getSku?id=1 # get
# 下单接口
http://www.neeo.cc:6002/pinter/com/buy # post
# 参数: param={"skuId":123,"num":10} # num就是下单数量
首先,我们在线程组内新建一个查询库存接口:
现在,需要将该接口返回的stock
值提取出来。由于是json类型的返回,所以后置处理器选择使用json提取器:
现在,有值了,接下来要干的事情就是,判断并求出stock
值,并且将这个值put到全局去,然后下单接口中引用即可。这里用到了前置处理器的"beanshell预处理程序"了:
代码如下(我不会java,如果有问题,概不负责):
// 从全局变量中提取 stock 值
String mystock = vars.get("stock");
// 由于提取的 stock 是 字符串,要先转换为整型在进行比较
int intstock = Integer.parseInt(mystock);
// 对库存值进行判断,根据实际的库存值,将得出的下单数量添加到jmeter中
if (intstock <= 500) {
vars.put("mynum", "1");
} else {
vars.put("mynum", "10");
};
把代码直接贴进去:
现在,我们在下单接口中引用即可:
Ok,编写代码的脚本完事了。
beanshell使用2:引用java源文件
如果,此时要使用beanshell对一串字符串进行md5或者sha1加密,而我们常用的内置函数助手中又没有这两个内置函数......而开发正好有这个脚本,你去找他要,他给你甩了个java源文件........没办法,君子不受嗟来之食!扯淡,看看怎么在beanshell中用吧!
这里直接说在beanshell中如何引用,来看java的源文件:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Created by li on 16/5/25.
*/
public class Md5Util {
public static String getMd5Hex(String str)
{
MessageDigest md5;
try
{
md5 = MessageDigest.getInstance("md5");
byte[] by = md5.digest(str.getBytes());
return byteToHex(by).toLowerCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace(); }
return null;
}
private static String byteToHex(byte[] by)
{
String[] hexs = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" };
StringBuffer hexMd5 = new StringBuffer();
for (int i = 0; i < by.length; ++i) {
int b = by[i];
if (b < 0)
{
b += 256;
}
int h1 = b / 16;
int h2 = b % 16;
hexMd5.append(hexs[h1]);
hexMd5.append(hexs[h2]);
}
return hexMd5.toString();
}
public static void main(String[] args){
System.out.println(getMd5Hex("abc"));
}
}
把上述代码保存为Md5Util.java
。然然后在beanshell中需要这么引用,上脚本:
// 使用 source 引入外部源文件
source("C:/Users/Anthony/Desktop/Md5Util.java");
// 使用源文件中的md5获取加密结果,abc可以替换为你想要加密的字符串
String md5 = Md5Util.getMd5Hex("abc");
// 看一下log日志就会发现成功了
log.info("----------"+md5);
// 将加密结果put到jmeter环境中
vars.put("md5", md5);
上图:
beanshell使用3:引用jar包
最后,来个引用外部jar的方式吧!
首先要有个jar包,然后将jar包添加到jmeter的测试计划中:
上代码:
// 导包
import com.lee.util.Md5Util;
// 使用
String md5 = Md5Util.getMd5Hex("abc");
// 日志打印
log.info("-----------"+md5);
// put到jmeter中
vars.put("md5", md5);
beanshell中引用代码:
好了,看到这,你可能也不甚明白,所以,我推荐你学Java.......
来看beanshell中的其他用途,用作于断言中。
beanshell断言
在beanshell中有个内置变量Failure
boolean(false表示断言成功,true表示断言失败)变量,用来控制断言,断言失败使用FailureMessage
显示失败日志。
来个需求,如下接口:
/pinter/com/getSku # get请求 参数:id=1
# 返回
{"code":"0","message":"success","data":{"skuId":523,"skuName":"ptest-523","price":"912","stock":649,"brand":"testfan"}}
判断,如果返回的stock
值大于等于500断言成功,否则失败。
新建一个线程组,并设置1个线程循环3次,添加一个HTTP取样器,然后配置后置json提取器,提取stock值:
现在,是时候来个beanshell断言了啊:
上代码:
prev.setDataEncoding("utf-8"); // 如果响应乱码,就添加这一行
// 获取json提取器中提取的stock值
String mystock = vars.get("stock");
// 转下类型
int intstock = Integer.parseInt(mystock);
// beanshell断言
if (intstock >= 500){
Failure = false; // 断言成功
}else{
Failure = true; // 断言失败
// 自定义断言信息
FailureMessage = "断言失败,stock值是: "+mystock;
};
配置和结果如下:
beanshell断言就这么简单!
欢迎斧正,that's all