1、函數助手介紹
在性能測試過程中,為了模擬真實的用戶,往往我們需要讓提交的表單內容每次都發生變化,這個過程叫做參數化。
JMeter中的配置元件與前置處理器都能幫助我們實現參數化,為了能夠更好的幫助我們進行參數化,JMeter提供了一組函數來幫助我們生成需要的數據,這些函數在函數助手面板進行選擇和編輯。
當然函數助手的功能不僅僅是進行參數化,還可以幫我們進行字符編碼,格式轉化,獲取運行時參數等功能。
2、函數助手中的函數分類
JMeter中大概分為七個類型的函數:
(1)信息類
主要用於獲取一些常用的基本信息或是日志輸出控制。
__threadnum
函數:只是簡單地返回當前線程的編號。__samplerName
函數:獲取當前請求的名稱。__machineIP
函數:獲取本機的IP地址。__machineNmae
函數:返回本機的主機名。__time
函數:可以通過多種格式返回當前時間。__log
函數:會記錄一條日志,並返回函數的輸入字符串。__logn
函數:會記錄一條日志,並返回空字符串。__TestPlanName
函數:獲取當前測試計划。
(2)輸入類
主要用於從外部文件讀取數據,進行參數化。即:用於讀取文件。
__StringFromFile
函數:可以被用來從文本文件中讀取字符串,這對需要大量可變數據的測試很有用。__FileToString
函數:可以被用來讀取整個文件。每次對該函數的調用,都會讀取整個文件。__CSVRead
函數:會從CSV文件讀取一個字符串(請注意與StringFromFile 的區別)。__XPath
函數:讀取XML文件,並在文件中尋找與指定XPath相匹配的地方。每調用函數一次,就會返回下一個匹配項。到達文件末尾后,會從頭開始。
(3)計算類
用於計數、求和等操作。
__counter
函數:每次調用計數器函數都會產生一個新值,從1開始每次加1。__intSum
函數:可以被用來計算兩個或者更多整數值的和。__longSum
函數:可以被用來計算兩個或者更多長整型值的合。__Random
函數:會返回指定最大值和最小值之間的隨機數。__RandomFromMultipleVars函數
:從一組數據中提取一個數據。__RandomString
函數:生成隨機字符串。__UUID
函數:生成隨機的唯一的UUID。
(4)腳本類
主要用於調用外部腳本或是解析執行腳本,例如:groovy、beanshell等 。
__groovy
函數:執行groovy腳本。會執行傳遞給它的腳本,並返回結果。__BeanShell
函數:會執行傳遞給它的腳本,並返回結果。__javaScript
函數:可以用來執行JavaScript
代碼片段(非Java),並返回結果值。__jexl2
函數:可以用於執行JEXL2表達式,並返回執行結果。__jexl3
函數:可以用於執行JEXL3表達式,並返回執行結果。
(5)屬性類
用於讀取和設置JMeter的配置。
__property
函數:會返回一個JMeter屬性的值。如果函數找不到屬性值,而又沒有提供默認值,則它會返回屬性的名稱。__P
函數:是一個簡化版的屬性函數,目的是使用在命令行中定義的屬性。不同於函數__property
,本函數沒有提供選項用於設置保存屬性值的變量。__setProperty
函數:用於設置JMeter屬性的值。函數的默認返回值是空字符串,因此該函數可以被用在任何地方,只要對函數本身調用是正確的。
(6)變量類
對變量進行操作,主要用於驗證變量表達式引用是否正確。
__split
函數:會通過分隔符來拆分傳遞給它的字符串,並返回原始的字符串。如果分隔符緊挨在一起,那么函數就會以變量值的形式返回"?"。__V
函數:可以用於執行變量名表達式,並返回執行結果。__eval
函數:可以用來執行一個字符串表達式,並返回執行結果。如此一來,用戶就可以對字符串中的變量和函數引用做出修改。__evalVar
函數:可以用來執行保存在變量中的表達式,並返回執行結果。
(7)字符串類
用於對字符串的處理操作。
__regexFunction
函數:正則表達式函數可以使用正則表達式(用戶提供的)來解析前面的服務器響應(或者是某個變量值),函數會返回一個有模板的字符串,其中攜帶有可變的值。還可以被用來保存值,以便供后續使用。__escapeOroRegexpChars
函數:將一些Java正則表達式引擎不識別的正則式進行轉換,轉換過程中使用了ORO正則表達式庫,這個庫也支持Perl5兼容的正則表達式語法。(Perl是一種高級、通用、直譯式、動態的腳本語言,內部集成了正則表達式的功能)__char
函數:會將一串數字轉換成Unicode字符。__unescape
函數:用於反轉義Java-escaped
字符串。__unescapeHtml
函數:用於反轉義一個包含HTML實體的字符串,將其變為包含實際Unicode字符的字符串。__escapeHtml
函數:用於轉義字符串中的字符(使用HTML實體)。即:使用html coding
編碼目標字符串。__escapeXml
函數:使用XML coding
編碼目標字符串。__urldecode
函數:urlcode解碼。__urlencode
函數:編碼為urlcode。
3、常用函數介紹
(1)__Random
函數
__Random
函數會返回指定最大值和最小值之間的隨機數。
參數如下表所示:
函數參數 | 描述 | 是否必需 |
---|---|---|
最小值 | 最小數值 | 是 |
最大值 | 最大數值 | 是 |
變量名 | 重用函數計算值的引用名 | 否 |
界面如下圖:
提示:
__RandomString
函數使用同理。
(2)__counter
函數
每次調用計數器函數都會產生一個新值,從1開始每次加1。
計數器函數既可以被配置成針對每個虛擬用戶是獨立的,也可以被配置成所有虛擬用戶公用的。
如果每個虛擬用戶的計數器是獨立增長的,那么通常被用於記錄測試計划運行了多少遍。
全局計數器通常被用於記錄發送了多少次請求,計數器使用一個整數值來記錄,允許的最大值為2,147,483,647
。
計數器函數界面如下:
說明:
- 第一個參數:必須填寫
True:希望每個虛擬用戶的計數器保持獨立,與其他用戶的計數器相區別。
False:全局計數器。 - 第二個參數:非必須填寫
定義計數器函數創建值的引用名。可以這樣引用計數器的值:${refName}
。
這樣一來,就可以創建一個計數器后,在多個地方引用它的值。
(3)__time
函數
__time
函數可以通過多種格式返回當前時間。
參數如下表所示:
函數參數 | 描述 | 是否必需 |
---|---|---|
格式 | 設置時間所采用的格式 | 否 |
變量名 | 待設置變量名 | 否 |
界面如下圖:
說明:
如果省略了格式字符串,那么函數會以毫秒的形式返回當前時間。
其他情況下,當前時間會被轉成簡單日期格式,包含如下形式:
YMD = yyyyMMdd
HMS = HHmmss
YMDHMS = yyyyMMdd-HHmmss
USER1 = JMeter屬性time.USER1
USER2 = JMeter屬性time.USER2
用戶可以通過修改JMeter屬性文件,來改變時間的默認格式,例如:time.YMD=yyMMdd
。
(4)__property
函數
__property
函數會返回一個JMeter屬性的值。如果函數找不到屬性值,而又沒有提供默認值,則它會返回屬性的名稱。
參數如下表所示:
函數參數 | 描述 | 是否必需 |
---|---|---|
屬性名 | 獲取屬性值、所需的屬性名 | 是 |
變量名 | 重用函數計算值的引用名 | 否 |
默認值 | 屬性未定義時的默認值 | 否 |
界面如下圖:
示例:
${__property(user.dir)}
:返回屬性user.dir
的值;${__property(user.dir,UDIR)}
:返回屬性user.dir
的值,並保存在變量UDIR中;${__property(abcd,ABCD,atod)}
:返回屬性abcd的值 (如果屬性沒有定義,返回"atod"),並保存在變量ABCD中;${__property(abcd,,atod)}
:返回屬性abcd 的值(如果屬性沒有定義,返回"atod"),但是並不保存函數的返回值;
(5)__setProperty
函數
__setProperty
函數用於設置JMeter屬性的值。函數的默認返回值是空字符串,因此該函數可以被用在任何地方,只要對函數本身調用是正確的。
通過將函數可選的第3個參數設置為"true",函數就會返回屬性的原始值。
屬性對於JMeter是全局的,因此可以被用來在線程和線程組之間通信。
參數如下表所示:
函數參數 | 描述 | 是否必需 |
---|---|---|
屬性名 | 待設置屬性名 | 是 |
屬性值 | 屬性的值 | 是 |
True/False | 是否返回屬性原始值 | 否 |
界面如下圖:
(6)__intSum
函數
__intSum
函數:可以被用來計算兩個或者更多整數值的合。
如下圖所示:
參數如下所示:
- 第1個參數:填寫第1個整數值。必須填寫。
- 第2個參數:填寫第2個整數值。必須填寫。
- 第n個參數:填寫第n個整數值。非必須填寫。
- 最后一個參數:存儲結果的變量引用名(可選)。如果用戶指定了這一參數,那么引用名中必須包含一個非數字字母,否則它會被當成另一個整數值,而被函數用於計算。
即:引用名是可選的參數,但是引用名不能是整數值。
提示:
__longSum
函數同理。
(7)__machineName
函數
__machineName
函數返回本機的主機名。
參數如下表所示:
函數參數 | 描述 | 是否必需 |
---|---|---|
變量名 | 函數計算值的引用名 | 否 |
界面如下圖:
提示:
__machineIP
函數同理。
(8)__threadNum
函數
__threadNum
函數:只是簡單地返回當前線程的編號。
線程編號不依賴於線程組,這就意味着從函數的角度看來,某個線程組的線程#1
和另一個線程組的線程#1
是沒有區別的。
該函數沒有參數,這一函數不能用在任何配置元件中(如用戶定義的變量),原因在於配置元件是由一個獨立線程運行的。
另外在測試計划中使用也是沒有意義的。
界面如下圖所示:
4、總結
本篇文章中不演示每個函數的具體用法,因為函數具體的引用方式都相同,例如${函數名(具體參數)}
。
如果需要了解JMeter中函數助手的具體使用示例,請參考上一篇文章【使用函數助手實現參數化】。
參考: