Jmeter(五)_函數

 

  • JMeter提供了不少函數,若是可以熟練使用,能夠爲腳本帶來不少方便。java

  • JMeter函數是一種特殊值,可用於除測試計劃外的任何組件。正則表達式

  • 函數調用的格式以下所示:
    ${__functionName(var1,var2,var3)}
    其中,__functionName爲函數名,括號內是函數的參數,無參數時能夠不用括號,如${__UUID}
    shell

  • Tips:
    若是參數包含逗號,那麼必定要使用「\」來轉義,不然JMeter會把它看成一個參數分隔符
    服務器

  • 實際使用時,可經過函數助手對話框選擇函數,設置參數後,點擊生成按鈕生成函數字符串。dom

 

 

1、__BeanShell:beanshell函數函數

 

一、它有兩個參數,第一個參數是要執行的語句,能夠是beanshell語句或者是文件地址,是必選參數;第二個參數是保存結果的變量名稱,非必選參數。oop

二、Example:測試

${__BeanShell(123*456)}:返回56088ui

${__BeanShell(source("function.bsh"))}:會執行外部腳本function.bsh,並返回結果spa

${__BeanShell(import java.util.*;Properties props = System.getProperties();String osName  = props.getProperty("os.name");if(osName.contains("Windows"))return 443;return 8443;)}:判斷端口

三、與beanshell元件比較:

該函數與beanshell元件(beanshell sampler、beanshell preprocess等)做用是同樣的,只是beanshell函數更經常使用於一些簡單的判斷或計算等,能夠把少許的腳本放在函數中直接賦值給一個變量,而不用老是添加beanshell元件。

 

2、__regexFunction:正則表達式函數

 

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

二、__regexFunction還能夠被用來保存值,以便供後續使用。在函數的第6個參數中,測試人員能夠指定一個引用名。在函數執行之後,測試人員可使用用戶定義值的語法來獲取一樣的值。例如,若是測試人員輸入"refName"做爲第6個參數,那麼測試人員可使用:

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

${refName_g0}來引用函數解析後發現的全部匹配結果。

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

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

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

具體參數描述以下:

 

其實這個函數的做用跟正則表達式提取器的做用是相似的。

 

3、__counter:計數器函數

 

一、每次調用計數器函數都會產生一個新值,從1開始每次加1。計數器既能夠被配置成針對每一個虛擬用戶是獨立的,也能夠被配置成全部虛擬用戶公用的。

二、若是每一個虛擬用戶的計數器是獨立增加的,那麼一般被用於記錄測試計劃運行了多少遍。全局計數器一般被用於記錄發送了多少次請求。

三、計數器使用一個整數值來記錄,容許的最大值爲2,147,483,647。

四、目前計數器函數實例是獨立實現的(JMeter 2.1.1及其之前版本,使用一個固定的線程變量來跟蹤每一個用戶的計數器,所以多個計數器函數會操做同一個值)。全局計數器(FALSE)每一個計數器實例都是獨立維護的。

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

 

4、__threadNum

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

這一函數不能用在任何配置元件中(如用戶定義的變量),緣由在於配置元件是由一個獨立線程運行的。另外在測試計劃(Test Plan)中使用也是沒有意義的。因此,不多用。

 

5、__intSum:整數求和函數

 

一、函數__intSum能夠被用來計算兩個或者更多整數值的合。至少須要兩個整數,若是指定變量名則名稱中必須包含一個非數字字母,不然它會被當成另外一個整數值,而被函數用於計算。

二、當有多個整數時點擊添加按鈕來增長參數,可是須要注意的是,添加完參數後,點擊」生成」的函數默認是把手動添加的函數放在後面,這時須要手動調整變量名的位置,把它放到最後,不然會報錯。

 

 

 

6、__longSum:長整型求和函數

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

 

7、__StringFromFile:讀取文件中的字符串函數

 

一、該函數用來從文本文件中讀取字符串。支持讀取多個文件。

二、使用配置元件CSV Data Set Config ,也能達到相同的目的,並且方法更簡單,可是它目前不支持多個輸入文件。

三、每次調用函數,都會從文件中讀取下一行。當到達文件末尾時,函數又會從文件開始處從新讀取,直到最大循環次數。若是在一個測試腳本中對該函數有屢次引用,那麼每一次引用都會獨立打開文件,即便文件名是相同的(若是函數讀取的值,在腳本其餘地方也有使用,那麼就須要爲每一次函數調用指定不一樣的變量名)。

四、若是在打開或者讀取文件時發生錯誤,那麼函數就會返回字符串"**ERR**"。

 

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

 

五、函數的第三個參數:初始的序列號,若是省略,那麼結束序列號就表明文件的循環讀取次數。

六、函數的第四個參數:結束序列號,若是省略,那麼序列號會無限增加。

 

七、讀取多個文件示例:

須要在文件名中使用序列號:當使用序列號時,文件名須要使用格式字符串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

 

 

8、__machineName

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

 

 

9、__javaScript

一、函數__javaScript能夠用來執行JavaScript代碼片斷(非Java),並返回結果值。

二、JMeter的_javaScript函數會調用標準的JavaScript解釋器,還能夠直接調用jmeter的內置函數。

三、請記得爲文本字符串添加必要的引號。另外,若是表達式中有逗號,請確保對其轉義。例如,${__javaScript('${sp}'.slice(7\,99999))},對7以後的逗號進行了轉義。

 

10、__Random:隨機數函數

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

 

11、_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保存;

 

 

12、__property

一、函數__property會返回一個JMeter屬性的值。若是函數找不到屬性值,而又沒有提供默認值,則它會返回屬性的名稱。

二、例如,

${__property(user.dir)}:返回屬性user.dir的值。

${__property(user.dir,UDIR)}:返回屬性user.dir的值,並保存在變量UDIR中。

${__property(abcd,ABCD,atod)}:返回屬性abcd的值 (若是屬性沒有定義,返回"atod"),並保存在變量ABCD 中。

${__property(abcd,,atod)}:返回屬性abcd 的值(若是屬性沒有定義,返回"atod"),可是並不保存函數的返回值。

 

 

十3、_P

 

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

二、不一樣於函數_property,本函數沒有提供選項用於設置保存屬性值的變量。另外,若是沒有設置默認值,默認值自動設爲1。

 

三、例如:定義屬性值:

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(除非這些屬性在其餘地方有定義)。

 

 

十4、__log

 

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

二、OUT 和ERR的日誌級別,將會分別致使輸出記錄到System.out和System.err中。在這種狀況下,輸出老是會被打印(它不依賴於當前的日誌設置)。

例如:

${__log(Message)}:寫入日誌文件,形如"...thread Name : Message"。

${__log(Message,OUT)}:寫到控制檯窗口。

${__log(${VAR},,,VAR=)}:寫入日誌文件,形如"...thread Name VAR=value"。

 

 

十5、__split:字符串分割函數

 

 

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

二、分隔符默認是逗號,若是你想要畫蛇添足,明確指定使用逗號,須要對逗號轉義,如「\,」

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

${__split(${VAR},VAR),|} :該函數調用會返回VAR變量的值,例如"a||c|",並設定VAR_n=四、VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?、VAR_5=null變量的值。

 

 

十6、__XPath

 

一、函數__XPath讀取XML文件,並在文件中尋找與指定XPath相匹配的地方。每調用函數一次,就會返回下一個匹配項。到達文件末尾後,會從頭開始。若是沒有匹配的節點,那麼函數會返回空字符串,另外,還會向JMeter日誌文件寫一條警告信息。

整個節點列表都會被保存在內存之中。

例如:

${__XPath(/path/to/build.xml, //target/@name)} 

這會找到build.xml文件中的全部目標節點,並返回下一個name屬性的內容。

 

 

十7、__setProperty

 

 

一、函數__setProperty用於設置JMeter屬性的值。函數的默認返回值是空字符串,所以該函數能夠被用在任何地方,只要對函數自己調用是正確的。

二、經過將函數可選的第3個參數設置爲"true",函數就會返回屬性的原始值。

三、屬性對於JMeter是全局的,所以能夠被用來在線程和線程組之間通訊。

 

 

十8、__time

一、函數__time能夠經過多種格式返回當前時間。

二、若是省略了格式字符串,那麼函數會以毫秒的形式返回當前時間。其餘狀況下,當前時間會被轉成簡單日期格式。包含以下形式:

YMD = yyyyMMdd。

HMS = HHmmss。

YMDHMS = yyyyMMdd-HHmmss。

USER1 = JMeter屬性time.USER1。

USER2 = JMeter屬性time.USER2。

用戶能夠經過修改JMeter屬性文件來改變默認格式,或者自定義格式,例如修改YMD格式: time.YMD=yyMMdd。

 

 

十9、__V

一、函數__V能夠用於執行變量名錶達式,並返回執行結果。它能夠被用於執行嵌套函數引用(目前JMeter不支持)。

二、例如,若是存在變量A一、A2和N=1,則:

  ${A1}:能正常工做。

   ${A${N}}:沒法正常工做(嵌套變量引用)。

   ${__V(A${N})}:能夠正常工做。A${N}變爲A1,函數 __V返回變量值A1。

 

 

二10、__evalVar

一、函數__evalVar能夠用來執行保存在變量中的表達式,並返回執行結果。

如此一來,用戶能夠從文件中讀取一行字符串,並處理字符串中引用的變量。

二、例如,假設變量"query"中包含有"select ${column} from ${table}",而  "column""table"中分別包含有"name""customers",那麼${__evalVar(query)}將會執行"select name from customers"

 

 

二11、__eval

一、函數__eval能夠用來執行一個字符串表達式,並返回執行結果。

如此一來,用戶就能夠對字符串(存儲在變量中)中的變量和函數引用作出修改。

二、例如,給定變量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語句和值都定義在數據文件中。

 

 

二12、__escapeHtml

一、函數__escapeHtml用於轉義字符串中的字符(使用HTML實體)。支持HTML 4.0實體。

 

 

 

 

二十3、__unescapeHtml

一、函數__unescapeHtml用於反轉義一個包含HTML實體的字符串,將其變爲包含實際Unicode字符的字符串。支持HTML 4.0實體。

二、若是函數不認識某個實體,就會將實體保留下來,並一字不差地插入結果字符串中。例如,">&zzzz;x"會變爲">&zzzz;x"。

 

 

二十4、__FileToString

一、函數__FileToString能夠被用來讀取整個文件。每次對該函數的調用,都會讀取整個文件。

二、若是在打開或者讀取文件時發生錯誤,那麼函數就會返回字符串"**ERR**"。

 龍淵閣測試開發家園: 317765580

相關文章
相關標籤/搜索