溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

jmeter學(xué)習(xí)指南之常用函數(shù)的使用

發(fā)布時(shí)間:2020-08-09 15:04:54 來(lái)源:ITPUB博客 閱讀:184 作者:testingbang 欄目:移動(dòng)開(kāi)發(fā)

說(shuō)明:本文內(nèi)容是基于jmeter3.0版本來(lái)編寫,不同版本可能會(huì)有個(gè)別部分不一致,但是不會(huì)差別太大的。

JMeter提供了很多函數(shù),如果能夠熟練使用,可以為腳本帶來(lái)很多方便。

JMeter函數(shù)是一種特殊值,可用于除測(cè)試計(jì)劃外的任何組件。

函數(shù)調(diào)用的格式如下所示:

${__functionName(var1,var2,var3)}
其中,__functionName為函數(shù)名,括號(hào)內(nèi)是函數(shù)的參數(shù),無(wú)參數(shù)時(shí)可以不用括號(hào),如${__UUID}

Tips:
如果參數(shù)包含逗號(hào),那么一定要使用“”來(lái)轉(zhuǎn)義,否則JMeter會(huì)把它當(dāng)作一個(gè)參數(shù)分隔符

實(shí)際使用時(shí),可通過(guò)函數(shù)助手對(duì)話框選擇函數(shù),設(shè)置參數(shù)后,點(diǎn)擊生成按鈕生成函數(shù)字符串。

本文講述常用的JMeter函數(shù)。

一、JMeter常用函數(shù)1-10

一、__BeanShell:beanshell函數(shù)
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、它有兩個(gè)參數(shù),第一個(gè)參數(shù)是要執(zhí)行的語(yǔ)句,可以是beanshell語(yǔ)句或者是文件地址,是必選參數(shù);第二個(gè)參數(shù)是保存結(jié)果的變量名稱,非必選參數(shù)。

2、Example:

${__BeanShell(123*456)}:返回56088
 
${__BeanShell(source("function.bsh"))}:會(huì)執(zhí)行外部腳本function.bsh,并返回結(jié)果
 
${__BeanShell(import java.util.*;Properties props = System.getProperties();String osName  = props.getProperty("os.name");if(osName.contains("Windows"))return 443;return 8443;)}:判斷端口


3、與beanshell元件比較:
該函數(shù)與beanshell元件(beanshell sampler、beanshell preprocess等)作用是一樣的,只是beanshell函數(shù)更常用于一些簡(jiǎn)單的判斷或計(jì)算等,可以把少量的腳本放在函數(shù)中直接賦值給一個(gè)變量,而不用總是添加beanshell元件。

二、__regexFunction:正則表達(dá)式函數(shù)
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、該函數(shù)使用用戶提供的正則表達(dá)式來(lái)解析前面的服務(wù)器響應(yīng)(或者是某個(gè)變量值)。函數(shù)會(huì)返回一個(gè)有模板的字符串,其中攜帶有可變的值。

2、__regexFunction還可以被用來(lái)保存值,以便供后續(xù)使用。在函數(shù)的第6個(gè)參數(shù)中,測(cè)試人員可以指定一個(gè)引用名。在函數(shù)執(zhí)行以后,測(cè)試人員可以使用用戶定義值的語(yǔ)法來(lái)獲取同樣的值。例如,如果測(cè)試人員輸入"refName"作為第6個(gè)參數(shù),那么測(cè)試人員可以使用:

${refName}來(lái)引用第2個(gè)參數(shù)(Template for the replacement string)的計(jì)算結(jié)果,這依賴于函數(shù)的解析結(jié)果。

${refName_g0}來(lái)引用函數(shù)解析后發(fā)現(xiàn)的所有匹配結(jié)果。

${refName_g1}來(lái)引用函數(shù)解析后發(fā)現(xiàn)的第一個(gè)匹配組合。

