Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解
在使用Jmeter過程中,或多或少都會(huì)接觸些BeanShell,它會(huì)使工具的使用,變得更靈活。
Jmeter中關(guān)于BeanShell的有:
1.BeanShell Sampler 取樣器:完成Beanshell請(qǐng)求組件中定義的腳本功能;
2.BeanShell PostProcessor 后置處理器:可通過編程方式獲取對(duì)應(yīng)請(qǐng)求的響應(yīng)結(jié)果;
3.BeanShell PreProcessor 前置處理器:可通過編程方式在發(fā)起請(qǐng)求以前做預(yù)處理,比如編碼或者加密;
4.Beanshell 斷言:可通過編程方式實(shí)現(xiàn)復(fù)雜的斷言邏輯;
5.Beanshell 計(jì)時(shí)器:編碼實(shí)現(xiàn)條件定時(shí)功能;
6.BeanShell Listener 監(jiān)聽器:監(jiān)聽Beanshell運(yùn)行結(jié)果。
目前我使用較多的是前三種元件。使用過程中,就會(huì)使用一些內(nèi)置變量,所以這也是今天的主要內(nèi)容。
vars
vars 在 JMeter 內(nèi)部,映射 org.apache.jmeter.threads 的 JMeterVariables 類,官方文檔:https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html
注意點(diǎn):
- vars 提供了對(duì)當(dāng)前線程變量的讀寫能力
- 所有的 JMeter 變量都是 java字符串
- 把數(shù)據(jù)存放到一個(gè) JMeter 變量中,需要先將它轉(zhuǎn)換成字符串
getThreadName
方法聲明
public String getThreadName()
功能
獲取當(dāng)前運(yùn)行線程名
String threadName = vars.getThreadName();
log.info("threadName:" + threadName);
getIteration
方法聲明
public int getIteration()
功能
獲取線程當(dāng)前的迭代號(hào)
int itNum = vars.getIteration();
String num = String.valueOf(itNum);
log.info("itNum:" + num);
這里有個(gè)注意點(diǎn),就是在開始時(shí)候提到的,數(shù)據(jù)放到變量中,需要將數(shù)據(jù)轉(zhuǎn)換成String類型。
put
方法聲明
public void put(String key, String value)
Parameters:
key - the variable name
value - the variable value
功能
創(chuàng)建或更新字符串變量
創(chuàng)建變量
vars.put("name","溫一壺清酒");
vars.put("age","5");
String varsName = vars.get("name");
log.info("varsName:"+ varsName);
String varsAge = vars.get("age");
log.info("varsAge:"+ varsAge);注意點(diǎn):age字段值5,需要是字符串類型,否則會(huì)報(bào)錯(cuò)。
Error in method invocation: Method put( java.lang.String, int ) not found in class'org.apache.jmeter.threads.JMeterVariables'
修改變量
vars.put("name","溫一壺清酒 博客園");
String varsName = vars.get("name");
log.info("varsName:"+ varsName);
get
方法聲明
public String get(String key)
功能
獲取變量的值并將其轉(zhuǎn)換為字符串,若變量存在則將值轉(zhuǎn)換為字符串,否則返回 null
String varsSex = vars.get("sex");
log.info("varsSex:"+ varsSex);在put方法中,已經(jīng)使用了get的方法,這里列舉個(gè)獲取不到變量的情況,返回null

