首页 > 系统相关 >Jmeter中beanshell常用语法总结

Jmeter中beanshell常用语法总结

时间:2022-11-05 15:25:18浏览次数:41  
标签:String vars 示例 get list 语法 beanshell Jmeter data

BeanShell前置处理器、BeanShell取样器、BeanShell后置处理器,它们之间的区别:

1、BeanShell前置处理器、BeanShell后置处理器 比 BeanShell取样器多一个重置解释器(Reset Interpreter),意思是指:对于每一次处理是不是都要进行重置;

  2、在JMeter中BeanShell取样器是当成线程处理的,所以运行时是有一定的消耗的,而使用BeanShell前置处理器、BeanShell后置处理器总体来说比BeanShell取样器消耗低,相当于少起一个线程。

关注点1:

BeanShell PreProcessor前置处理器特有函数(在发送之前运行):

示例1:获取本次请求的入参body中的内容

导包:import org.apache.jmeter.config.Arguments;     //Jmeter4.0及以上自带,需导包一次

Arguments argss = sampler.getArguments();

String argss_str = argss.getArgument(0).getValue();

log.info(argss_str);

示例2:获取本次请求的API路径

String path = sampler.getPath();

log.info(path);

 

关注点2:

BeanShell PostProcessor后置处理器特有函数(在返回相应之后运行):

示例1:获取本次请求的相应内容

String response = prev.getResponseDataAsString();
log.info(response);

 

关注点3:

Json字符串类型转为Json对象类型:

示例1:阿里的fastjson-1.2.70 jar包

导包import com.alibaba.fastjson.*;       //下载fastjson-1.2.70 jar包,放到lib目录后重启Jmeter可用

JSONObject JsonObj= JSON.parseObject(JsonStr);

示例2:org.json_1.0.0.v 版本jar包

导包 import org.json.*;
JSONObject JsonObj= new JSONObject(JsonStr);

获取Json对象中的对象、数组、字段

eg: JsonObj:{
keyinfo:{
"documentno": "PYJK20200106123456789"
},
dealinfo:[{
"businesscode": "N99"
},
{
"businesscode": "N98"
}]
}
以阿里巴巴包为例
JSONObject keyinfo = JsonObj.getJSONObject("keyinfo"); //获取json对象中的对象
String documentno = JsonObj.getJSONObject("keyinfo").getString("documentno"); //获取json对象中的字段值
JSONArray dealinfo = JsonObj.getJSONArray("dealinfo"); //获取json对象中的数组
JSONObject keyinfo = JsonObj.getJSONArray("dealinfo").getJSONObject(0); //获取json数组中的对象,索引表示第几个对象
String businesscode = JsonObj.getJSONArray("dealinfo").getJSONObject(0).getString("businesscode"); //获取数组中对象的字段值

示例3:

需求:后置处理器中提取sample返回json数据中所有name字段值,返回的json格式如下: 

{“body”:{“apps”:[{“name1”:”111”},{“name2”:”222”}]}} 

import org.json.*;
String response_data = prev.getResponseDataAsString();
JSONObject data_obj = new JSONObject(response_data);
String apps_str = data_obj.get("body").get("apps").toString();
JSONObject apps_array = new JSONArray(apps_Str);
String[] result = new String[apps_array.length()];
for(int i=0;i<apps_array.length();i++){
	JSONObject app_obj = new JSONObject(apps_array.get(i).toString());
	String name = app_obj.get("name").toString();
	result[i]=name;
	}
vars.put("result",Array.toString(result));

示例4:

import txtWrite.*;
String response_data = prev.getResponseDataAsString();
String assert_data="科目${num}";
TxtWrite writeData=new TxtWrite();
if(response_data.indexOf(assert_data)!=-1)//请求的response中有包含自定义字符,则断言结果为false
{
    Failure=false;
    String message="${__time(yyyy-MM-dd HH:mm:ss,)}   新建科目【"+assert_data+"】成功";
    FailureMessage=message;
    writeData.contentToTxt("D:/xykyInterfaceAutoTest.log",message);
    
}else
{
    Failure=true;
    String message="${__time(yyyy-MM-dd HH:mm:ss,)}   新建科目【"+assert_data+"】失败----------";
    String response="本次请求response数据:"+prev.getResponseDataAsString()+"----------";
    String need_assert="需要断言的数据:"+assert_data;
    FailureMessage=message+response+need_assert;
    writeData.contentToTxt("D:/xykyInterfaceAutoTest.log",message+response+need_assert);
}

示例5:

场景描述:

  • A接口返回值中有一个参数是数组类型且该数组中有多个值。
  • B接口参数入参也是一个数组类型且它的参数必须是A接口动态返回的数组类型中全部的数据
