BeanShell(二)

BeanShell使用

BeanShell是一种完全符合java语法规范的脚本语言,也就是java源代码解释器

有如下几种BeanShell

  • 定时器
  • BeanShell取样器

BeanShell取样器

调用Java方法有三种:

第一种:jar 包

步骤如下:

  • 在 idea 工具里面调试好算法
  • 打 jar 包 (待学习)
  • 在 jmeter 里面引入jar包
  • 在 BeanShell 里面写好算法,进行调用
import testmd5.MD5

String newpwd = '123456';
MD5 getMD5 = new MD5();
String res = getMd5.GetMD5Code(newpwd);
vars.put("resnewpwd", res);    // vars 用来设置变量方便后面引用;put 将数据保存到 jmeter 变量中,把 res 保存到 resnewpwd中
System.out.println(res);

第二种:引入 java 源文件

示例:

source(" java文件路径")           // 其中java文件路径可以使用绝对路径,也可以使用相对路径
source("D:\workspace\jmeter\src\jmeter\RsaUtil.java");

或者

     source("RsaUtil.java");  //文件位于jmeter bin目录下
     String password= RsaUtil.encrpty("keeplovejava");

调用 class 文件

语法:
      addClassPath("class文件所在目录");
      import 类名;

示例:

addClassPath("D:");     //可以是父级目录或者祖先级目录
import com.RsaUtil;
String password= RsaUtil.encrpty("keeplovejava");
//引入class文件的path路径跟引入java文件不同,对比如下:
source("D:\workspace\jemter\src\jmeter\RsaUtil.java");   //使用绝对路径时必须要指定文件的完整路径。
addClassPath("D:");       //class文件只要在D盘中就可以,不一定在D盘根目录中,不用指定完整路径。

BeanShell常用变量

  • log :用于打印日志
log.info("This is log info!");
  • vars: 对变量进行读写操作
vars.get(key);              //获取变量值
vars.put(key, val);       //给变量赋值
vars.putObject(“user”,new UserDto());
  • prev:获取前面sampler返回的信息
prev.getResponseDataAsString():获取响应信息
prev.getResponseCode():获取响应code

BeanShell断言

内置变量
Failure:是否失败,boolean类型
FailureMessage:失败日志,在断言失败时显示

int iStock = Integer.parseInt(vars.get("p_stock"));
if (iStock > 1500){
	Failure = true;
	FailureMessage = "库存数量超过了1500";
	// ResponseData是服务器返回的byte[]类型的数据
	// 如果想打印,必须转换为String类型的,用new String(ResponseData)
	log.info(new String(ResponseData));
	//打印当前请求的url, SamplerData是String类型的数据
	log.info(SamplerData);
}

BeanShell写数据到文件

需求
1、调用登录接口,获取token值 2、将token值保存到一个文件里

String line = vars.get("num")+","+vars.get("token");

try {
	BufferedWriter writer = new BufferedWriter(new FileWriter("/Users/***/Desktop/output.txt",true));
	writer.write(line);
	writer.newLine();
	writer.close();
} catch (IOException e) {
	e.printStackTrace();
}

image

常用Bean Shell 脚本

  • 获取接口响应数据,并设置变量
    获取 第二层的 applicationId 和 id,当不存在 applicationId 字段时,设置 applicationId = ""
// 需要在 jmeter/lib/ext 下放置一个 fastjson.jar 包
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.*;

String responseCode = prev.getResponseCode();

//判断接口返回是OK的,如果返回200,则开始取值,否则返回false
if(responseCode.equals("200")){
	//获取请求返回值。赋予字符串String 变量
	String response = prev.getResponseDataAsString();
//	log.info("1111111-----" + response);
        // 将string的值转换成成 Jsonobject 对象
	JSONObject response_obj= JSONObject.parseObject(response);
//	log.info("222222-----" + response_obj);
        // 获取 Jsonobject 对象中的 data 对象
	JSONObject data = response_obj.getJSONObject("data");
//	log.info("333333-----" + data);
        // 获取 data 对象 的列表
	JSONArray  dataArry = data.getJSONArray("data");
//	log.info("444444-----" + dataArry);
        // 获取列表的长度
	int size = dataArry.size();
//	log.info("555-----" + size);
        // 在长度范围内随机取一个整数
	int nextInt = new Random().nextInt(size - 1);
//	log.info("6666-----" + nextInt);
     //JSONObject object2 = (JSONObject)dataArry.get(nextInt);
        // 列表获取该随机整数对应下标的值(得到字符串)
        String string = dataArry.getString(nextInt);
//	log.info("7777-----" + string);
        // 将字符串转成json 对象
	JSONObject jsonObject2 = JSONObject.parseObject(string);
//	log.info("0000000-----" + jsonObject2);
	// json 对象取字段值,得到字符串,没有字段时,值为 null
        String applicationId = jsonObject2.getString("applicationId");
        String flowInstanceId = jsonObject2.getString("id");
	log.info("applicationId-----" + applicationId);
	log.info("flowInstanceId-----" + flowInstanceId);
	if(applicationId!=null){
		vars.put("applicationId",applicationId);
	}else{
		vars.put("applicationId","");
	}
	vars.put("flowInstanceId",flowInstanceId);
}

Bean Shell 断言

部分情况下,Jmeter自带的断言功能不足以满足所有场景,因此需要Bean Shell断言来自定义断言

在http sample下添加一个beanShell断言

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.*;

String response_code = prev.getResponseCode();
if(response_code.equals("200")){
	String response = prev.getResponseDataAsString();//获取接口返回的response数据 
	// 将string的值转换成成 Jsonobject 对象
//	log.info("1111111-----" + response);
	JSONObject response_obj= JSONObject.parseObject(response);
	
	String code = response_obj.getString("code");
	String msg = response_obj.getString("msg");
	if(code.equals("0")){
		Failure = false;
	}else if(code.equals("99999")&&msg.equals("起草人已撤回或废弃流程!")){
		Failure = false;
	}else{
		Failure = true;
	}
	
}else{
	Failure = true;	//直接判断失败 表示接口跑失败,在结果树中sample是红色的 
}

posted @ 2021-07-09 20:29  DeyouKong  阅读(66)  评论(0编辑  收藏  举报