${refName_g#}來(lái)引用函數(shù)解析后發(fā)現(xiàn)的第n個(gè)匹配組合。

${refName_matchNr}來(lái)引用函數(shù)總共發(fā)現(xiàn)的匹配組合數(shù)目。

具體參數(shù)描述如下:
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
其實(shí)這個(gè)函數(shù)的作用跟正則表達(dá)式提取器的作用是類似的。


三、__counter:計(jì)數(shù)器函數(shù)
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、每次調(diào)用計(jì)數(shù)器函數(shù)都會(huì)產(chǎn)生一個(gè)新值,從1開(kāi)始每次加1。計(jì)數(shù)器既可以被配置成針對(duì)每個(gè)虛擬用戶是獨(dú)立的,也可以被配置成所有虛擬用戶公用的。

2、如果每個(gè)虛擬用戶的計(jì)數(shù)器是獨(dú)立增長(zhǎng)的,那么通常被用于記錄測(cè)試計(jì)劃運(yùn)行了多少遍。全局計(jì)數(shù)器通常被用于記錄發(fā)送了多少次請(qǐng)求。

3、計(jì)數(shù)器使用一個(gè)整數(shù)值來(lái)記錄,允許的最大值為2,147,483,647。

4、目前計(jì)數(shù)器函數(shù)實(shí)例是獨(dú)立實(shí)現(xiàn)的(JMeter 2.1.1及其以前版本,使用一個(gè)固定的線程變量來(lái)跟蹤每個(gè)用戶的計(jì)數(shù)器,因此多個(gè)計(jì)數(shù)器函數(shù)會(huì)操作同一個(gè)值)。全局計(jì)數(shù)器(FALSE)每個(gè)計(jì)數(shù)器實(shí)例都是獨(dú)立維護(hù)的。

5、該函數(shù)也有對(duì)應(yīng)的配置元件:計(jì)數(shù)器,功能類似。

四、__threadNum

函數(shù)__threadNum只是簡(jiǎn)單地返回當(dāng)前線程的編號(hào)。線程編號(hào)不依賴于線程組,這就意味著從函數(shù)的角度看來(lái),某個(gè)線程組的線程#1和另一個(gè)線程組的線程#1是沒(méi)有區(qū)別的。另外,該函數(shù)沒(méi)有參數(shù)。

這一函數(shù)不能用在任何配置元件中(如用戶定義的變量),原因在于配置元件是由一個(gè)獨(dú)立線程運(yùn)行的。另外在測(cè)試計(jì)劃(Test Plan)中使用也是沒(méi)有意義的。所以,很少用。

五、__intSum: 整數(shù)求和函數(shù)
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、函數(shù)__intSum可以被用來(lái)計(jì)算兩個(gè)或者更多整數(shù)值的合。至少需要兩個(gè)整數(shù),如果指定變量名則名稱中必須包含一個(gè)非數(shù)字字母,否則它會(huì)被當(dāng)成另一個(gè)整數(shù)值,而被函數(shù)用于計(jì)算。

2、當(dāng)有多個(gè)整數(shù)時(shí)點(diǎn)擊添加按鈕來(lái)增加參數(shù),但是需要注意的是,添加完參數(shù)后,點(diǎn)擊”生成”的函數(shù)默認(rèn)是把手動(dòng)添加的函數(shù)放在后面,這時(shí)需要手動(dòng)調(diào)整變量名的位置,把它放到最后,否則會(huì)報(bào)錯(cuò)。

示例如下:
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
**注意:這是在4.0之前版本里的bug,在最新版本4.0中已做了優(yōu)化,可以直接在第二個(gè)參數(shù)中輸入多個(gè)逗號(hào)分隔的值來(lái)實(shí)現(xiàn)多個(gè)參數(shù)求和。

六、__longSum:長(zhǎng)整型求和函數(shù)

該函數(shù)用來(lái)計(jì)算兩個(gè)或更多長(zhǎng)整型值的和,使用方法跟上面的__intSum函數(shù)一樣。

七、__StringFromFile:讀取文件中的字符串函數(shù)
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、該函數(shù)用來(lái)從文本文件中讀取字符串。支持讀取多個(gè)文件。

2、使用配置元件CSV Data Set Config ,也能達(dá)到相同的目的,而且方法更簡(jiǎn)單,但是它目前不支持多個(gè)輸入文件。

3、每次調(diào)用函數(shù),都會(huì)從文件中讀取下一行。當(dāng)?shù)竭_(dá)文件末尾時(shí),函數(shù)又會(huì)從文件開(kāi)始處重新讀取,直到最大循環(huán)次數(shù)。如果在一個(gè)測(cè)試腳本中對(duì)該函數(shù)有多次引用,那么每一次引用都會(huì)獨(dú)立打開(kāi)文件,即使文件名是相同的(如果函數(shù)讀取的值,在腳本其他地方也有使用,那么就需要為每一次函數(shù)調(diào)用指定不同的變量名)。

