jmeter學習指南之常用函式的使用

testingbang發表於2019-08-19

說明:本文內容是基於jmeter3.0版本來編寫,不同版本可能會有個別部分不一致,但是不會差別太大的。

JMeter提供了很多函式,如果能夠熟練使用,可以為指令碼帶來很多方便。

JMeter函式是一種特殊值,可用於除測試計劃外的任何元件。

函式呼叫的格式如下所示:

${__functionName(var1,var2,var3)}
其中,__functionName為函式名,括號內是函式的引數,無引數時可以不用括號,如${__UUID}

Tips:
如果引數包含逗號,那麼一定要使用“”來轉義,否則JMeter會把它當作一個引數分隔符

實際使用時,可透過函式助手對話方塊選擇函式,設定引數後,點選生成按鈕生成函式字串。

本文講述常用的JMeter函式。

一、JMeter常用函式1-10

一、__BeanShell:beanshell函式

1、它有兩個引數,第一個引數是要執行的語句,可以是beanshell語句或者是檔案地址,是必選引數;第二個引數是儲存結果的變數名稱,非必選引數。

2、Example:

${__BeanShell(123*456)}:返回56088
 
${__BeanShell(source("function.bsh"))}:會執行外部指令碼function.bsh,並返回結果
 
${__BeanShell(import java.util.*;Properties props = System.getProperties();String osName  = props.getProperty("os.name");if(osName.contains("Windows"))return 443;return 8443;)}:判斷埠


3、與beanshell元件比較:
該函式與beanshell元件(beanshell sampler、beanshell preprocess等)作用是一樣的,只是beanshell函式更常用於一些簡單的判斷或計算等,可以把少量的指令碼放在函式中直接賦值給一個變數,而不用總是新增beanshell元件。

二、__regexFunction:正規表示式函式

1、該函式使用使用者提供的正規表示式來解析前面的伺服器響應(或者是某個變數值)。函式會返回一個有模板的字串,其中攜帶有可變的值。

2、__regexFunction還可以被用來儲存值,以便供後續使用。在函式的第6個引數中,測試人員可以指定一個引用名。在函式執行以後,測試人員可以使用使用者定義值的語法來獲取同樣的值。例如,如果測試人員輸入"refName"作為第6個引數,那麼測試人員可以使用:

${refName}來引用第2個引數(Template for the replacement string)的計算結果,這依賴於函式的解析結果。

${refName_g0}來引用函式解析後發現的所有匹配結果。

${refName_g1}來引用函式解析後發現的第一個匹配組合。

${refName_g#}來引用函式解析後發現的第n個匹配組合。

${refName_matchNr}來引用函式總共發現的匹配組合數目。

具體引數描述如下:

其實這個函式的作用跟正規表示式提取器的作用是類似的。


三、__counter:計數器函式

1、每次呼叫計數器函式都會產生一個新值,從1開始每次加1。計數器既可以被配置成針對每個虛擬使用者是獨立的,也可以被配置成所有虛擬使用者公用的。

2、如果每個虛擬使用者的計數器是獨立增長的,那麼通常被用於記錄測試計劃執行了多少遍。全域性計數器通常被用於記錄傳送了多少次請求。

3、計數器使用一個整數值來記錄,允許的最大值為2,147,483,647。

4、目前計數器函式例項是獨立實現的(JMeter 2.1.1及其以前版本,使用一個固定的執行緒變數來跟蹤每個使用者的計數器,因此多個計數器函式會操作同一個值)。全域性計數器(FALSE)每個計數器例項都是獨立維護的。

5、該函式也有對應的配置元件:計數器,功能類似。

四、__threadNum

函式__threadNum只是簡單地返回當前執行緒的編號。執行緒編號不依賴於執行緒組,這就意味著從函式的角度看來,某個執行緒組的執行緒#1和另一個執行緒組的執行緒#1是沒有區別的。另外,該函式沒有引數。

這一函式不能用在任何配置元件中(如使用者定義的變數),原因在於配置元件是由一個獨立執行緒執行的。另外在測試計劃(Test Plan)中使用也是沒有意義的。所以,很少用。

五、__intSum: 整數求和函式

1、函式__intSum可以被用來計算兩個或者更多整數值的合。至少需要兩個整數,如果指定變數名則名稱中必須包含一個非數字字母,否則它會被當成另一個整數值,而被函式用於計算。

2、當有多個整數時點選新增按鈕來增加引數,但是需要注意的是,新增完引數後,點選”生成”的函式預設是把手動新增的函式放在後面,這時需要手動調整變數名的位置,把它放到最後,否則會報錯。

示例如下:

**注意:這是在4.0之前版本里的bug,在最新版本4.0中已做了最佳化,可以直接在第二個引數中輸入多個逗號分隔的值來實現多個引數求和。

六、__longSum:長整型求和函式

該函式用來計算兩個或更多長整型值的和,使用方法跟上面的__intSum函式一樣。

七、__StringFromFile:讀取檔案中的字串函式

1、該函式用來從文字檔案中讀取字串。支援讀取多個檔案。

2、使用配置元件CSV Data Set Config ,也能達到相同的目的,而且方法更簡單,但是它目前不支援多個輸入檔案。

3、每次呼叫函式,都會從檔案中讀取下一行。當到達檔案末尾時,函式又會從檔案開始處重新讀取,直到最大迴圈次數。如果在一個測試指令碼中對該函式有多次引用,那麼每一次引用都會獨立開啟檔案,即使檔名是相同的(如果函式讀取的值,在指令碼其他地方也有使用,那麼就需要為每一次函式呼叫指定不同的變數名)。

4、如果在開啟或者讀取檔案時發生錯誤,那麼函式就會返回字串"**ERR**"。

示例:

${_StringFromFile(demo.txt,,,)} 讀取demo.txt
${_StringFromFile(PIN#'.'DAT,,1,2)} 讀取demo1.txt, demo2.txt
${_StringFromFile(PIN.DAT,,,2)} 讀取demo.txt兩次

5、函式的第三個引數:初始的序列號,如果省略,那麼結束序列號就代表檔案的迴圈讀取次數。

6、函式的第四個引數:結束序列號,如果省略,那麼序列號會無限增長。

7、讀取多個檔案示例:

需要在檔名中使用序列號:當使用序列號時,檔名需要使用格式字串java.text.DecimalFormat。當前的序列號會作為唯一的引數。如果不指明可選的初始序列號,就使用檔名作為起始值。一些有用的格式序列如下:

#:插入數字,不從零開始,不包含空格。
 
000:插入數字,包含3個數字組合,不從零開始。
 
例如:
 
pin#'.'dat -> pin1.dat, ...  pin9.dat, pin10.dat, ...   pin9999.dat   
 
pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat   
 
pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999  
如果不希望某個格式字元被翻譯,需要為它加上單引號。注意上面的"."是格式字元,必須被單引號所包含。

比如現在要同時讀取兩個檔案,分別是PIN1.DAT, PIN2.DAT:

${_StringFromFile(PIN#'.'DAT,,1,2)}:同時讀取 PIN1.DAT, PIN2.DAT。
 
${_StringFromFile(PIN.DAT,,,2)}:讀取 PIN.DAT 兩次。
 
${_StringFromFile(test#'.'txt,,1,2)}:同時讀取test1.txt,test2.txt


八、__machineName

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

九、__javaScript

1、函式__javaScript可以用來執行JavaScript程式碼片段(非Java),並返回結果值。

2、JMeter的_javaScript函式會呼叫標準的JavaScript直譯器,還可以直接呼叫jmeter的內建函式。

3、請記得為文字字串新增必要的引號。另外,如果表示式中有逗號,請確保對其轉義。

       例如,${__javaScript('${sp}'.slice(7,99999))},對7之後的逗號進行了轉義。

十、__Random:隨機數函式

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

十一、_RandomString() :隨機字串函式

Random string length:隨機字元的長度
 
Chars to use for random string generation:用來生成隨機字串的字元,可以是純數字,純字元,字元字母數字組合
 
Name of variable in which to store the result (optional):隨機生成的字元被變數儲存
 
${__RandomString(6,abcdefgh1234566,ranstr)},解釋:隨機生成一個6位長度的字串被ranstr儲存;

十二、__property

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

2、例如,

${__property(user.dir)}:返回屬性user.dir的值。
 
${__property(user.dir,UDIR)}:返回屬性user.dir的值,並儲存在變數UDIR中。
 
${__property(abcd,ABCD,atod)}:返回屬性abcd的值 (如果屬性沒有定義,返回"atod"),並儲存在變數ABCD 中。
 
${__property(abcd,,atod)}:返回屬性abcd 的值(如果屬性沒有定義,返回"atod"),但是並不儲存函式的返回值。

十三、_P

1、函式_P是一個簡化版的屬性函式,目的是使用在命令列中定義的屬性。

2、不同於函式_property,本函式沒有提供選項用於設定儲存屬性值的變數。另外,如果沒有設定預設值,預設值自動設為1。

3、例如:定義屬性值:

jmeter -Jgroup1.threads=7 -Jhostname1=
獲取值如下:

${__P(group1.threads)}:返回屬性group1.threads的值。
 
${__P(group1.loops)}:返回屬性group1.loops 的值。
 
${__P(hostname,)}:返回屬性hostname的值,如果沒有定義該屬性則返回值。
在上面的例子中,第一個函式呼叫返回7,第二個函式呼叫返回1,而最後一個函式呼叫返回(除非這些屬性在其他地方有定義)。

十四、__log

1、函式__log會記錄一條日誌,並返回函式的輸入字串。

2、OUT 和ERR的日誌級別,將會分別導致輸出記錄到System.out和System.err中。在這種情況下,輸出總是會被列印(它不依賴於當前的日誌設定)。

例如:

${__log(Message)}:寫入日誌檔案,形如"...thread Name : Message"。
 
${__log(Message,OUT)}:寫到控制檯視窗。
 
${__log(${VAR},,,VAR=)}:寫入日誌檔案,形如"...thread Name VAR=value"。
 
十五、__split:字串分割函式

1、函式__split會透過分隔符來拆分傳遞給它的字串,並返回原始的字串。如果分隔符緊挨在一起,那麼函式就會以變數值的形式返回"?"。拆分出來的字串,以變數${VAR_1}、{VAR_2}…以此類推的形式加以返回。

2、分隔符預設是逗號,如果你想要多此一舉,明確指定使用逗號,需要對逗號轉義,如“,”

3、例如,在測試計劃中定義變數VAR="a||c|":

${__split(${VAR},VAR),|} :該函式呼叫會返回VAR變數的值,例如"a||c|",
         並設定VAR_n=4、VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?、VAR_5=null變數的值。
 
十六、_ _XPath

1、函式__XPath讀取XML檔案,並在檔案中尋找與指定XPath相匹配的地方。每呼叫函式一次,就會返回下一個匹配項。到達檔案末尾後,會從頭開始。如果沒有匹配的節點,那麼函式會返回空字串,另外,還會向JMeter日誌檔案寫一條警告資訊。

整個節點列表都會被儲存在記憶體之中。

例如:

${__XPath(/path/to/build.xml, //target/@name)} 
這會找到build.xml檔案中的所有目標節點,並返回下一個name屬性的內容。

十七、__setProperty

1、函式__setProperty用於設定JMeter屬性的值。函式的預設返回值是空字串,因此該函式可以被用在任何地方,只要對函式本身呼叫是正確的。

2、透過將函式可選的第3個引數設定為"true",函式就會返回屬性的原始值。

3、屬性對於JMeter是全域性的,因此可以被用來線上程和執行緒組之間通訊。

十八、__time

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

2、如果省略了格式字串,那麼函式會以毫秒的形式返回當前時間。其他情況下,當前時間會被轉成簡單日期格式。包含如下形式:

YMD = yyyyMMdd
 
HMS = HHmmss
 
YMDHMS = yyyyMMdd-HHmmss
 
USER1 = JMeter屬性time.USER1
 
USER2 = JMeter屬性time.USER2
使用者可以透過修改JMeter屬性檔案來改變預設格式,或者自定義格式,例如修改YMD格式: time.YMD=yyMMdd。

十九、__V

1、函式__V可以用於執行變數名錶達式,並返回執行結果。它可以被用於執行巢狀函式引用(目前JMeter不支援)。

2、例如,如果存在變數A1、A2和N=1,則: 

 ${A1}:能正常工作。
 
 ${A${N}}:無法正常工作(巢狀變數引用)。
 
 ${__V(A${N})}:可以正常工作。A${N}變為A1,函式 __V返回變數值A1。
 
二十、__evalVar

1、函式__evalVar可以用來執行儲存在變數中的表示式,並返回執行結果。

如此一來,使用者可以從檔案中讀取一行字串,並處理字串中引用的變數。

2、例如:

假設變數"query"中包含有"select ${column} from ${table}",
而 "column"和"table" 中分別包含有 "name"和"customers",
那麼${__evalVar(query)}將會執行"select name from customers"。

二十一、__eval

1、函式__eval可以用來執行一個字串表示式,並返回執行結果。

如此一來,使用者就可以對字串(儲存在變數中)中的變數和函式引用做出修改。

2、例如:

給定變數 name=Smith、column=age、table=birthdays、
SQL=select ${column} from ${table} where name='${name}',
那麼透過 ${__eval(${SQL})},就能執行 "select age from birthdays where name='Smith'"
這樣一來,就可以與CSV資料集相互配合,例如,將SQL語句和值都定義在資料檔案中。

二十二、__escapeHtml

1、函式__escapeHtml用於跳脫字元串中的字元(使用HTML實體)。支援HTML 4.0實體。

2、例如:
"bread" & "butter"變為 "bread" & "butter"

二十三、__unescapeHtml

1、函式__unescapeHtml用於反轉義一個包含HTML實體的字串,將其變為包含實際Unicode字元的字串。支援HTML 4.0實體。

2、例如:

字串 "&lt;Fran&ccedil;ais&gt;" 變為 "<Fran?ais>"
3、如果函式不認識某個實體,就會將實體保留下來,並一字不差地插入結果字串中。

例如,">&zzzz;x" 還是會變為 ">&zzzz;x"。

二十四、__FileToString

1、函式__FileToString可以被用來讀取整個檔案。每次對該函式的呼叫,都會讀取整個檔案。

2、如果在開啟或者讀取檔案時發生錯誤,那麼函式就會返回字串"**ERR**"。

以上Jmeter函式你用過幾個呢?

看完有沒有發現有些函式可以很方便的解決你的問題呢?

如果你對哪個函式的使用有疑問,歡迎留言討論~~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2654087/,如需轉載,請註明出處,否則將追究法律責任。

相關文章