Jmeter——BeanShell 內建變數vars、props、prev的使用

2022-10-10 09:00:39

在使用Jmeter過程中,或多或少都會接觸些BeanShell,它會使工具的使用,變得更靈活。

Jmeter中關於BeanShell的有:
 
  1.BeanShell Sampler 取樣器:完成Beanshell請求元件中定義的指令碼功能;

  2.BeanShell PostProcessor 後置處理器:可通過程式設計方式獲取對應請求的響應結果;  

  3.BeanShell PreProcessor 前置處理器:可通過程式設計方式在發起請求以前做預處理,比如編碼或者加密;

  4.Beanshell 斷言:可通過程式設計方式實現複雜的斷言邏輯;

  5.Beanshell 計時器:編碼實現條件定時功能;

  6.BeanShell Listener 監聽器:監聽Beanshell執行結果。

目前我使用較多的是前三種元件。使用過程中,就會使用一些內建變數,所以這也是今天的主要內容。

vars

vars 在 JMeter 內部,對映 org.apache.jmeter.threads 的 JMeterVariables 類,官方檔案:https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html

注意點:

  • vars 提供了對當前執行緒變數的讀寫能力
  • 所有的 JMeter 變數都是 java字串
  • 把資料存放到一個 JMeter 變數中,需要先將它轉換成字串

getThreadName

方法宣告
public String getThreadName()

功能
獲取當前執行執行緒名

String threadName = vars.getThreadName();

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

getIteration

方法宣告
public int getIteration()

功能
獲取執行緒當前的迭代號

int itNum = vars.getIteration();
String num = String.valueOf(itNum);
log.info("itNum:"  + num);

這裡有個注意點,就是在開始時候提到的,資料放到變數中,需要將資料轉換成String型別。

put

方法宣告
public void put(String key, String value)

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

功能
建立或更新字串變數

建立變數

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

注意點:age欄位值5,需要是字串型別,否則會報錯。

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)

功能
獲取變數的值並將其轉換為字串,若變數存在則將值轉換為字串,否則返回 null

String varsSex = vars.get("sex");
log.info("varsSex:"+ varsSex);

在put方法中,已經使用了get的方法,這裡列舉個獲取不到變數的情況,返回null

putObject

方法宣告
public void putObject(String key,Object value)

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

功能
建立或更新一個非字串變數。

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)

功能
獲取變數的值(不轉換為字串)。若變數不存在則返回null

remove

方法宣告
public Object remove(String key)

功能
刪除一個變數,並返回變數的值,若變數不存在則返回 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 這個類是執行緒安全的;多個執行緒可以共用一個 Properties 物件

vars跟props的區別

  • vars 是對變數進行讀寫操作, 而 props 主要是對屬性進行讀寫操作
  • vars 只能在當前執行緒組內使用,props 可以跨執行緒組使用 ,因為屬性可以跨執行緒組但是變數不行
  • vars 只能儲存 String 或者 Object,props 可以是 Hashtable 或者 Object

getProperty

方法宣告
public String getProperty(String key)

public String getProperty(String key, String defaultValue):當 key 不存在則返回預設值

功能
用指定的key在此屬性列表中搜尋屬性,如果在此屬性列表中未找到該key,則接著遞迴檢查預設屬性列表及其預設值。如果未找到屬性,則此方法返回 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)

功能
設定屬性值

props.setProperty("pName","溫一壺清酒");
propsName = props.getProperty("pName");
log.info("propsName:"+ propsName);

put

方法宣告
public synchronized V put(Object key)

功能
設定屬性值,跟 setProperty 類似

props.put("pName","溫一壺清酒");
pPropsName = props.get("pName");
log.info("pPropsName:"+ pPropsName);

propertyNames

方法宣告
public Enumeration<?> propertyNames()

功能
返回屬性列表中所有key的列舉,如果在主屬性列表中未找到同名的key,則包括預設屬性列表中不同的key

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

size

方法宣告
public int size()

功能
返回有多少個屬性

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

remove

方法宣告
public synchronized V remove(Object key)

功能
刪除一個變數,並返回變數的值,若變數不存在則返回 null

props.put("pName","溫一壺清酒");
rName = props.remove("pName");
log.info("rName:"+ rName);

rSex = props.remove("sex");
log.info("rSex:"+ rSex);

prev

prev 提供對當前取樣器結果的存取能力,對映 org.apache.jmeter.samplers 的 SampleResult 類
官方檔案: https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html

getResponseCode

方法宣告
public String getResponseCode()

功能
獲取響應狀態碼

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

2022-10-04 15:34:29,057 INFO o.a.j.u.BeanShellTestElement: responseCode:200

isResponseCodeOK

方法宣告
public boolean isResponseCodeOK()

功能
判斷響應狀態碼是否為OK對應的狀態碼(200),結果只有true和false

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

2022-10-04 15:36:35,077 INFO o.a.j.u.BeanShellTestElement: responseCodeBoolean:true

getThreadName

方法宣告
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型別的響應結果

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

getStartTime

獲取請求開始時間

getEndTime

獲取請求結束時間

getSamplerData

獲取請求內容

好了,以上就是平時經常用到的一些內建變數的方法,還有其他的方法,可以參考原始碼或官方檔案。