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的函式中篇就介紹和分享完了,感謝您耐心的閱讀和一路支援巨集哥!!!