4、如果在打開(kāi)或者讀取文件時(shí)發(fā)生錯(cuò)誤,那么函數(shù)就會(huì)返回字符串"**ERR**"。

示例:

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

5、函數(shù)的第三個(gè)參數(shù):初始的序列號(hào),如果省略,那么結(jié)束序列號(hào)就代表文件的循環(huán)讀取次數(shù)。

6、函數(shù)的第四個(gè)參數(shù):結(jié)束序列號(hào),如果省略,那么序列號(hào)會(huì)無(wú)限增長(zhǎng)。

7、讀取多個(gè)文件示例:

需要在文件名中使用序列號(hào):當(dāng)使用序列號(hào)時(shí),文件名需要使用格式字符串java.text.DecimalFormat。當(dāng)前的序列號(hào)會(huì)作為唯一的參數(shù)。如果不指明可選的初始序列號(hào),就使用文件名作為起始值。一些有用的格式序列如下:

#:插入數(shù)字,不從零開(kāi)始,不包含空格。
 
000:插入數(shù)字,包含3個(gè)數(shù)字組合,不從零開(kāi)始。
 
例如:
 
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  
如果不希望某個(gè)格式字符被翻譯,需要為它加上單引號(hào)。注意上面的"."是格式字符,必須被單引號(hào)所包含。

比如現(xiàn)在要同時(shí)讀取兩個(gè)文件,分別是PIN1.DAT, PIN2.DAT:

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


八、__machineName

函數(shù)__machineName返回本機(jī)的主機(jī)名。

九、__javaScript

1、函數(shù)__javaScript可以用來(lái)執(zhí)行JavaScript代碼片段(非Java),并返回結(jié)果值。

2、JMeter的_javaScript函數(shù)會(huì)調(diào)用標(biāo)準(zhǔn)的JavaScript解釋器,還可以直接調(diào)用jmeter的內(nèi)置函數(shù)。

3、請(qǐng)記得為文本字符串添加必要的引號(hào)。另外,如果表達(dá)式中有逗號(hào),請(qǐng)確保對(duì)其轉(zhuǎn)義。

       例如,${__javaScript('${sp}'.slice(7,99999))},對(duì)7之后的逗號(hào)進(jìn)行了轉(zhuǎn)義。

十、__Random:隨機(jī)數(shù)函數(shù)

函數(shù)__Random會(huì)返回指定最大值和最小值之間的隨機(jī)數(shù)。

十一、_RandomString() :隨機(jī)字符串函數(shù)
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
Random string length:隨機(jī)字符的長(zhǎng)度
 
Chars to use for random string generation:用來(lái)生成隨機(jī)字符串的字符,可以是純數(shù)字,純字符,字符字母數(shù)字組合
 
Name of variable in which to store the result (optional):隨機(jī)生成的字符被變量保存
 
${__RandomString(6,abcdefgh2234566,ranstr)},解釋:隨機(jī)生成一個(gè)6位長(zhǎng)度的字符串被ranstr保存;

十二、__property

1、函數(shù)__property會(huì)返回一個(gè)JMeter屬性的值。如果函數(shù)找不到屬性值,而又沒(méi)有提供默認(rèn)值,則它會(huì)返回屬性的名稱。

2、例如,

${__property(user.dir)}:返回屬性u(píng)ser.dir的值。
 
${__property(user.dir,UDIR)}:返回屬性u(píng)ser.dir的值,并保存在變量UDIR中。
 
${__property(abcd,ABCD,atod)}:返回屬性abcd的值 (如果屬性沒(méi)有定義,返回"atod"),并保存在變量ABCD 中。
 
