Jmeter(二十四) – 從入門到精通 – JMeter函數 – 中篇(詳解教程)
1.簡介
在性能測試中為了真實模擬用戶請求,往往我們需要讓提交的表單內容每次都發生變化,這個過程叫做參數化。JMeter配置元件與前置處理器都能幫助我們進行參數化,但是都有局限性,為了幫助我們能夠更好地進行參數化,JMeter提供了一組函數來幫助我們參數化生成需要的數據,這些函數可以函數助手面板來進行編輯。當然函數助手的功能不僅僅是做參數化,還能幫助我們運算、字元編碼格式轉換、獲取運行時參數等功能。下面宏哥介紹和分享一下函數助手中的函數。
JMeter提供了很多函數,如果能夠熟練使用,可以為腳本帶來很多方便。可以很方便的實現一些小功能,幾乎可以用於測試計劃中的任何元件。
JMeter函數是一種特殊值,可用於除測試計劃外的任何組件。
函數調用的格式如下所示:
${__functionName(var1,var2,var3)}
其中,「__」是兩個英文半形的下劃線,functionName為函數名,括弧內是函數的參數,無參數時可以不用括弧,如${__UUID},其中參數視不同函數而定。
Tips:
如果參數包含逗號,那麼一定要使用「\」來轉義,否則JMeter會把它當作一個參數分隔符
實際使用時,可通過函數助手對話框選擇函數,設置參數後,點擊生成按鈕生成函數字元串。
2.JMeter 中的常用函數主要分為如下幾類
上一篇中,我們介紹了前四種函數類型,這一篇我們將最後兩種函數類型介紹和分享一下。
函數類型 | 函數名稱 | 函數作用 | 啟用版本 |
---|---|---|---|
腳本函數
|
__BeanShell |
執行 beanshell 腳本 | 1.X |
__javaScript |
執行 js 腳本 | 1.9 | |
字元串操作函數
|
__split |
根據分隔符拆分字元串為多個變數 | 2.0.2 |
__changeCase |
轉換大小寫 | 4.0 | |
__regexFunction |
使用正則表達式解析之前的響應結果 | 1.X | |
屬性資訊函數
|
__isPropDefined |
判斷屬性是否存在 | 4.0 |
__property |
對多個整數求和 | 1.8.1 | |
__P |
簡化的屬性函數,用於與命令行上定義的屬性一起使用 | 2.0 | |
__setProperty |
簡化的屬性函數,用於與命令行上定義的屬性一起使用 | 2.0 | |
數據輸入函數
|
__StringFromFile |
從文本文件中讀取字元串,每次調用讀取一行 | 1.9 |
__FileToString |
把文件讀取成一個字元串,每次調用都是讀取整個文件 | 2.4 | |
__CSVRead |
返回當前正在執行的執行緒的編號 | 1.9 | |
__XPath |
使用 XPath 語法匹配 XML文件 | 2.0 | |
數據計算函數
|
__counter |
計數器函數 | 1.9 |
__intSum |
對多個整數求和 | 1.8.1 | |
__longSum |
長整型求和 | 2.3.2 | |
__Random |
返回指定最大值和最小值之間的隨機整數 | 1.9 | |
__RandomDate |
返回給定開始日期和結束日期值之間的隨機日期 | 3.3 | |
_RandomString |
根據給定的字元生成指定長度的隨機字元串 | 2.6 | |
__UUID |
通用唯一標識符函數 | 2.9 | |
獲取資訊函數
|
__TestPlanName |
返回當前測試計劃的名稱 | |
__threadGroupName |
返回當前執行緒組的名稱 | 4.1 | |
__threadNum |
返回當前正在執行的執行緒的編號 | 1.X | |
__samplerName |
返回當前請求的名稱 | 2.5 | |
__log |
輸出日誌資訊 | 2.2 | |
__time |
以多種格式返回當前時間 | 2.2 |
2.1 數據計算函數
2.1.1 __counter
作為一個計數器使用,支援多執行緒(多用戶)。功能:這個函數是一個計數器,用於統計函數的使用次數,它從1開始,每調用這個函數一次它就會自動加1,它有兩個參數,第一個參數是布爾型的, 只能設置成「TRUE」或者「FALSE」,如果是TRUE,那麼每個用戶有自己的計數器,可以用於統計每個執行緒歌執行了多少次。如果是FALSE,那就 使用全局計數器,可以統計出這次測試共運行了多少次。第二個參數是「函數名稱」。
1、我們先來看看這個__counter長得是啥樣子,路徑:函數助手 > 選擇__counter ,如下圖所示:
2、關鍵參數說明
TRUE, for each user to have own counter, FALSE for a global counter:計數變數i,
Name of variable in which to store the result (optional):是否為執行緒計數器True/False
3、實例
${__counter(FALSE,i)}; 全局計數器
${__counter(TRUE,i)}; 每個用戶有自己的計數器
注意:
- 每次調用該計數器函數都會產生一個新值,從1開始每次加1。
- 計數器既可以被配置成針對每個虛擬用戶是獨立的,也可以被配置成所有虛擬用戶公用的。
- 如果每個虛擬用戶的計數器是獨立增長的,那麼通常被用於記錄測試計劃運行了多少遍。全局計數器通常被用於記錄發送了多少次請求。
- 計數器使用一個整數值來記錄,允許的最大值為 2,147,483,647。
- 目前計數器函數實例是獨立實現的(JMeter 2.1.1及其以前版本,使用一個固定的執行緒變數來跟蹤每個用戶的計數器,因此多個計數器函數會操作同一個值)。全局計數器(FALSE)的每個計數器實例都是獨立維護的。
- 該函數也有對應的配置元件:計數器,功能類似。
2.1.2__intSum
整數求和,多個數字之間用逗號分隔。用於計算多個整數的和,可以是計算正整數和負整數的和,它有N個參數,最少有3個參數,最多不限。最後一個參數是函數名稱,前面的其它參 數是要求和的整數。這個函數在函數對話框中只顯示3個參數,如果要計算多個整數,可以通過添加參數實現,不過最後一個參數一定要是函數名稱。再添加的參數 會在函數名稱後面,這個時候,需要我們手動將函數名稱參數放到最後一個。
1、我們先來看看這個__intSum長得是啥樣子,路徑:函數助手 > 選擇__intSum ,如下圖所示:
函數 __intSum
可以被用來計算兩個或者更多整數值的和。至少需要兩個整數,如果指定變數名則名稱中必須包含一個非數字字母,否則它會被當成另一個整數值,而被函數用於計算。
注意:
在 4.0 版本之前,當有多個整數時,要通過點擊添加按鈕來增加參數,但是需要注意的是,添加完參數後,點擊 生成
的函數默認是把手動添加的函數放在後面,這時需要手動調整變數名的位置,把它放到最後,否則會報錯。 在 4.0 版本之後,該問題已解決。
4.0 之前版本添加多個整數示例如下:
2.1.3__longSum
該函數用來計算兩個或更多長整型值的和,使用方法跟上面的 __intSum
函數一樣,這裡不再贅述。
1、我們先來看看這個__longSum長得是啥樣子,路徑:函數助手 > 選擇__longSum ,如下圖所示:
2、關鍵參數說明
函數參數 |
描述 |
是否必需 |
---|---|---|
第1個參數 |
第1個長整型值 |
是 |
第2個參數 |
第2個長整型值 |
是 |
第n個參數 |
第n個長整型值 |
否 |
最後一個參數 |
重用函數計算值的引用名。如果用戶指 定了這一參數,那麼引用名中必須包含一個 非數字字母,否則它會被當成另一個長整 型值,而被函數用於計算 |
否 |
3、實例
${__longSum(1,2,sum)}
2.1.4__Random
隨機數函數返回指定最大值和最小值之間的隨機整數。_Random函數是從某數據段隨機讀取數據替換參數,當需要添加多條數據記錄且某些欄位需要唯一性時使用,使用該函數隨機生成的數據是數字。
Tips:一般在新增的時候,固定字元串後加個隨機數,避免重複。當我們設置的執行緒數超過隨機數範圍時,隨機數將會重複生成
1、我們先來看看這個__Random長得是啥樣子,路徑:函數助手 > 選擇__Random ,如下圖所示:
2、關鍵參數說明
一個範圍內的最小值:即我們所要取的隨機數的最小值,上述設置為1,生成的隨機數將不會小於1
一個範圍內允許的最大值:即我們所要取的隨機數的最大值,上述設置為100,生成的隨機數將不能超過100
Name of variable in which to store the result(optional)為函數名稱名稱:這裡我們設置為random,即用於存儲在測試計劃中其他的方式使用的值
3、實例
返回 0--10 之間的隨機整數:
${__Random(1,10,var)}
2.1.5__RandomDate
返回位於給定開始日期和結束日期值之間的隨機日期。
1、我們先來看看這個__Randomdate長得是啥樣子,路徑:函數助手 > 選擇__Randomdate,如下圖所示:
2、關鍵參數說明
Format string for DateTimeFormatter (optional) (default yyyy-MM-dd):日期格式化方法,默認為yyyy-MM-dd;
Start date (optional) (default: now):為開始日期,格式必須和日期格式化方法一致,如格式化方法不填,則此處格式需為2018-02-03
,如不填則默認為現在;
End date:和Start date類似,但是此項必填;
String format of a locale (ex: fr_FR , en_EN) (optional):日期相關的地區資訊,可以不填;
Name of variable in which to store the result (optional):參數名稱,也可以不填;
3、實例
示例:
${__RandomDate(,,2050-07-08,,)} 隨機返回一個從現在到 2050-07-08 的日期,例如 2039-06-21
${__RandomDate(dd MM yyyy,,08 07 2050,,)} 返回帶有自定義格式的隨機日期,如 04 03 2034
2.1.6_RandomString
根據給定的字元,生成指定長度的隨機字元串。
1、我們先來看看這個__RandomString長得是啥樣子,路徑:函數助手 > 選擇__RandomString ,如下圖所示:
2、關鍵參數說明
Random string length
:生成的隨機字元的長度
Chars to use for random string generation
:用來生成隨機字元串的字元,可以是純數字,純字元,字元字母數字組合。
Name of variable in which to store the result (optional)
:保存結果的變數
3、實例
例如:${__RandomString(6,abcdefgh1234566,ranstr)}
隨機生成一個6位長度的字元串,並保存在變數 ranstr 中,後續可以通過 ${ranstr}
來調用。
2.1.7__UUID
通用唯一標識符函數,生成一個32位不重複的隨機字元串。
1、我們先來看看這個__UUID長得是啥樣子,路徑:函數助手 > 選擇__UUID ,如下圖所示:
2、示例:
${__UUID()}
返回結果類似:c69e0dd1-ac6b-4f2b-8d59-5d4e8743eecd
。
2.2獲取資訊函數
2.2.1__TestPlanName
用法:${__TestPlanName}
,返回當前測試計劃的名稱;
如:測試計劃名稱是 Demo.jmx
, 即返回 Demo.jmx
。注意:Save Test plan before calling __TestPlanName function(調用此函數時,必須先保存一個測試計劃)
1、我們先來看看這個__TestPlanName長得是啥樣子,路徑:函數助手 > 選擇__TestPlanName ,如下圖所示:
2、實例
2.2.2__threadGroupName
用法:${__threadGroupName}
,返回當前執行緒組的名稱,從 4.1 版本開始啟用。
該函數不能用在任何配置元件中(如用戶定義的變數),因為配置元件是由另外的獨立執行緒運行的,它也不能在測試計劃(Test Plan)中使用。
1、我們先來看看這個__threadGroupName長得是啥樣子,路徑:函數助手 > 選擇__threadGroupName,如下圖所示:
2.2.3__threadNum
用法:${__threadNum}
,返回當前正在執行的執行緒的編號,而且不依賴於執行緒組;
也就是說以這個函數的結果來看,不能區別執行緒組1的執行緒#1 和 執行緒組2的執行緒#1,如下圖所示:
不能用在配置元件 和 測試計劃中。
1、我們先來看看這個__threadNum長得是啥樣子,路徑:函數助手 > 選擇__threadNum,如下圖所示:
2.2.4__samplerName
用法:${__samplerName()}
,返回當前請求的名稱。獲取當前按sampler的名稱。
1、我們先來看看這個__samplerName長得是啥樣子,路徑:函數助手 > 選擇__samplerName ,如下圖所示:
2.2.5__log
記錄一條日誌,並返回函數的輸入字元串。
1、我們先來看看這個__log長得是啥樣子,路徑:函數助手 > 選擇__log ,如下圖所示:
可以設置不同的日誌級別,如 OUT
和 ERR
將會分別輸出記錄到 System.out
和 System.err
中。在這種情況下,輸出總是會被列印(它不依賴於當前的日誌設置)。
示例:
${__log(Message)}:寫入日誌文件,形如 "...thread Name : Message"。
${__log(Message,OUT)}:寫到控制台窗口。
${__log(${VAR},,,VAR=)}:寫入日誌文件,形如"...thread Name VAR=value"。
2.2.6__time
以多種格式返回當前時間;返回當前時間,可指定返回格式,由SimpleDateFormat類處理函數格式
- 年:yyyy
- 月:MM
- 日:dd
- 時:hh
- 分:mm
- 秒:ss
如果省略了格式字元串,那麼函數會以毫秒的形式返回當前時間。其他情況下,當前時間會被轉成簡單日期格式。
jmeter 中默認定義的時間格式屬性值有:
YMD = yyyyMMdd。
HMS = HHmmss。
YMDHMS = yyyyMMdd-HHmmss。
USER1 = JMeter屬性time.USER1。
USER2 = JMeter屬性time.USER2。
用戶可以通過修改JMeter屬性來改變默認格式,例如,time.YMD=yyMMdd。
1、我們先來看看這個__time長得是啥樣子,路徑:函數助手 > 選擇__time ,如下圖所示:
2、關鍵參數說明
Format string for DateTimeFormatter (optional) (default yyyy-MM-dd):日期格式化方法,默認為yyyy-MM-dd;
Name of variable in which to store the result (optional):參數名稱,也可以不填;
3、實例
使用示例:
${__time()} 返回'1548133155699'
${__time(YMD,)} 返回'20190122'
${__time(dd/MM/yyyy,)} 返回'22/01/2019'
3.小結
好了,今天到這裡JMeter5的函數中篇就介紹和分享完了,感謝您耐心的閱讀和一路支援宏哥!!!