//注意必须导入这两个包,否则脚本运行会保存找不到这两个包提供的方法
import org.json.*;
import java.util.Collections;

public static void getValue(){
    // 接收接口返回的数据
    String response_data = prev.getResponseDataAsString();
    // 转换成JSONObject 对象类型,这样java才能操作对象里面数据
    JSONObject data_obj= new JSONObject(response_data);
    
    //判断当前响应数据是否为空,如果为空直接返回null,不再走后面的for流程。
     if (data_obj.get("data").equals(null)){
        log.info("接口返回数据列表为空");
        
    } else{
        // 获取JSONObject里面数组类型数据 data是个数组类型,将数组赋值给JSONArray
        JSONArray data_array = data_obj.getJSONArray("data");
        
        int len = data_array.length();
        // 创建List集合封装数组数据
        ArrayList ids = new ArrayList();
        // 遍历数组数据,将数据封装到集合中
        for(int i=0;i<len;i++){
            JSONObject jsonTemp =  (JSONObject)data_array.getJSONObject(i);
            ids.add(jsonTemp.get("id"));
        }
        /*
            这里非常关键,这里**也是一个坑**。
            jmeter设置变量有两个方法,它们的使用场景区别非常大,用错了就无法取到值。
            vars.put("key","value"): 该方法的value值只能是字符串类型,传入其他的类型就会报错。
            vars.putObject("key",list、Object):该方法的value值类型可以接收Object类型、List、数组类型。
            
        */
        vars.putObject("menuId",ids);
        log.info("测试========" + ids);    
    } 
}

getValue();

 

示例6:

拼接字符串

 

 JSON提取为:

 

 提取后拼接为:

 

 

 

 

关注点4:

设置变量,变量存储在Jmeter内存中,只能是字符串类型的值

示例1:设置局部变量,作用于单个线程组

vars.put("a","123");   //设置变量a为123;

vars.put("documentno", documentno); //将变量documentno 设置为局部变量
vars.put("keyinfo", keyinfo.toString()); //将对象keyinfo转为字符串设置为局部变量
示例2:获取局部变量 (在同一个线程组中可获取到)
String a = vars.get("a"); //a="123"
String documentno = vars.get("documentno"); //documentno="PYJK20200106123456789"
JSONObject keyinfo = JSON.parseObject(vars.get("keyinfo")); //将获取的keyinfo字符串转为对象

BeanShell脚本中不用定义,可以直接使用变量,常用的内置变量和方法如下:

vars:操作Jmeter变量

vars.get("goodsid");        //从Jmeter中获取${goodid}变量

vars.put("goddsid",20);   //将20保存在${goodid}变量中

prev:获取前面sampler返回的信息

getResponseDataAsString();   //获取相应信息

getResponseCode();               //获取相应code码

示例1:

//打印接口响应数据
log.info("用户列表的响应数据为"+prev.getResponseDataAsString());

#打印响应状态码
log.info("结果响应状态码"+prev.getResponseCode());

#打印当前IP内容
String IP = vars.get("host");
log.info("当前ip为:"+IP);

示例2:

//打印接口响应数据
log.info("商品sku库存接口的响应数据为"+prev.getResponseDataAsString());
//获取商品的库存值
String stock = vars.get("stock");
//因为获取到的库存值时string类型,需要转换成int
int istock = Integer.parseInt(stock);
//判断库存值是否大于500,大于500则购买10件
if(istock >10){
var.put("buynum","10");
}else{
vars.put("buynum","5");}

  

示例3:设置全局变量(作用于测试计划下的所有线程组)
props.put(); //用法与局部变量函数vars.put() 一致
示例4: 获取全局变量(测试计划下的所有线程组均可获取到)
String a = props.get("a"); //用法与局部变量函数vars.get() 一致

 

示例4:

String name1 = vars.get("name");    //获取自定义变量中name的value值
log.info(name1);

int age = 11;                     //vars.put里面只能放置Object或者String类型
String group = "北京";
vars.put("age1",age.toString());   //vars.put放置的value值需要是string类型
vars.put("group1",group);
log.info(vars.get("age1")+"==="+vars.get("group1"));

 

 

关注点5:

组建变量大对象VO
示例1:新建对象
JSONObject keyinfo = new JSONObject();
示例2:向对象中增加key-value
keyinfo.put("documentno", "PYJK20200106123456789");
示例3:新建数组
JSONArray dealinfo = new JSONArray();
示例4:向数组中增加对象,字段 ( 有先后顺序,索引 0,1,2。。)
dealinfo.add(dealinfo);
dealinfo.add(dealinfo);
dealinfo.add("aa"); //增加字段
示例5:向对象中增加对象,数组
JSONObject VO = new JSONObject();
VO.put("keyinfo", keyinfo);
VO.put("dealinfo", dealinfo);

 

