您好,登錄后才能下訂單哦!
說明:本文內容是基于jmeter3.0版本來編寫,不同版本可能會有個別部分不一致,但是不會差別太大的。
JMeter提供了很多函數,如果能夠熟練使用,可以為腳本帶來很多方便。
JMeter函數是一種特殊值,可用于除測試計劃外的任何組件。
函數調用的格式如下所示:
${__functionName(var1,var2,var3)}
其中,__functionName為函數名,括號內是函數的參數,無參數時可以不用括號,如${__UUID}
Tips:
如果參數包含逗號,那么一定要使用“”來轉義,否則JMeter會把它當作一個參數分隔符
實際使用時,可通過函數助手對話框選擇函數,設置參數后,點擊生成按鈕生成函數字符串。
本文講述常用的JMeter函數。
一、__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,abcdefgh2234566,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=www.realhost.edu
獲取值如下:
${__P(group1.threads)}:返回屬性group1.threads的值。
${__P(group1.loops)}:返回屬性group1.loops 的值。
${__P(hostname,www.baidu.com)}:返回屬性hostname的值,如果沒有定義該屬性則返回值www.baidu.com。
在上面的例子中,第一個函數調用返回7,第二個函數調用返回1,而最后一個函數調用返回www.baidu.com(除非這些屬性在其他地方有定義)。
十四、__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、例如:
字符串 "<Français>" 變為 "<Fran?ais>"
3、如果函數不認識某個實體,就會將實體保留下來,并一字不差地插入結果字符串中。
例如,">&zzzz;x" 還是會變為 ">&zzzz;x"。
二十四、__FileToString
1、函數__FileToString可以被用來讀取整個文件。每次對該函數的調用,都會讀取整個文件。
2、如果在打開或者讀取文件時發生錯誤,那么函數就會返回字符串"**ERR**"。
以上Jmeter函數你用過幾個呢?
看完有沒有發現有些函數可以很方便的解決你的問題呢?
如果你對哪個函數的使用有疑問,歡迎留言討論~~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。