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
posted @ 2020-07-22 21:28  听雨危楼  阅读(737)  评论(0编辑  收藏  举报