${__property(abcd,,atod)}:返回屬性abcd 的值(如果屬性沒(méi)有定義,返回"atod"),但是并不保存函數(shù)的返回值。

十三、_P

1、函數(shù)_P是一個(gè)簡(jiǎn)化版的屬性函數(shù),目的是使用在命令行中定義的屬性。

2、不同于函數(shù)_property,本函數(shù)沒(méi)有提供選項(xiàng)用于設(shè)置保存屬性值的變量。另外,如果沒(méi)有設(shè)置默認(rèn)值,默認(rèn)值自動(dòng)設(shè)為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的值,如果沒(méi)有定義該屬性則返回值www.baidu.com。
在上面的例子中,第一個(gè)函數(shù)調(diào)用返回7,第二個(gè)函數(shù)調(diào)用返回1,而最后一個(gè)函數(shù)調(diào)用返回www.baidu.com(除非這些屬性在其他地方有定義)。

十四、__log
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、函數(shù)__log會(huì)記錄一條日志,并返回函數(shù)的輸入字符串。

2、OUT 和ERR的日志級(jí)別,將會(huì)分別導(dǎo)致輸出記錄到System.out和System.err中。在這種情況下,輸出總是會(huì)被打?。ㄋ灰蕾囉诋?dāng)前的日志設(shè)置)。

例如:

${__log(Message)}:寫入日志文件,形如"...thread Name : Message"。
 
${__log(Message,OUT)}:寫到控制臺(tái)窗口。
 
${__log(${VAR},,,VAR=)}:寫入日志文件,形如"...thread Name VAR=value"。
 
十五、__split:字符串分割函數(shù)
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、函數(shù)__split會(huì)通過(guò)分隔符來(lái)拆分傳遞給它的字符串,并返回原始的字符串。如果分隔符緊挨在一起,那么函數(shù)就會(huì)以變量值的形式返回"?"。拆分出來(lái)的字符串,以變量${VAR_1}、{VAR_2}…以此類推的形式加以返回。

2、分隔符默認(rèn)是逗號(hào),如果你想要多此一舉,明確指定使用逗號(hào),需要對(duì)逗號(hào)轉(zhuǎn)義,如“,”

3、例如,在測(cè)試計(jì)劃中定義變量VAR="a||c|":

${__split(${VAR},VAR),|} :該函數(shù)調(diào)用會(huì)返回VAR變量的值,例如"a||c|",
         并設(shè)定VAR_n=4、VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?、VAR_5=null變量的值。
 
十六、_ _XPath
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、函數(shù)__XPath讀取XML文件,并在文件中尋找與指定XPath相匹配的地方。每調(diào)用函數(shù)一次,就會(huì)返回下一個(gè)匹配項(xiàng)。到達(dá)文件末尾后,會(huì)從頭開(kāi)始。如果沒(méi)有匹配的節(jié)點(diǎn),那么函數(shù)會(huì)返回空字符串,另外,還會(huì)向JMeter日志文件寫一條警告信息。

整個(gè)節(jié)點(diǎn)列表都會(huì)被保存在內(nèi)存之中。

例如:

