1. 程式人生 > >轉載jmeter(十二)函數

轉載jmeter(十二)函數

圖片 能夠 兩個文件 不同 windows beanshell dom 改變 long

  • JMeter提供了很多函數,如果能夠熟練使用,可以為腳本帶來很多方便。

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

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

  • Tips:
    如果參數包含逗號,那麽一定要使用“\”來轉義,否則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、當有多個整數時點擊添加按鈕來增加參數,但是需要註意的是,添加完參數後,點擊”生成”的函數默認是把手動添加的函數放在後面,這時需要手動調整變量名的位置,把它放到最後,否則會報錯。

技術分享圖片

六、__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():隨機字符串函數

技術分享圖片

1、Random string length:隨機字符的長度

2、Chars to use for random string generation:用來生成隨機字符串的字符,可以是純數字,純字符,字符字母數字組合

3、Name of variable in which to store the result (optional):隨機生成的字符被變量保存

4、${__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=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實體。

二十三、__unescapeHtml

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

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

二十四、__FileToString

1、函數__FileToString可以被用來讀取整個文件。每次對該函數的調用,都會讀取整個文件。

2、如果在打開或者讀取文件時發生錯誤,那麽函數就會返回字符串"**ERR**"。

原文轉載自:https://www.cnblogs.com/Zfc-Cjk/p/8417167.html

轉載jmeter(十二)函數