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中函式助手的具體使用示例,請參考上一篇文章【使用函式助手實現引數化】。
參考: