Jmeter(二十四) - 從入門到精通 - JMeter函式 - 中篇(詳解教程)

巨集哥發表於2020-09-23

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

相關文章