Jmeter学习-BeanShell 内置变量vars、props、prev

参考:Jmeter BeanShell 内置变量vars、props、prev的使用详解_java_脚本之家

1.介绍 

在使用Jmeter过程中,或多或少都会接触些BeanShell,它会使工具的使用,变得更灵活。

Jmeter中关于BeanShell的有:

  1.BeanShell Sampler 取样器:完成Beanshell请求组件中定义的脚本功能;

  2.BeanShell PostProcessor 后置处理器:可通过编程方式获取对应请求的响应结果;  

  3.BeanShell PreProcessor 前置处理器:可通过编程方式在发起请求以前做预处理,比如编码或者加密;

  4.Beanshell 断言:可通过编程方式实现复杂的断言逻辑;

  5.Beanshell 计时器:编码实现条件定时功能;

  6.BeanShell Listener 监听器:监听Beanshell运行结果。

目前我使用较多的是前三种元件。使用过程中,就会使用一些内置变量,所以这也是今天的主要内容。

2.vars

vars 在 JMeter 内部,映射 org.apache.jmeter.threads 的 JMeterVariables 类,官方文档:JMeterVariables (Apache JMeter dist API)

注意点:

  • vars 提供了对当前线程变量的读写能力
  • 所有的 JMeter 变量都是 java字符串
  • 把数据存放到一个 JMeter 变量中,需要先将它转换成字符串

2.1 getThreadName

方法声明
public String getThreadName()

功能
获取当前运行线程名

String threadname = vars.getThreadName();
log.info("当前ThreadName是"+threadname)

 2.2 getIteration

方法声明
public int getIteration()

功能
获取线程当前的迭代号

int iteration_num = vars.getIteration();
String iteration_num_string = String.valueOf(iteration_num);
log.info("iteration_num>>>>"+iteration_num_string);

 2.3 put/get-重点

2.3.1-put

方法声明
public void put(String key, String value)

Parameters:
key - the variable name
value - the variable value

功能
创建或更新字符串变量

创建变量

2.3.2-get 

方法声明
public String get(String key)

功能
获取变量的值并将其转换为字符串,若变量存在则将值转换为字符串,否则返回 null

//put learning
String threadname = vars.getThreadName();

vars.put("threadname",threadname);
String name = vars.get("threadname");
log.info("put-threadname:"+name);
vars.put("age","12");
String age = vars.get("age");
log.info("put-age:"+age);
 

 2.4-putObject/getObject

方法声明
public void putObject(String key,Object value)

Parameters:
key - the variable name
value - the variable value

功能
创建或更新一个非字符串变量。

方法声明
public Object getObject(String key)

功能
获取变量的值(不转换为字符串)。若变量不存在则返回null

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

vars.putObject("number",8);
log.info("number:"+vars.getObject("number").toString());
//构造map对象
Map map=new HashMap();
map.put("name","Christina");
map.put("locator","CSDN");
//putObject()可以在vars对象中放置Object类型对象
vars.putObject("map1",map);
//获取Object list对象 然后转换成string展示
log.info("map-name:"+vars.getObject("map1").get("name"));
log.info("map-locator:"+vars.getObject("map1").get("locator"));

 接口之间以列表传递

接口之间以列表传递的时候:

JSONArray arrayList= new JSONArray()

1、var.putObject("arrayList",arrayList);

2、取值

JSONArray al = vars.getObject("arrayList");
al.add("${id}");

vars.putObject("arrayList",al);

3、请求Body中  ${arrayList}直接使用  --就是一个列表

{"compareIds":${arrayList},"description":"222","producerId":"152728942957376089","moduleConfig":{"productOwner":"598096"}}

2.5 remove

方法声明
public Object remove(String key)

功能
删除一个变量,并返回变量的值,若变量不存在则返回 null

3.Props

props 映射 java.util 的 Properties 类。java.util.Properties 这个类是线程安全的;多个线程可以共享一个 Properties 对象

3.1 vars和props的区别

  • vars 是对变量进行读写操作, 而 props 主要是对属性进行读写操作
  • vars 只能在当前线程组内使用,props 可以跨线程组使用 ,因为属性可以跨线程组但是变量不行
  • vars 只能保存 String 或者 Object,props 可以是 Hashtable 或者 Object

3.2-getProperty

方法声明
public String getProperty(String key)

public String getProperty(String key, String defaultValue):当 key 不存在则返回默认值

功能
用指定的key在此属性列表中搜索属性,如果在此属性列表中未找到该key,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null

 

 3.3-setProperty

方法声明
public Object setProperty(String key,String value)

功能
设置属性值

props.setProperty("Test","testValue");
value = props.getProperty("Test");
log.info("Value:>>>>>>>>>"+value);

 3.4 put-get

3.4.1-put

方法声明
public synchronized V put(Object key)

功能
设置属性值,跟 setProperty 类似

3.4.2-get

方法声明
public synchronized V get(Object key)

功能
获取属性值,跟 getProperty 类似

pTimeFormat = props.get("jmeter.save.saveservice.timestamp_format");

log.info("pTimeFormat:"+ pTimeFormat);

pPropsTest = props.get("jmeter.save.saveservice.timestamp");

log.info("pPropsTest:"+ pPropsTest);

3.5 propertyNames

方法声明
public Enumeration<?> propertyNames()

功能
返回属性列表中所有key的枚举,如果在主属性列表中未找到同名的key,则包括默认属性列表中不同的key

 下面这部分不是很明白,后期再学习更新

propsNames = props.propertyNames();
propsNames.each{
    log.info(it)
    }

 3.6-size

方法声明
public int size()

功能
返回有多少个属性

props.setProperty("Test456","testValue");
value = props.getProperty("Test456");
log.info("Value:>>>>>>>>>"+value);

pPropsCount = props.size();
log.info("pPropsCount:<<<<<<<<<<"+ pPropsCount);

 

3.7 remove 

方法声明
public synchronized V remove(Object key)

功能
删除一个变量,并返回变量的值,若变量不存在则返回 null

props.put("Name","Christina");
Remove_Name = props.remove("Name");
log.info("Remove_Name:>>>>>>>>>"+ Remove_Name);
 
null_value = props.remove("null_value");
log.info("null_value:"+ null_value);

 

4.prev

prev 提供对当前取样器结果的访问能力,映射 org.apache.jmeter.samplers 的 SampleResult 类
官方文档: https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html

 4.1 getResponseCode

responseCode = prev.getResponseCode() ;
log.info("responseCode:" + responseCode);


 4.2 isResponseCodeOK

 方法声明
public boolean isResponseCodeOK()

功能
判断响应状态码是否为OK对应的状态码(200),结果只有true和false

res_is_ok = prev.isResponseCodeOK();
log.info("res_is_ok:>>>>>>>>>"+res_is_ok);

 
 4.3 getThreadName

方法声明
public String getThreadName()

功能
获取线程名

prevThreadName = prev.getThreadName();
log.info("prevThreadName:<><><>>" + prevThreadName);
 

 4.4 getResponseDataAsString

方法声明
public String getResponseDataAsString()

功能
获取String类型的响应结果

prevResponse = prev.getResponseDataAsString();
log.info("prevResponse:" + prevResponse);


 具体应用可以参考:Jmeter学习-beanshell之登录跨线程处理_Christina.bai的博客-CSDN博客

4.5 getStartTime and getEndTime

增加一个beanshell postprocessor

//1.获取请求响应时间,即对应的Load Time
log.info(prev.getTime().toString());

//2.获取请求连接时间,即对应的Connect Time
log.info(prev.getConnectTime().toString());

//3.获取延迟,即Latency
log.info(prev.getLatency().toString());

//4.获取请求的开始时间和结束时间,并求时间差,结果实际和Load Time一致

log.info(prev.getStartTime().toString());
log.info(prev.getEndTime().toString());
rst=prev.getEndTime()-prev.getStartTime();
log.info("时间差:"+rst);

 4.6 getSamplerData

取到post data的数据有两种方法:

1.prev.getSamplerData() //获取所有request body数据
2.prev.queryString //获取post data ,未看出这两者的区别,后续学习再更新

 

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值