Jmeter- Beanshell语法和常用内置对象(网络整理)

在利用jmeter进行接口测试或者性能测试的时候,我们需要处理一些复杂的请求,此时就需要利用beanshell脚本了,BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法,所以它和java是可以无缝衔接的。beanshell由于内置了一些特有的变量,没法在一些集成代码工具上去调试。今天就和大家分享下常用的2个代码例子,大家可以直接拿来稍微修改下就可以使用。

Bean Shell内置变量大全

首先大家需要掌握bean shell本身自带的一些内置变量和一些方法。JMeter在其BeanShell中内置了变量,用户是通过这些变量与JMeter进行交互。

1.log 打印日志,写入信息到jmeber.log文件。

2.SampleResult 获取SampleResult对象,能通过这个对象获取想要的信息。

3.Response 获取Response对象,能通过这个对象获取响应信息。

4.Failure 查看接口调使用能否成功,假如返回false是成功的,true是失败的。

5.FailureMessage 失败信息,没有设置的时候失败信息是空的,能set这个信息。

6.ResponseData 获取response body类型是byte[]。

7.ResponseCode 返回接口code成功是200。

8.ResponseMessage 获取msg成功是OK。

9.ResponseHeaders 获取接口服务端返回的头部信息。

10.RequestHeaders 获取用户端请求的头部信息。

11.SampleLabel 获取接口请求的名称。

12.SamplerData 获取请求的url和body。

13.ctx 代表上下文信息,能直接用。

14.vars即JMeterVariables,操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),常用方法:

a) vars.get(String key):从jmeter中获得变量值;

b) vars.put(String key,String value):数据存到jmeter变量中;

15.prev 获取前面的sample返回的信息,常用方法:

a) getResponseDataAsString():获取响应信息。

b) getResponseCode() :获取响应code。

1:Beanshell的基本语法

1.1:Beanshell的For循环与集合

String a = "aaa";

int b = 111;

List list = new ArrayList();

//list集合只能保存String类型

list.add(a);

list.add(b.toString());

//普通for循环的写法

for(int i = 0; i<list.size();i++){

log.info(">>>>>>>>>>>");

log.info(list.get(i));

}

//增强for循环的写法

for(object : list){

log.info("==========");

log.info(object);

}

1.2:Beanshell的数组的写法

String[] str1 = new String[]{"aa","bb","cc"};//new一个String[]一维数组

String[][] str2 = new String[][]{{"AA","BB"},{"CC","DD"},{"EE","FF"}};

//遍历str1这个一维数组

for(int i = 0; i< str1.length ; i++){

log.info(str1[i]);

}

//遍历第二个二维数组

for (String[] strings : str2) {

for(int i = 0; i< strings.length ; i++){

log.info(strings[i]);

}

}

1.3:Beanshell定义一个函数 并调用

//定义一个方法

public void addlist(List list){

list.add("aaa");

list.add("bbb");

list.add("ccc");

}

List list = new ArrayList();

//调用方法

addlist(list);

//遍历list集合

for(int i = 0; i < list.size(); i++){

log.info(list.get(i));

}

2:Beanshell常用的内置对象

2.1:bsh.args对象获取数组参数

2.2:vars内置对象的使用

A:示例定义一个用户自定义变量

B:vars.get(String key)获取String变量

vars.put(String key,Value)放置一个Map到vars

2.3:vars内置对象put和get Object对象

如果需要获取或者放置非String类型数据 需要用putObject()和getObject()

//Beanshell vars.putObject() vars.getObject()的使用

List list = new ArrayList();

list.add("aaa");

list.add("bbb");

//putObject()可以在vars对象中放置Object类型对象

vars.putObject("list",list);

//===========================

//获取Object list对象

Object Value = vars.getObject("list");

//log.info只能输出String类型变量

log.info(Value.toString());

3:Beanshell的常用内置对象-ctx

3.1:ctx内置对象getPreviousResult()方法 调用请求/响应数据

ctx内置对象来自于JMeterContext 查看Jmeter API发现有下列get方法可以获取请求/响应数据

//SampleResult需要import对象

import org.apache.jmeter.samplers.SampleResult;

SampleResult result = ctx.getPreviousResult();

//getRequestHeaders()方法返回String字符串

String RequestHeaders = result.getRequestHeaders();

//getResponseHeaders() 返回响应headers

String ResponseHeaders = result.getResponseHeaders();

//getResponseCode() 返回响应状态码字符串

String responseCode = result.getResponseCode();

//getURL() 返回请求URL对象

URL url = result.getURL();

