『動善時』JMeter基礎 — 28、JMeter函式助手詳解

繁華似錦Fighting發表於2021-05-30

1、函式助手介紹

在效能測試過程中,為了模擬真實的使用者,往往我們需要讓提交的表單內容每次都發生變化,這個過程叫做引數化。

JMeter中的配置元件與前置處理器都能幫助我們實現引數化,為了能夠更好的幫助我們進行引數化,JMeter提供了一組函式來幫助我們生成需要的資料,這些函式在函式助手皮膚進行選擇和編輯。

當然函式助手的功能不僅僅是進行引數化,還可以幫我們進行字元編碼,格式轉化,獲取執行時引數等功能。

2、函式助手中的函式分類

JMeter中大概分為七個型別的函式:

(1)資訊類

主要用於獲取一些常用的基本資訊或是日誌輸出控制。

  1. __threadnum函式:只是簡單地返回當前執行緒的編號。
  2. __samplerName函式:獲取當前請求的名稱。
  3. __machineIP函式:獲取本機的IP地址。
  4. __machineNmae函式:返回本機的主機名。
  5. __time函式:可以通過多種格式返回當前時間。
  6. __log函式:會記錄一條日誌,並返回函式的輸入字串。
  7. __logn函式:會記錄一條日誌,並返回空字串。
  8. __TestPlanName函式:獲取當前測試計劃。

(2)輸入類

主要用於從外部檔案讀取資料,進行引數化。即:用於讀取檔案。

  1. __StringFromFile函式:可以被用來從文字檔案中讀取字串,這對需要大量可變資料的測試很有用。
  2. __FileToString函式:可以被用來讀取整個檔案。每次對該函式的呼叫,都會讀取整個檔案。
  3. __CSVRead函式:會從CSV檔案讀取一個字串(請注意與StringFromFile 的區別)。
  4. __XPath函式:讀取XML檔案,並在檔案中尋找與指定XPath相匹配的地方。每呼叫函式一次,就會返回下一個匹配項。到達檔案末尾後,會從頭開始。

(3)計算類

用於計數、求和等操作。

  1. __counter函式:每次呼叫計數器函式都會產生一個新值,從1開始每次加1。
  2. __intSum函式:可以被用來計算兩個或者更多整數值的和。
  3. __longSum函式:可以被用來計算兩個或者更多長整型值的合。
  4. __Random函式:會返回指定最大值和最小值之間的隨機數。
  5. __RandomFromMultipleVars函式:從一組資料中提取一個資料。
  6. __RandomString函式:生成隨機字串。
  7. __UUID函式:生成隨機的唯一的UUID。

(4)指令碼類

主要用於呼叫外部指令碼或是解析執行指令碼,例如:groovy、beanshell等 。

  1. __groovy函式:執行groovy指令碼。會執行傳遞給它的指令碼,並返回結果。
  2. __BeanShell函式:會執行傳遞給它的指令碼,並返回結果。
  3. __javaScript函式:可以用來執行JavaScript程式碼片段(非Java),並返回結果值。
  4. __jexl2函式:可以用於執行JEXL2表示式,並返回執行結果。
  5. __jexl3函式:可以用於執行JEXL3表示式,並返回執行結果。

(5)屬性類

用於讀取和設定JMeter的配置。

  1. __property函式:會返回一個JMeter屬性的值。如果函式找不到屬性值,而又沒有提供預設值,則它會返回屬性的名稱。
  2. __P函式:是一個簡化版的屬性函式,目的是使用在命令列中定義的屬性。不同於函式__property,本函式沒有提供選項用於設定儲存屬性值的變數。
  3. __setProperty函式:用於設定JMeter屬性的值。函式的預設返回值是空字串,因此該函式可以被用在任何地方,只要對函式本身呼叫是正確的。

(6)變數類

對變數進行操作,主要用於驗證變數表示式引用是否正確。

  1. __split函式:會通過分隔符來拆分傳遞給它的字串,並返回原始的字串。如果分隔符緊挨在一起,那麼函式就會以變數值的形式返回"?"。
  2. __V函式:可以用於執行變數名錶達式,並返回執行結果。
  3. __eval函式:可以用來執行一個字串表示式,並返回執行結果。如此一來,使用者就可以對字串中的變數和函式引用做出修改。
  4. __evalVar函式:可以用來執行儲存在變數中的表示式,並返回執行結果。

(7)字串類

