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

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