JMeter內建了36個函式,這些函式可以通過函式助手進行編輯和測試。瞭解這些函式,不僅能提高JMeter的使用熟練度,也有助於知曉測試工具或測試框架通用的函式有哪些,在自主設計時,作為參考借鑑。
JMeter函式呼叫的寫法是${__function()}
,注意函式名前面需要新增雙下劃線字首。
__BeanShell
指令碼語言
執行BeanShell指令碼。BeanShell是Java編寫的Java原始碼直譯器,小型、免費、可嵌入,可以像寫指令碼語言一樣寫Java,無需編譯,立即執行。
示例,字串拼接:
輸入表示式後,點選Generate & Copy to clipboard
按鈕,會生成函式語法並複製到貼上板,同時輸出函式執行結果。
__char
把數字轉化成Unicode字元。
示例,數字65轉化成字元A:
__counter
統計執行緒的迭代次數。它有兩個引數:
- 第一個引數,如果為true,那麼每個執行緒單獨統計;如果為false,那麼所有執行緒合在一起統計。
- 第二個引數,變數名。
示例:
__CSVRead
從CSV檔案中讀取資料。
固定取值
始終取第n列第一行的值。
示例:
動態取值
使用next每次迭代取下一行資料。注意必須先取列,再取行。
示例:
檔案別名
給檔名起個別名。
示例:
__escapeHtml
HTML轉義。
示例:
__escapeOroRegrexChars
把一些Java正規表示式引擎不識別的正規表示式轉換一下,這樣就可以識別了。轉換過程中使用了ORO正規表示式庫。
示例:
__eval
計算表示式。
示例:
__evalVar
把表示式的結果存入變數。
示例:
__FileToString
讀取檔案全部內容,以字串形式儲存到變數中。
示例:
__intSum
int型求和。
示例:
__longSum
跟上個一樣,只是換成了long型。
__javaScript
執行JavaScript指令碼。
示例:
__jexl
JEXL全稱是Jakarta Commons Jexl,它是一種表示式語言直譯器。jexl能直接訪問JMeter中的部分變數:
- log:直接呼叫logger函式
- ctx:獲取JMeterContent物件
- vars:獲取JMeter定義的變數
- props:獲取JMeter配置屬性
- threadName:獲取JMeter執行緒名
- sampler:獲取Sampler例項
- sampleResult:獲取SamplerResult例項
- OUT:OUT.println(),類似System.out.println
示例:
__log
記錄日誌,並返回輸入的字串。
日誌級別包括:
控制檯指JMeter GUI的感嘆號開啟的控制檯;標準輸出視窗指開啟JMeter時的CMD視窗。
- OUT:列印到控制檯和標準輸出視窗,相當於System.out.print()
- ERR:列印到控制檯和標準輸出視窗,相當於System.err
- DEBUG:列印到控制檯,DEBUG級別以上
- INFO:列印到控制檯,INFO及ERROR級別
- WARN:列印到控制檯,WARN、INFO、ERROR級別
- ERROR:列印到控制檯,僅ERROR級別
後四種級別DEBUG、INFO、WARN、ERROR是否寫入JMeter的執行時日誌,需要通過jmeter.property檔案進行配置。
示例:
__logn
與上一個類似,區別是它只記錄日誌,不返回值。
__machineIP
本機的IP。
__machineName
本機的計算機名。
__P
獲取命令列中定義的屬性,預設值為1。
示例:
在非GUI方式執行測試計劃時,可以用這個函式來做引數化,由執行命令動態指定引數值,方便跟Jenkins、Maven或者Ant整合。
__property
獲取jmeter.properties檔案中設定的JMeter屬性。
示例:
__Random
隨機值。
示例:
__RandomString
隨機字串。
示例:
__regexFunction
跟後置處理器的正規表示式提取器用法一樣。
示例:
__samplerName
獲取當前sampler名稱。
__setProperty
動態設定JMeter屬性。
示例:
__split
拆分字串。
__StringFromFile
不如使用CSV Data Set Config。
__TestPlanName
獲取測試計劃的名字。
__threadNum
返回當前執行緒號,從1開始遞增。
示例:
__time
返回當前時間,由SimpleDateFormat類來處理函式格式。
- 年:yyyy
- 月:MM
- 日:dd
- 時:hh
- 分:mm
- 秒:ss
示例:
__unescape
返轉escape字元,如\r\n
轉成CRLF。
__unescapeHtml
反轉HTML,如
轉成空格。
__urldecode
反轉URL中的Unicode編碼字元,如word%22school%22
轉成word"school"
。
__urlencode
轉成Unicode編碼字元,如word"school"
轉成word%22school%22
。
__UUID
生成唯一字串。
__V
執行變數表示式並返回結果,如果需要巢狀的使用變數時,就可以用到它。
比如定義變數a1=2, b1=1
,${a1}``${b1}
都可以呼叫成功。
但是如果想通過${a${b1}}
來呼叫${a1}
就不能成功。
使用${__V(a${b1})}
等價於${__V(a1)}
等價於${a1}
就可以了。
__XPath
匹配XML檔案內容。
示例:
<?xml version="1.0" encoding="utf-8"?>
<company>
<name>
<address>
shanghai
</address>
</name>
</company>
XPath表示式/company/name/address/text()
取值shanghai。
XPath可以參考https://www.w3school.com.cn/xpath/index.asp
最近新增
除了上述36個內建函式,JMeter最近還新增了以下函式:
changeCase
改變大小寫
dateTimeConvert
日期格式轉換
digest
加密演算法,如SHA-1, SHA-256, MD5等
escapeXml
轉義XML
groovy
groovy表示式
isPropDefined
屬性是否定義
isVarDefined
變數是否定義
RandomDate
隨機日期
RandomFromMultipleVars
從多個變數中取隨機值
StringToFile
把字串寫入檔案中
timeShift
時間偏移,比如計算某一天的前三天
小結
本文對36個內建函式,以及11個新增函式進行了介紹,靈活選擇使用這些函式,能起到事半功倍的效果。函式助手可以很方便的對函式進行預覽和測試。最新最全的函式及其使用介紹可以到官網查閱:https://jmeter.apache.org/usermanual/functions.html
參考資料:
《全棧效能測試修煉寶典JMeter實戰》