关注点6:比较两个对象是否相等
以阿里巴巴jar包为例
import com.alibaba.fastjson.*;

public isObjValEqual(a_obj, b_obj){
Object a_key = a_obj.keySet(); //获取a对象中的所有键key,组成数组集合
Object b_key = b_obj.keySet(); //获取b对象中的所有键key,组成数组集合
Object key_list = maxArray(a_key, b_key); //获取长度大的数组集合
for(Object key : key_list){ //遍历每一个键key
String a_value = a_obj.get(key); //获取key对应的值
String b_value = b_obj.get(key);
if(!a_value.equals(b_value)){
log.info("两个对象中的"+key+"对应的值不一致");
return false;
}
}
return true;
}

 

关注点7:hash256,md5算法函数
导包 import org.apache.commons.codec.digest.DigestUtils; //下载org.apache.commons.codec_1.3.0.v 版本包
String md5 = DigestUtils.md5Hex(str).toLowerCase(); //Upper大写,Lower小写
String hash256= DigestUtils.sha256Hex(str).toLowerCase();

 

关注点8:Bean Shell基本语法

BeanShell的for循环集合,示例代码如下:

String a = "aaa";
int b = 111;
List list = new ArrayList();
list.add(a);
list.add(b.toString());
for(int i=0;i<list.size();i++){
	log.info(list.get(i));
	}
//增强for循环的写法
for(object:list){
	log.info(object);}

BeanShell的数组写法,示例代码如下:

String[] str1 = new String[]{"aa","bb","cc"};      //new一个String[]一维数组
String[][] str2 = new String[][]{{"AA","BB"},{"CC","DD"},{"EE","FF"}};      //new一个String[][]二维数组
//遍历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]);
		}
	}

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));
}

关注点9: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());

关注点10:BeanShell的常用内置对象-cxt

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

//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);

  

标签:String,vars,示例,get,list,语法,beanshell,Jmeter,data
From: https://www.cnblogs.com/Lily-Li/p/16859752.html

相关文章

  • Jmeter断言之Json Assertion
    现在大部分的程序都是通过json格式返回数据,所以JsonAssertion也是非常重要的一个组件添加JsonAssertion组件使用方法 ......
  • Jmeter断言之Xpath Assertion
    Xpath:XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某部分位置的语言。首先添加XpathAssertionXpathAssertion界面......
  • 总结出Java的语法特性
    子类与父类拥有一样的方法,并对象是子类型,就调用子类型的方法,是父类型,就调用父类型的方法子类与父类有相同的字段,子类的字段会代替或隐藏父类的字段,子类方法中访问的是子......
  • markdown语法
    markdown语法标题一级标题:标题前加一个#和一个空格二级标题:标题前加两个#和一个空格三级标题:标题前加三个#和一个空格四级标题:标题前加四个#和一个空格五级标题:标题......
  • 10-jmeter-初识负载测试的概念:逐步加压(阶梯式线程组)
    一、阶梯式线程组:jp@gc-SteppingThreadGroup(deprecated)->设计场景1、安装插件->将jmeter-plugins-manager-1.3放在ext目录下2、启动jmeter->在JMeterPluginsMa......
  • ElasticSearch之DSL语句的语法区别
    目录matchmatch_phrasemulti_matchtermmatch最简单的一个match例子:查询和"我的宝马多少马力"这个查询语句匹配的文档。{"query":{"match":{"conten......
  • JMeter做压力测试,先调用第一接口,拿到返回值后去调用第二个接口(小白级入门)
    1、打开界面建立线程组,并取一个名称2、线程组下创建一个http请求,并进行配置3、指定动态参数名字必须和上面第二步接口中${XXX}符号里面的名称保持一致4、添加一个响应断言5......
  • 08-jmeter-利用循环控制器进行登录访问
    一、jmeter工具如何连接数据库-->请看 06-jmeter-使用jmeter工具初访数据库1、添加循环控制器  2、添加计数器  3、添加用户参数从dbmob这个对象中,获取第f个m......
  • 3.vue的插值语法
    插值语法就是将希望显示在页面的文本渲染出来,语法是{{}},在双大括号中可以添加变量,函数,表达式1.渲染变量1<!DOCTYPEhtml>2<htmllang="en">3<head>4<m......
  • 英语语法-Conjunction连词-Adverbial Clause状语从句
    二、AdverbialClause状语从句起副词作用;分为九大类;状语的位置比较灵活,可位于句首、句末或句中;“时间”、“地点”是一对儿;“原因”、“结果”为一家;“条件”、“目的”有虚......