JMeter 的函數是一些特殊值,函數調用的語法如下:
${__functionName(var1,var2,var3)}
解釋:
“_functionName” 匹配函數的名稱,圓括號內為函數參數,如 ${time(YMD)}。無參數的函數可以不需要圓括號,如${_threadNum}。
如果參數包含逗號,那么一定要使用“\”來轉義,否則JMeter會把它當作一個參數分隔符
例如:
${__javaScript(Math.max(2,5))},“Math.max(2,5)”被當__javascript 函數的兩個參數:`Math.max(2` 和 `5)`
Tips:一般我們可以打開函數庫,填入參數后點擊生成,自動轉義
函數庫
__time
1、函數__time可以通過多種格式返回當前時間。
2、如果省略了格式字符串,那么函數會以毫秒的形式返回當前時間。其他情況下,當前時間會被轉成簡單日期格式。包含如下形式:
- YMD = yyyyMMdd。
- HMS = HHmmss。
- YMDHMS = yyyyMMdd-HHmmss。
- USER1 = JMeter屬性time.USER1。
- USER2 = JMeter屬性time.USER2。
默認值可以通過設置適當的 JMeter 屬性來改變,例如 time.YMD=yyMMdd
__timeShift
- 第一個參數 :將顯示創建日期的格式。如yyyy-MM-dd hh:mm:ss 返回2020-01-13 11:30:36
- 第二個參數:這是日期值。默認當前時間
- 第三個參數:移位 - 表示要從日期參數的值中添加或減去多少天,幾小時或幾分鍾。如果該值未被傳遞,則不會將任何值減去或添加到日期參數的值中。
移位表達式如下所述:
- “PT20.345S”解析為“20.345秒”
- “PT15M”解析為“15分鍾”
- “PT10H”解析為“10小時”
- “P2D”解析為“2天”
- “P2DT3H4M”解析為“2天,3小時和4分鍾”
- “P-6H3M”解析為“-6小時+3分鍾”
- “-P6H3M”解析為“-6小時-3分鍾”
- “-P-6H + 3M”解析為“+6小時和-3分鍾”
這個函數一般用來創建有開始時間和結束時間的時候特別好用,免去了自己寫BeanShell的煩惱
__Random
函數__Random會返回指定最大值和最小值之間的隨機數。
例子:
${__Random(0,10)},返回一個 0 到 10 之間的隨機數
Tips:一般在新增的時候,固定字符串后加個隨機數,避免重復
__split
split 函數根據分隔符拆分傳遞給它的字符串,並返回原始字符串。如果分隔符與分隔符是相鄰的(例如,,),分割后返回“?”作為值。拆分出來的字符串將返回到 ${VAR_1},${VAR_2}…以此類推。變量的計數將返回到 ${VAR_n} 中(分割出來有3個值,VAR_n=3)
例子:
在測試計划中定義 VAR="a||c|",${__split(${VAR},VAR,|)}
這將返回 VAR 的內容,即“a||c|”並設置以下變量:
- VAR_n=4
- VAR_1=a
- VAR_2=?
- VAR_3=c
- VAR_4=?
- VAR_5=null
__setProperty
setProperty 函數用來設置 JMeter 屬性的值。函數的默認返回值是空字符串,因此在函數有效處都可以調用此函數。
可以通過設置第 3 個可選參數為“true”返回原始值。
屬性對 JMeter 來說是全局的,所以可以用在線程和線程組之間的通信上。
__BeanShell
- 第一個參數:此處寫要執行的BeanShell語句或者文件地址,必填
- 第二個參數:用於保存變量,非必填
用法舉例:
1.${__BeanShell(100*100,),結果是10000
2. ${__BeanShell(source("function.bsh"))} 在 function.bsh 中處理腳本,並返回結果
Tips:BeanShell函數和BeanShell元器件(BeanShell預處理程序,BeanShell后置處理程序,BeanShell 取樣器)效果差不多,只不過多用於簡單的語句處理
__base64Decode和__base64Encode
__base64Decode用於解密,__base64Encode用於加密(第六節有用到過)
- 第一個參數:被加密/解密的字符串
- 第二個參數:用於存儲的變量名,不必填
Tips:多用於需要加密的情況,例如正好密碼是base64
__counter
- 每次調用計數器函數都會產生一個新值,從1開始每次加1
- 第一個參數設置為TRUE,針對每個虛擬用戶是獨立的,反之所有虛擬用戶公用的
- 計數器使用一個整數值來記錄,允許的最大值為2,147,483,647。
- 計數器函數實例是完全獨立的。全局計數器 - “FALSE” - 的每個實例都是獨立維護的。
- 如果每個虛擬用戶的計數器是獨立增長的,那么通常被用於記錄測試計划運行了多少遍。全局計數器通常被用於記錄發送了多少次請求。
__intSum
存儲結果的變量名不能為有效整數,否則會被當成整數用於計算
intSum用於計算兩個或更多個整數值之和
舉例:
- ${__intSum(2,5,)},返回7
- ${__intSum(2,5,7)},返回14
__log
- 第一個參數:要記錄的字符串
- 第二個參數:日志級別,OUT,ERR,DEBUG,INFO(默認),WARN或ERROR
OUT 和ERR的日志級別,將會分別導致輸出記錄到System.out和System.err中。在這種情況下,輸出總是會被打印(它不依賴於當前的日志設置)。
例如:
- ${__log(Message)}:寫入日志文件,形如"...thread Name : Message"。
- ${__log(Message,OUT)}:寫到控制台窗口。
- ${__log(${VAR},,,VAR=)}:寫入日志文件,形如"...thread Name VAR=value"。
__property
property 函數返回 JMeter 屬性的值。如果找不到屬性值,並且沒有提供默認值,則返回屬性名稱。當提供默認值時,可以不需要函數名稱——參數可以設置為 null,並且將被忽略。
例如:
- ${__property(user.dir)} - 返回 user.dir 的值
- ${__property(user.dir,UDIR)} - 返回 user.dir 的值並保存在 UDIR 中 * ${__property(abcd,ABCD,atod)} - 返回屬性 abcd 的值(如果沒有定義,則返回“atod”)並保存在 ABCD 中
- ${__property(abcd,,atod)} - 返回屬性 abcd的值(如果未定義,則返回“atod”)但不保存
__P
這是一個簡化的屬性函數,用於在命令行中定義的屬性。與__property 函數不同,沒有選項可將值保存在變量中,如果未提供默認值,則假定為 1。選擇 1 作為假定默認值是因為它對於常見測試變量如循環次數,線程數,加速等都有效。
例如:
定義屬性值:
jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu
獲取值如下:
- ${__P(group1.threads)} - 返回 group1.threads 的值
- ${__P(group1.loops)} - 返回 group1.loops 的值
- ${__P(hostname,www.baidu.com)} - 返回屬性的值的 hostname(主機名)或 www.dummy.org 。
在上面的例子中沒有定義,第一個函數調用將返回7,第二個返回 1,最后一個將返回www.baidu.com (除非這些屬性在別處有定義!)
總結
能熟練運用函數庫,在寫腳本過程中能起到事半功倍的效果。
本節介紹了作者在工作中用的比較多的函數,以后工作中遇到好用的隨時添加進來。

