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ù)字符串。
一病袄、__BeanShell:beanshell函數(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ù)
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ù)描述如下:
其實(shí)這個(gè)函數(shù)的作用跟正則表達(dá)式提取器的作用是類似的桐磁。
三悔耘、__counter:計(jì)數(shù)器函數(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ù)
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ò)。
六详囤、__longSum:長(zhǎng)整型求和函數(shù)
該函數(shù)用來(lái)計(jì)算兩個(gè)或更多長(zhǎng)整型值的和财骨,使用方法跟上面的__intSum函數(shù)一樣镐作。
七、__StringFromFile:讀取文件中的字符串函數(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ù)
1稽犁、Random string length:隨機(jī)字符的長(zhǎng)度
2、Chars to use for random string generation:用來(lái)生成隨機(jī)字符串的字符骚亿,可以是純數(shù)字已亥,純字符,字符字母數(shù)字組合
3来屠、Name of variable in which to store the result (optional):隨機(jī)生成的字符被變量保存
4虑椎、${__RandomString(6,abcdefgh1234566,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
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ù)
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
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
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í)體。
二十三黄橘、__unescapeHtml
1兆览、函數(shù)__unescapeHtml用于反轉(zhuǎn)義一個(gè)包含HTML實(shí)體的字符串,將其變?yōu)榘瑢?shí)際Unicode字符的字符串塞关。支持HTML 4.0實(shí)體抬探。
2、如果函數(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**"笛谦。