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);
    }
}
相关推荐
文人sec2 天前
性能测试-jmeter9-逻辑控制器、定时器压力并发
测试工具·jmeter·性能优化·模块测试
CesareCheung4 天前
JMeter分布式压力测试
分布式·jmeter·压力测试
测试界清流4 天前
jmeter使用技巧
jmeter
春时似衿里4 天前
jmeter配置数据库连接步骤
数据库·jmeter
新知图书4 天前
JMeter的安装部署
jmeter
程序员杰哥4 天前
什么是Jmeter? Jmeter工作原理是什么?
自动化测试·软件测试·python·测试工具·jmeter·职场和发展·测试用例
乐神嘎嘎嘎4 天前
Jmeter测试
jmeter
卓码软件测评4 天前
第三方软件测试机构【性能测试工具用LoadRunner还是JMeter?】
java·功能测试·测试工具·jmeter·性能优化
BatyTao5 天前
Jmeter执行数据库操作
数据库·jmeter
二宝哥5 天前
性能测试工具Jmeter之java.net.BindException: Address already in use
jmeter