putObject
方法聲明
public void putObject(String key,Object value)
Parameters:
key - the variable name
value - the variable value
功能
創(chuàng)建或更新一個(gè)非字符串變量。
vars.putObject("number",8);
vars.putObject("list",[2,4,6,8,10]);
vars.putObject("array",[1,3,5,7,9,11] as int[]);
vars.putObject("map",["name":"溫一壺清酒","source":"博客園"]);
log.info("number:"+ vars.getObject("number").toString());
log.info("list:"+ vars.getObject("list").size());
log.info("array:"+ vars.getObject("array").length);
log.info("map:"+ vars.getObject("map").get("name"));
getObject
方法聲明
public Object getObject(String key)
功能
獲取變量的值(不轉(zhuǎn)換為字符串)。若變量不存在則返回null
remove
方法聲明
public Object remove(String key)
功能
刪除一個(gè)變量,并返回變量的值,若變量不存在則返回 null
vars.put("name","溫一壺清酒 博客園");
vName = vars.remove("name");
log.info("vName:"+ vName);
vSex = vars.remove("sex");
log.info("vSex:"+ vSex);

props
props 映射 java.util 的 Properties 類。java.util.Properties 這個(gè)類是線程安全的;多個(gè)線程可以共享一個(gè) Properties 對(duì)象
vars跟props的區(qū)別
- vars 是對(duì)變量進(jìn)行讀寫操作, 而 props 主要是對(duì)屬性進(jìn)行讀寫操作
- vars 只能在當(dāng)前線程組內(nèi)使用,props 可以跨線程組使用 ,因?yàn)閷傩钥梢钥缇€程組但是變量不行
- vars 只能保存 String 或者 Object,props 可以是 Hashtable 或者 Object
getProperty
方法聲明
public String getProperty(String key)
public String getProperty(String key, String defaultValue):當(dāng) key 不存在則返回默認(rèn)值
功能
用指定的key在此屬性列表中搜索屬性,如果在此屬性列表中未找到該key,則接著遞歸檢查默認(rèn)屬性列表及其默認(rèn)值。如果未找到屬性,則此方法返回 null
timeFormat = props.getProperty("jmeter.save.saveservice.timestamp_format");
log.info("timeFormat:"+ timeFormat);
propsTest = props.getProperty("jmeter.save.saveservice.timestamp");
log.info("propsTest:"+ propsTest);
propsTest = props.getProperty("jmeter.save.saveservice.timestamp","溫一壺清酒 博客園");
log.info("propsTest:"+ propsTest);
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);setProperty
方法聲明
public Object setProperty(String key,String value)
功能
設(shè)置屬性值
props.setProperty("pName","溫一壺清酒");
propsName = props.getProperty("pName");
log.info("propsName:"+ propsName);
put
方法聲明
public synchronized V put(Object key)
功能
設(shè)置屬性值,跟 setProperty 類似
props.put("pName","溫一壺清酒");
pPropsName = props.get("pName");
log.info("pPropsName:"+ pPropsName);propertyNames
方法聲明
public Enumeration<?> propertyNames()
功能
返回屬性列表中所有key的枚舉,如果在主屬性列表中未找到同名的key,則包括默認(rèn)屬性列表中不同的key
propsNames = props.propertyNames();
propsNames.each{
log.info(it)
}
size
方法聲明
public int size()
功能
返回有多少個(gè)屬性
pPropsCount = props.size();
log.info("pPropsCount:"+ pPropsCount);
remove
方法聲明
public synchronized V remove(Object key)
功能
刪除一個(gè)變量,并返回變量的值,若變量不存在則返回 null
props.put("pName","溫一壺清酒");
rName = props.remove("pName");
log.info("rName:"+ rName);
rSex = props.remove("sex");
log.info("rSex:"+ rSex);
prev
prev 提供對(duì)當(dāng)前取樣器結(jié)果的訪問能力,映射 org.apache.jmeter.samplers 的 SampleResult 類
官方文檔: https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
getResponseCode
方法聲明
public String getResponseCode()
功能
獲取響應(yīng)狀態(tài)碼
responseCode = prev.getResponseCode() ;
log.info("responseCode:" + responseCode);
2022-10-04 15:34:29,057 INFO o.a.j.u.BeanShellTestElement: responseCode:200isResponseCodeOK
方法聲明
public boolean isResponseCodeOK()
功能
判斷響應(yīng)狀態(tài)碼是否為OK對(duì)應(yīng)的狀態(tài)碼(200),結(jié)果只有true和false
responseCodeBoolean = prev.isResponseCodeOK();
log.info("responseCodeBoolean:" + responseCodeBoolean);
2022-10-04 15:36:35,077 INFO o.a.j.u.BeanShellTestElement: responseCodeBoolean:truegetThreadName
方法聲明
public String getThreadName()
功能
獲取線程名
prevThreadName = prev.getThreadName();
log.info("prevThreadName:" + prevThreadName);
2022-10-04 15:39:17,955 INFO o.a.j.u.BeanShellTestElement: prevThreadName:prevThreadName
getResponseDataAsString
方法聲明
public String getResponseDataAsString()
功能
獲取String類型的響應(yīng)結(jié)果
prevResponse = prev.getResponseDataAsString();
log.info("prevResponse:" + prevResponse);getStartTime
獲取請(qǐng)求開始時(shí)間
getEndTime
獲取請(qǐng)求結(jié)束時(shí)間
getSamplerData
獲取請(qǐng)求內(nèi)容
好了,以上就是平時(shí)經(jīng)常用到的一些內(nèi)置變量的方法,還有其他的方法,可以參考源碼或官方文檔。
到此這篇關(guān)于Jmeter BeanShell 內(nèi)置變量vars、props、prev的使用的文章就介紹到這了,更多相關(guān)Jmeter BeanShell 內(nèi)置變量內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用
網(wǎng)絡(luò)數(shù)據(jù)的基本單位永遠(yuǎn)是byte,Java NIO提供ByteBuffer作為字節(jié)的容器,但該類過于復(fù)雜,有點(diǎn)難用.本篇文章就帶大家簡(jiǎn)單了解一下 ,需要的朋友可以參考下2021-06-06
Mybatis模糊查詢和動(dòng)態(tài)sql語句的用法
今天小編就為大家分享一篇關(guān)于Mybatis模糊查詢和動(dòng)態(tài)sql語句的用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
Java設(shè)計(jì)模式之原型模式(Prototype模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之原型模式(Prototype模式)介紹,本文講解了如何使用原型模式并給出了代碼實(shí)例,需要的朋友可以參考下2015-03-03
Java實(shí)現(xiàn)直接插入排序與折半插入排序的示例詳解
這篇文章主要為大家詳細(xì)介紹了插入排序中兩個(gè)常見的排序:直接插入排序與折半插入排序。本文用Java語言實(shí)現(xiàn)了這兩個(gè)排序算法,感興趣的可以學(xué)習(xí)一下2022-06-06
Java統(tǒng)計(jì)一個(gè)字符串在另外一個(gè)字符串出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java統(tǒng)計(jì)一個(gè)字符串在另外一個(gè)字符串出現(xiàn)次數(shù)的方法,涉及java字符串遍歷、正則匹配等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
關(guān)于ArrayList初始創(chuàng)建設(shè)定長度問題
在使用ArrayList時(shí),初始化長度并不等同于直接設(shè)定數(shù)組大小,如通過構(gòu)造函數(shù)指定長度,僅僅是在內(nèi)部開辟了相應(yīng)的存儲(chǔ)空間,并不會(huì)改變ArrayList的實(shí)際元素個(gè)數(shù),即size屬性仍然為0,因此,嘗試直接訪問未實(shí)際添加元素的位置會(huì)引發(fā)異常2024-11-11
java 畫pdf用itext調(diào)整表格寬度、自定義各個(gè)列寬的方法
這篇文章主要介紹了java 畫pdf用itext調(diào)整表格寬度、自定義各個(gè)列寬的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
java動(dòng)態(tài)線程池的簡(jiǎn)單實(shí)現(xiàn)思路
本文主要介紹了java?動(dòng)態(tài)線程池的簡(jiǎn)單實(shí)現(xiàn)思路,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