${__XPath(/path/to/build.xml, //target/@name)} 
這會(huì)找到build.xml文件中的所有目標(biāo)節(jié)點(diǎn),并返回下一個(gè)name屬性的內(nèi)容。

十七、__setProperty
jmeter學(xué)習(xí)指南之常用函數(shù)的使用
1、函數(shù)__setProperty用于設(shè)置JMeter屬性的值。函數(shù)的默認(rèn)返回值是空字符串,因此該函數(shù)可以被用在任何地方,只要對(duì)函數(shù)本身調(diào)用是正確的。

2、通過(guò)將函數(shù)可選的第3個(gè)參數(shù)設(shè)置為"true",函數(shù)就會(huì)返回屬性的原始值。

3、屬性對(duì)于JMeter是全局的,因此可以被用來(lái)在線程和線程組之間通信。

十八、__time

1、函數(shù)__time可以通過(guò)多種格式返回當(dāng)前時(shí)間。

2、如果省略了格式字符串,那么函數(shù)會(huì)以毫秒的形式返回當(dāng)前時(shí)間。其他情況下,當(dāng)前時(shí)間會(huì)被轉(zhuǎn)成簡(jiǎn)單日期格式。包含如下形式:

YMD = yyyyMMdd
 
HMS = HHmmss
 
YMDHMS = yyyyMMdd-HHmmss
 
USER1 = JMeter屬性time.USER1
 
USER2 = JMeter屬性time.USER2
用戶可以通過(guò)修改JMeter屬性文件來(lái)改變默認(rèn)格式,或者自定義格式,例如修改YMD格式: time.YMD=yyMMdd。

十九、__V

1、函數(shù)__V可以用于執(zhí)行變量名表達(dá)式,并返回執(zhí)行結(jié)果。它可以被用于執(zhí)行嵌套函數(shù)引用(目前JMeter不支持)。

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

 ${A1}:能正常工作。
 
 ${A${N}}:無(wú)法正常工作(嵌套變量引用)。
 
 ${__V(A${N})}:可以正常工作。A${N}變?yōu)锳1,函數(shù) __V返回變量值A(chǔ)1。
 
二十、__evalVar

1、函數(shù)__evalVar可以用來(lái)執(zhí)行保存在變量中的表達(dá)式,并返回執(zhí)行結(jié)果。

如此一來(lái),用戶可以從文件中讀取一行字符串,并處理字符串中引用的變量。

2、例如:

假設(shè)變量"query"中包含有"select ${column} from ${table}",
而 "column"和"table" 中分別包含有 "name"和"customers",
那么${__evalVar(query)}將會(huì)執(zhí)行"select name from customers"。

二十一、__eval

1、函數(shù)__eval可以用來(lái)執(zhí)行一個(gè)字符串表達(dá)式,并返回執(zhí)行結(jié)果。

如此一來(lái),用戶就可以對(duì)字符串(存儲(chǔ)在變量中)中的變量和函數(shù)引用做出修改。

2、例如:

給定變量 name=Smith、column=age、table=birthdays、
SQL=select ${column} from ${table} where name='${name}',
那么通過(guò) ${__eval(${SQL})},就能執(zhí)行 "select age from birthdays where name='Smith'"
這樣一來(lái),就可以與CSV數(shù)據(jù)集相互配合,例如,將SQL語(yǔ)句和值都定義在數(shù)據(jù)文件中。

二十二、__escapeHtml

1、函數(shù)__escapeHtml用于轉(zhuǎn)義字符串中的字符(使用HTML實(shí)體)。支持HTML 4.0實(shí)體。

2、例如:
"bread" & "butter"變?yōu)?"bread" & "butter"

二十三、__unescapeHtml

1、函數(shù)__unescapeHtml用于反轉(zhuǎn)義一個(gè)包含HTML實(shí)體的字符串,將其變?yōu)榘瑢?shí)際Unicode字符的字符串。支持HTML 4.0實(shí)體。

2、例如:

字符串 "&lt;Fran&ccedil;ais&gt;" 變?yōu)?"<Fran?ais>"
3、如果函數(shù)不認(rèn)識(shí)某個(gè)實(shí)體,就會(huì)將實(shí)體保留下來(lái),并一字不差地插入結(jié)果字符串中。

例如,">&zzzz;x" 還是會(huì)變?yōu)?">&zzzz;x"。

二十四、__FileToString

1、函數(shù)__FileToString可以被用來(lái)讀取整個(gè)文件。每次對(duì)該函數(shù)的調(diào)用,都會(huì)讀取整個(gè)文件。

2、如果在打開(kāi)或者讀取文件時(shí)發(fā)生錯(cuò)誤,那么函數(shù)就會(huì)返回字符串"**ERR**"。

以上Jmeter函數(shù)你用過(guò)幾個(gè)呢?

看完有沒(méi)有發(fā)現(xiàn)有些函數(shù)可以很方便的解決你的問(wèn)題呢?

如果你對(duì)哪個(gè)函數(shù)的使用有疑問(wèn),歡迎留言討論~~


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI