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


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

參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM