参考:Jmeter BeanShell 内置变量vars、props、prev的使用详解_java_脚本之家
在使用Jmeter过程中,或多或少都会接触些BeanShell,它会使工具的使用,变得更灵活。
Jmeter中关于BeanShell的有:
1.BeanShell Sampler 取样器:完成Beanshell请求组件中定义的脚本功能;
2.BeanShell PostProcessor 后置处理器:可通过编程方式获取对应请求的响应结果;
3.BeanShell PreProcessor 前置处理器:可通过编程方式在发起请求以前做预处理,比如编码或者加密;
4.Beanshell 断言:可通过编程方式实现复杂的断言逻辑;
5.Beanshell 计时器:编码实现条件定时功能;
6.BeanShell Listener 监听器:监听Beanshell运行结果。
目前我使用较多的是前三种元件。使用过程中,就会使用一些内置变量,所以这也是今天的主要内容。
vars 在 JMeter 内部,映射 org.apache.jmeter.threads 的 JMeterVariables 类,官方文档:JMeterVariables (Apache JMeter dist API)
注意点:
方法声明
public String getThreadName()
功能
获取当前运行线程名
String threadname = vars.getThreadName();
log.info("当前ThreadName是"+threadname)
方法声明
public int getIteration()
功能
获取线程当前的迭代号
int iteration_num = vars.getIteration();
String iteration_num_string = String.valueOf(iteration_num);
log.info("iteration_num>>>>"+iteration_num_string);
方法声明
public void put(String key, String value)Parameters:
key - the variable name
value - the variable value功能
创建或更新字符串变量创建变量
方法声明
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);
方法声明
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"}}
方法声明
public Object remove(String key)功能
删除一个变量,并返回变量的值,若变量不存在则返回 null
props 映射 java.util 的 Properties 类。java.util.Properties 这个类是线程安全的;多个线程可以共享一个 Properties 对象
- vars 是对变量进行读写操作, 而 props 主要是对属性进行读写操作
- vars 只能在当前线程组内使用,props 可以跨线程组使用 ,因为属性可以跨线程组但是变量不行
- vars 只能保存 String 或者 Object,props 可以是 Hashtable 或者 Object
方法声明
public String getProperty(String key)public String getProperty(String key, String defaultValue):当 key 不存在则返回默认值
功能
用指定的key在此属性列表中搜索属性,如果在此属性列表中未找到该key,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null
方法声明
public Object setProperty(String key,String value)功能
设置属性值
props.setProperty("Test","testValue");
value = props.getProperty("Test");
log.info("Value:>>>>>>>>>"+value);
方法声明
public synchronized V put(Object key)功能
设置属性值,跟 setProperty 类似
方法声明
public synchronized V get(Object key)功能
获取属性值,跟 getProperty 类似
|
方法声明
public Enumeration> propertyNames()功能
返回属性列表中所有key的枚举,如果在主属性列表中未找到同名的key,则包括默认属性列表中不同的key
下面这部分不是很明白,后期再学习更新
propsNames = props.propertyNames();
propsNames.each{
log.info(it)
}
方法声明
public int size()功能
返回有多少个属性
props.setProperty("Test456","testValue");
value = props.getProperty("Test456");
log.info("Value:>>>>>>>>>"+value);
pPropsCount = props.size();
log.info("pPropsCount:<<<<<<<<<<"+ pPropsCount);
方法声明
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);
prev 提供对当前取样器结果的访问能力,映射 org.apache.jmeter.samplers 的 SampleResult 类
官方文档: https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
responseCode = prev.getResponseCode() ;
log.info("responseCode:" + responseCode);
方法声明
public boolean isResponseCodeOK()功能
判断响应状态码是否为OK对应的状态码(200),结果只有true和false
res_is_ok = prev.isResponseCodeOK();
log.info("res_is_ok:>>>>>>>>>"+res_is_ok);
方法声明
public String getThreadName()功能
获取线程名
prevThreadName = prev.getThreadName();
log.info("prevThreadName:<><><>>" + prevThreadName);
方法声明
public String getResponseDataAsString()功能
获取String类型的响应结果
prevResponse = prev.getResponseDataAsString();
log.info("prevResponse:" + prevResponse);
具体应用可以参考:Jmeter学习-beanshell之登录跨线程处理_Christina.bai的博客-CSDN博客
增加一个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);
取到post data的数据有两种方法:
1.prev.getSamplerData() //获取所有request body数据
2.prev.queryString //获取post data ,未看出这两者的区别,后续学习再更新