用於對字串的處理操作。

  1. __regexFunction函式:正規表示式函式可以使用正規表示式(使用者提供的)來解析前面的伺服器響應(或者是某個變數值),函式會返回一個有模板的字串,其中攜帶有可變的值。還可以被用來儲存值,以便供後續使用。
  2. __escapeOroRegexpChars函式:將一些Java正規表示式引擎不識別的正則式進行轉換,轉換過程中使用了ORO正規表示式庫,這個庫也支援Perl5相容的正規表示式語法。(Perl是一種高階、通用、直譯式、動態的指令碼語言,內部整合了正規表示式的功能)
  3. __char函式:會將一串數字轉換成Unicode字元。
  4. __unescape函式:用於反轉義Java-escaped字串。
  5. __unescapeHtml函式:用於反轉義一個包含HTML實體的字串,將其變為包含實際Unicode字元的字串。
  6. __escapeHtml函式:用於轉義字串中的字元(使用HTML實體)。即:使用html coding編碼目標字串。
  7. __escapeXml函式:使用XML coding編碼目標字串。
  8. __urldecode函式:urlcode解碼。
  9. __urlencode函式:編碼為urlcode。

3、常用函式介紹

(1)__Random函式

__Random函式會返回指定最大值和最小值之間的隨機數。

引數如下表所示:

函式引數 描述 是否必需
最小值 最小數值
最大值 最大數值
變數名 重用函式計算值的引用名

介面如下圖:

image

提示:__RandomString函式使用同理。

(2)__counter函式

每次呼叫計數器函式都會產生一個新值,從1開始每次加1。

計數器函式既可以被配置成針對每個虛擬使用者是獨立的,也可以被配置成所有虛擬使用者公用的。

如果每個虛擬使用者的計數器是獨立增長的,那麼通常被用於記錄測試計劃執行了多少遍。

全域性計數器通常被用於記錄傳送了多少次請求,計數器使用一個整數值來記錄,允許的最大值為2,147,483,647

計數器函式介面如下:

image

說明:

  • 第一個引數:必須填寫
    True:希望每個虛擬使用者的計數器保持獨立,與其他使用者的計數器相區別。
    False:全域性計數器。
  • 第二個引數:非必須填寫
    定義計數器函式建立值的引用名。可以這樣引用計數器的值:${refName}
    這樣一來,就可以建立一個計數器後,在多個地方引用它的值。

(3)__time函式

__time函式可以通過多種格式返回當前時間。

引數如下表所示:

函式引數 描述 是否必需
格式 設定時間所採用的格式
變數名 待設定變數名

介面如下圖:

image

說明:

如果省略了格式字串,那麼函式會以毫秒的形式返回當前時間。

其他情況下,當前時間會被轉成簡單日期格式,包含如下形式:

  • YMD = yyyyMMdd
  • HMS = HHmmss
  • YMDHMS = yyyyMMdd-HHmmss
  • USER1 = JMeter屬性time.USER1
  • USER2 = JMeter屬性time.USER2

使用者可以通過修改JMeter屬性檔案,來改變時間的預設格式,例如:time.YMD=yyMMdd

(4)__property函式

__property函式會返回一個JMeter屬性的值。如果函式找不到屬性值,而又沒有提供預設值,則它會返回屬性的名稱。

引數如下表所示:

函式引數 描述 是否必需
屬性名 獲取屬性值、所需的屬性名
變數名 重用函式計算值的引用名
預設值 屬性未定義時的預設值

介面如下圖:

image

示例:

  • ${__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 是否返回屬性原始值

介面如下圖:

image

(6)__intSum函式

__intSum函式:可以被用來計算兩個或者更多整數值的合。

如下圖所示:

image

引數如下所示:

  • 第1個引數:填寫第1個整數值。必須填寫。
  • 第2個引數:填寫第2個整數值。必須填寫。
  • 第n個引數:填寫第n個整數值。非必須填寫。
  • 最後一個引數:儲存結果的變數引用名(可選)。如果使用者指定了這一引數,那麼引用名中必須包含一個非數字字母,否則它會被當成另一個整數值,而被函式用於計算。
    即:引用名是可選的引數,但是引用名不能是整數值。

提示:__longSum函式同理。

(7)__machineName函式

__machineName函式返回本機的主機名。

引數如下表所示:

函式引數 描述 是否必需
變數名 函式計算值的引用名

介面如下圖:

image

提示:__machineIP函式同理。

(8)__threadNum函式

__threadNum函式:只是簡單地返回當前執行緒的編號。

執行緒編號不依賴於執行緒組,這就意味著從函式的角度看來,某個執行緒組的執行緒#1和另一個執行緒組的執行緒#1是沒有區別的。

該函式沒有引數,這一函式不能用在任何配置元件中(如使用者定義的變數),原因在於配置元件是由一個獨立執行緒執行的。

另外在測試計劃中使用也是沒有意義的。

介面如下圖所示:

image

4、總結

本篇文章中不演示每個函式的具體用法,因為函式具體的引用方式都相同,例如${函式名(具體引數)}

如果需要了解JMeter中函式助手的具體使用示例,請參考上一篇文章【使用函式助手實現引數化】。

參考:

相關文章