log.info(RequestHeaders);

log.info(RequestHeaders);

4:prev内置对象

prev是Beanshell后置处理器的内置对象 相当于ctx.getPreviousResult();

  1. 高级用法:假如我们希望线程之间共享一个变量,可以利用BeanShell来完成。

JMeter中线程间共享变量可以通过定义属性值来完成,JMeter启动时会读取一些属性文件,比如jmeter.properties、user.properties,这些属性值是可以修改的,通过BeanShell可以对其进行更改。通过props.put()来修改属性,props.get()来获取属性。

  1. jmeter中,BeanShell的使用由以下场景:

前置处理器:BeanShell PreProcessor

取样器 :BeanShell Sampler

后置处理器:BeanShell PostProcessor

Jmeter中包括多种BeanShell,用法差不多,只是作用的地方不同。

定时器:  BeanShell Timer

前置处理器:BeanShell PreProcessor,提前处理请求参数,如:加密解密等

采样器:  BeanShell Sampler

后置处理器:BeanShell PostProcessor,在请求后对返回结果进行处理

断言:   BeanShell断言,验证返回结果的正确性

监听器:  BeanShell Listener

BeanShell与JMeter的关系

JMeter提供**5**种方式使用BeanShell

•BeanShell Sampler 直接使用BeanShell来编写样例。

•BeanShell PreProcessor 在样例触发前,使用BeanShell进行加工处理。

•BeanShell PostProcessor 在样例触发后,使用BeanShell进行加工处理。

•BeanShell Assertion 使用BeanShell进行断言处理。

•BeanShell Listener 使用BeanShell做监听器

BeanShell的内置对象

jmeter自带函数获取系统当前时间

复制代码

浮点时间戳转换为标准时间

复制代码
import  java.text.SimpleDateFormat;
import  java.util.Calendar;
import  java.util.Date;
//10位的秒级时间戳
long  time1 = ${time}; //获取时间戳变量
String result1 =  new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new  Date(time1 *  1000 ));
log.info( "10位时间戳(秒)--->Date:"  +result1);

  //13位的毫秒级时间戳
//double time2 = 1515730332000d;
//String result2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2);
//System.out.println("13位数的时间戳(毫秒)--->Date:" + result2);

解析jsonlist

复制代码
//利用beanshell获取到json响应,而后经过JSONObject 和JSONArray 将数组解析,遍历数组的length以后,提取参数值
//导入json包
import  org.json.*;
//获取获取请求的返回值
String response_data = prev.getResponseDataAsString(); 
//日志打印获取请求的返回值
log.info(response_data);
//将String类型的返回值构形成JSONObject对象
JSONObject data_obj =  new  JSONObject(response_data);
//获取做为下一个请求post的参数值Province(两种方式)
//String Provincelist_str = data_obj.get("Province").toString(); 
JSONArray Provincelist_str = data_obj.getJSONArray( "Province" );
//log.info(Provincelist_str);
//获取Province数组的长度
int  len = Provincelist_str.length(); 
String strlen = Integer.toString(len);
vars.put( "MessageNum" ,strlen);
log.info(strlen);
int  i =  0 ;
for (;i < len;++i)
{
//获取 data[ i ] 数组对象
    JSONObject jsonTemp = (JSONObject)Provincelist_str.getJSONObject(i);
    switch (i)
    {
        case  0 :
        //两种提取参数的写法
        String NameItems = jsonTemp.getString( "Name" );
        // String NameItems = jsonTemp.get("Name").toString();
        // 两种打印参数的方法
        // vars.put("Name_1", jsonTemp.getString("Name")); 
        vars.put( "Name_1" , NameItems); 
        log.info(NameItems);
    }
}
相关推荐
古人诚不我欺3 小时前
jmeter常用配置元件介绍总结之函数助手
jmeter
川石课堂软件测试3 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
古人诚不我欺3 小时前
jmeter常用配置元件介绍总结之取样器
jmeter
十叶知秋3 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
我非夏日3 小时前
JMeter基础篇
jmeter
茶馆大橘12 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
土小帽软件测试18 小时前
jmeter基础01-2_环境准备-Mac系统安装jdk
java·测试工具·jmeter·macos·软件测试学习
土小帽软件测试1 天前
jmeter基础03_汉化jmeter界面
测试工具·jmeter·软件测试学习
紫晓宁1 天前
jmeter结合ansible分布式压测--3压测执行
分布式·jmeter·ansible
黑色叉腰丶大魔王1 天前
《通过 Jmeter 压测存储过程详解》
jmeter