軟件測(cè)試 | JMeter函數(shù)和變量
JMeter函數(shù)可以被認(rèn)為是某種特殊的變量,它們可以被采樣器或者其他測(cè)試原件所引用。函數(shù)調(diào)用的語(yǔ)法如下:
其中,_functionName匹配被調(diào)用的函數(shù)名稱。用圓括號(hào)包含參數(shù)的形參,例如$(_time(YMD)),不同函數(shù)要求的參數(shù)不同。有些JMeter函數(shù)不要求參數(shù),則可以不適用圓括號(hào),例如$(_threadNum)。
如果一個(gè)函數(shù)的參數(shù)中包含逗號(hào),那么必須對(duì)逗號(hào)進(jìn)行轉(zhuǎn)義(使用“\”),否則JMeter會(huì)把逗號(hào)當(dāng)成參數(shù)分隔符。例如:
$(_time(EEE\, d MMM yyy)}
變量引號(hào)的語(yǔ)法如下:
${VARIABLE}
如果測(cè)試計(jì)劃中引用了未定義的變量或者函數(shù),那么JMeter并不會(huì)報(bào)告/記錄錯(cuò)誤信息,引用返回的值就是引用自身。例如,假設(shè)字符串UNDEF沒(méi)有被定義為變量,那么${UNDEF}返回的值就是$(UNDEF)。變量、函數(shù)(包括屬性)都是大小寫(xiě)敏感的。JMeter2.3.1及其后續(xù)版本會(huì)剔除參數(shù)名中的空格,例如,$(_Random(1,63,LOTTERY)}中的“LOTTERY”會(huì)被“LOTTERY”所代替。

1.使用函數(shù)可以做些什么
目前有兩種類型的函數(shù):用戶定義的靜態(tài)值(或者變量)和JMeter內(nèi)置函數(shù)。
當(dāng)需要編譯測(cè)試樹(shù)或者提交運(yùn)行時(shí),用戶可以使用自定義變量來(lái)代替常用的靜態(tài)值。這種替換只在測(cè)試的開(kāi)始階段執(zhí)行一次。一個(gè)典型的應(yīng)用就是使用自定義變量來(lái)替換所有HTTP請(qǐng)求的DOMAIN域,例如,做出輕微改動(dòng),就可以讓同一個(gè)測(cè)試腳本適配多個(gè)服務(wù)器。
需要注意,目前變量不支持嵌套:例如${Var${N}}不能正常工作。但是在JMeter2.2及其以后版本中,可以借助函數(shù)_V(variable)來(lái)達(dá)成嵌套變量的目的(如${_V(Var${N})})。在早期的JMeter版本中可以使用$(_BeanShell(vars.get("Var${N}")))。
這種類型的替換也可以不用函數(shù)來(lái)實(shí)現(xiàn),但是就不像使用函數(shù)時(shí)那么直觀和方便。用戶可以創(chuàng)建默認(rèn)配置測(cè)試元件,它們會(huì)填充采樣器中的空白設(shè)置。
使用JMeter內(nèi)置函數(shù),用戶可以基于前面的服務(wù)器響應(yīng)數(shù)據(jù)、函數(shù)所在線程、當(dāng)前時(shí)間或者其他資源來(lái)動(dòng)態(tài)地計(jì)算變量值。這些變量的值會(huì)在整個(gè)測(cè)試期間針對(duì)每個(gè)請(qǐng)求動(dòng)態(tài)更新。
2.函數(shù)和變量可以被用在哪里
函數(shù)和變量理論上可以被用在任何測(cè)試元件的任何輸入域之中(除了測(cè)試計(jì)劃之外,見(jiàn)下面的內(nèi)容)。有些輸入域不支持隨機(jī)數(shù)組,因?yàn)樗鼈冎唤邮軘?shù)字,這樣一來(lái)就不支持函數(shù)。當(dāng)然,大多數(shù)輸入域支持函數(shù)。
將函數(shù)用于測(cè)試計(jì)劃(Test Plan)的設(shè)置時(shí),會(huì)受到一些限制。此種情況下,JMeter線程的變量在函數(shù)被處理時(shí)還沒(méi)有被設(shè)定,因此變量作為參數(shù)傳遞時(shí)沒(méi)有初始化,函數(shù)引用當(dāng)然不會(huì)生效。如此一來(lái),split()、regex()及變量賦值函數(shù)就都不能正常工作。函數(shù)threadNum()同樣不能正常工作,該函數(shù)在測(cè)試計(jì)劃層沒(méi)有意義。在測(cè)試計(jì)劃中,函數(shù)intSum、longSum、machineName、BeanShell、JavaScript、jexl、random、time、property functions、log functions應(yīng)該能正常工作。
配置元件是通過(guò)一個(gè)獨(dú)立線程處理的。因此函數(shù)(如_threadNum)不能在這些測(cè)試元件(如用戶定義的變量)之中正常工作。另外還需要注意,在用戶定義的變量(UDV)中定義的變量,在UDV被處理前是不能使用的。
搜索微信公眾號(hào):TestingStudio霍格沃茲的干貨都很硬核