1. 程式人生 > >【轉】 JMeter學習(十六)JMeter函數學習

【轉】 JMeter學習(十六)JMeter函數學習

blog 自動 當前 3.2 add 函數的調用 瀏覽器 con 保存

JMeter函數是一些能夠轉化在測試樹中取樣器或者其他配置元件的域的特殊值。一個函數的調用就像這樣:${_functionName(var1,var2,var3)},-functionName匹配函數名,圓括號內設置函數的參數,例如${_time(YMD)}實際參數因函數而不同。不需要參數的函數使圓括號內為空,例如${_theadNum}.

Jmeter函數有兩種函數:自定義靜態值(或者變量)和內置函數。

自定義靜態值允許當一個測試樹編譯並且提交運行時自定義變量被它們的靜態值代替。這個替代在測試運行開始時發生一次。這可以用來替換所有的HTTP請求中的DOMAIN域。

內置函數允許寫進任何非控制器測試組件的任何域,這包括取樣器,定時器,監聽器,修改器,斷言,前置處理器,後置處理器和配置元件。

註意:如果使用和內置函數同樣的名字定義一個自定義變量,你的自定義靜態變量會覆蓋內置函數,但不建議名字相同。

函數列表:

  • regexFunction        -正則表達式函數
  • counter
  • threadNum     -得到線程數
  • intSum       -添加變量
  • StringFromFile   -從文件讀取一行
  • machineName   -得到本地計算機名
  • JavaScript(Apache Rhino)
  • random number
  • CSVRead     -從CSV文件讀取一個屬性
  • P        -讀取一個屬性
  • setProperty   -設置一個屬性
  • log       -記錄一個日誌
  • logn       -記錄一個日誌
  • BeanShell    -運行BeanShell
  • split       -分隔一個字符串變量
  • XPATH      -使用一個xpath表達式
  • time       -返回一些格式的當前時間
  • jexl       -執行一個jexl表達式

以下講解一些內置函數的用法:

一、_csvRead 函數

_cvsRead函數是從外部讀取參數,csvRead函數可以從一個文件中讀取多個參數。

步驟:

1、先新建一個文件,例如c.txt,裏面的數據存放為

[email protected],111111

[email protected],111111

[email protected],111111

為使用的用戶名和密碼,也可以加其他參數,用逗號隔開,每一列表示一種參數,每一行則表示一組參數

2、在jmeter中的【選項】中選擇【函數助手對話框】,將會彈出如下對話框:

技術分享

其中:

CSV file to get values from | *alias:要讀取的文件路徑,為絕對路徑

CSV文件列號| next| *alias:從第幾列開始讀取,註意第一列是0

如上圖所示,我們讀取的是c.txt裏面的第一列用戶名(如果要讀取第二列的密碼,只需將0改成1即可,往後類推),點擊【生成】按鈕即可生成函數,我們使用時即拷貝生成的函數字符串:${__CSVRead(E:\c.txt,0)}

3、使用如下圖所示:

技術分享

其中的值即為我們的生成的函數(${__CSVRead(E:\c.txt,0)}),jmeter執行時,如果是多線程,則從c.txt中第一行開始讀取,如果設置的線程數大於c.txt中的行數,將會循環讀取數據,通常該行數可用於參數化

二、_Random 函數

_Random函數是從某數據段隨機讀取數據替換參數,當需要添加多條數據記錄且某些字段需要唯一性時使用,使用該函數隨機生成的數據是數字。

步驟:

1、在jmeter中的【選項】中選擇【函數助手對話框】,將會彈出如下對話框:選擇_Random

技術分享

如上圖:

一個範圍內的最小值:即我們所要取的隨機數的最小值,上述設置為1,生成的隨機數將不會小於1

一個範圍內允許的最大值:即我們所要取的隨機數的最大值,上述設置為100,生成的隨機數將不能超過100

Name of variable in which to store the result(optional)為函數名稱名稱:這裏我們設置為random,即用於存儲在測試計劃中其他的方式使用的值

點擊【生成】按鈕即可得到我們所需要的函數:${__Random(1,100,random)},然後將函數復制到需要用到隨機數的地方,我們就可以使用啦。

註意:當我們設置的線程數超過隨機數範圍時,隨機數將會重復生成

2、使用如下圖所示:

技術分享

將生成的函數填充進值框中即可

三、_ StringFromFile 函數

_StringFromFile函數是從一個文件中讀取一個字符串,用來實現參數化,如果讀取或者打開這個文件發生錯誤時,將會返回“**ERR** ”字符串

步驟:

1、在jmeter中的【選項】中選擇【函數助手對話框】,將會彈出如下對話框:選擇_StringFromFile

技術分享

輸入文件的全路徑:輸入讀取文件的絕對路徑

Name of variable in which to store the result:函數名稱(只是用來存儲變量的名稱,不可以${名稱}使用)

Start file sequence number:初始序列號

Final file sequence number:結束序列號

上圖所示表示:如果目錄下面有test2.dat、test3.dat、test4.dat,則按順序讀取這三個文件中的每行值,其中初始序列號表示文件後面的開始序號,如果有test1.dat文件將不會被讀取,結束序列號類推(至於為什麽會有這個看起來似乎是多余的功能,而不是直接全部寫到一個文件裏,猜想有可能是在數據過多的時候,避免一個文件太大或者是他們的習慣?)。

另外使用的時候,我循環了10次,但是這三個文件我只設置了9行值,結果點擊運行,顯示只執行了9次,而不會循環從第一個文件中讀取。

當然,如果你就只是想讀取一個文件,直接在【輸入文件的全路徑】後面輸入文件的路徑即可,其余三個值不用填寫,點擊生成即可一樣調用

如果希望讓文件執行多次,可以按如下配置:

技術分享

表示test.dat文件將會被讀取4次

當線程組大於(文件行數*4)時,將只會執行(文件行數*4)次,而不會循環讀取執行所有的設定線程組數,沒有指定讀取次數,則默認會循環讀取數據

2、引用函數:

技術分享

四、_Counter 函數

每次調用計數器函數都會產生一個新值,從1開始每次加1。計數器既可以被配置成針對每個虛擬用戶是獨立的,也可以被配置成所有虛擬用戶公用的。如果每個虛擬用戶的計數器是獨立增長的,那麽通常被用於記錄測試計劃運行了多少遍。全局計數器通常被用於記錄發送了多少次請求。

計數器使用一個整數值來記錄,允許的最大值為2,147,483,647。

功能:這個函數是一個計數器,用於統計函數的使用次數,它從1開始,每調用這個函數一次它就會自動加1,它有兩個參數,第一個參數是布爾型的,只能設置成“TRUE”或者“FALSE”,如果是TRUE,那麽每個用戶有自己的計數器,可以用於統計每個線程歌執行了多少次。如果是FALSE,那就使用全局計數器,可以統計出這次測試共運行了多少次。第二個參數是“函數名稱”

格式:${__counter(FALSE,test)}

使用:我們將“_counter”函數生成的參數復制到某個參數下面,如果為TRUE格式,則每個線程各自統計,最大數為循環數,如果為FALSE,則所有線程一起統計,最大數為線程數乘以循環數

參數:

第一個參數:True,如果測試人員希望每個虛擬用戶的計數器保持獨立,與其他用戶的計數器相區別。False,全局計數器

第二個參數:重用計數器函數創建值的引用名。測試人員可以這樣引用計數器的值:${test}。這樣一來,測試人員就可以創建一個計數器後,在多個地方引用它的值。

以上,摘自網絡(不知道怎麽用,只好摘抄,記錄下來等靈感~~~~(>_<)~~~~ )。

目前,我測試_Counter函數,就是在參數列表加一個參數,值填寫為${__counter(FALSE,test)}

如圖:

技術分享

如上,設置為false,那麽發送了多少個請求,counter1的最大值就等於最大請求數。

想知道counter1的值,可以通過結果樹查看。

技術分享

五、_RegexFunction 正則函數

正則表達式函數可以使用正則表達式(用戶提供的)來解析前面的服務器響應(或者是某個變量值)。函數會返回一個有模板的字符串,其中攜帶有可變的值。

_RegexFunction還可以被用來保存值,以便供後續使用。具體的引用名是函數的第6個參數。在函數執行後,測試人員可以使用用戶定義值的語法來獲取同樣的值。

例如,如果測試人員輸入“refName”昨晚第6個參數,那麽測試人員可以使用:

${refName}來引用第二個參數的結果,即函數運行的結果。

${refName_g0}來引用函數解析後發現的所有匹配結果。

${refName_g1}來引用函數解析後發現的第一個匹配組合。

${refName_g#}來引用函數解析後發現的第N個匹配組合。

${refName_matchNr}來引用函數總共發現的函數匹配組合的數目。

參數:

第一個參數:用於解析服務器響應數據的正則表達式。它會找到所有的匹配項。如果測試人員希望將表達式中的某部分應用在模板字符串中,記得加上圓括號。例如,<a href="(.*)">。這樣就會將鏈接的值存放到第一個匹配組合中(這裏只有一個匹配組合)。又如,<input type="hidden" name="(.*)"value="(.*)">。在這個例子中,鏈接的name作為第一個匹配組合,鏈接的value會作為第二個匹配組合。這些組合可以用在測試人員的模板字符串中

第二個參數:這是一個模板字符串,函數會動態填寫字符串的部分內容。要在字符串中引用正則表達式捕獲的匹配組合,請使用語法:$[group_number]$。例如$1$或者 $2$。測試人員的模板可以是任何字符串

第三個參數:第3個參數告訴JMeter使用第幾次匹配。測試人員的正則表達式可能會找到多個匹配項。對此,測試人員有4種選擇:

1、整數,直接告訴JMeter使用第幾個匹配項。 “1”對應第一個匹配,“2”對應第二個匹配,以此類推

2、RAND,告訴JMeter隨機選擇一個匹配項

3、ALL,告訴JMeter使用所有匹配項,為每一個匹配項創建一個模板字符串,並將它們連接在一起

4、浮點值0到1之間,根據公式(找到的總匹配數目*指定浮點值)計算使用第幾個匹配項,計算值向最近的整數取整

第四個參數:如果在上一個參數中選擇了“ALL”,那麽這第4個參數會被插入到重復的模板值之間

第五個參數:如果沒有找到匹配項返回的默認值

第六個參數:重用函數解析值的引用名,參見上面內容

第七個參數:輸入變量名稱。如果指定了這一參數,那麽該變量的值就會作為函數的輸入,而不再使用前面的采樣結果作為搜索對象

以上摘自溫素劍的《零成本實現Web性能測試:基於Apache JMeter》。

步驟:

1、在jmeter中的【選項】中選擇【函數助手對話框】,將會彈出如下對話框:選擇_RegexFunction

技術分享

參數的介紹見上文。

如上,在【 class="text have_icon" name="(.*)" id="email"】裏面,得到到第一個匹配的name的值,如果沒有找到匹配的,得到的值就為hello

技術分享

如上,我們應該匹配得到的值為:EMAIL

使用:

技術分享

查看是否成功:

技術分享

記得上面我們設定的第5個參數嗎?如果沒有在響應數據裏面找到匹配的,返回的值就為我們制定的hello,如下:

技術分享

如果該正則函數在前面已經使用過,我們在後面就可以用我們指定的第6個參數的值來引用該函數得到函數解析的結果啦:

技術分享

技術分享

六、_javaScript函數

函數__javaScript可以用來執行JavaScript代碼片段(非Java),並返回結果值。JMeter的_javaScript函數會調用標準的javascript解釋器。JavaScript會作為腳本語言使用,因此測試人員可以做相應的計算。

在腳本中可以訪問如下一些變量。

Log:該函數的日誌記錄器。

Ctx:JmeterContext對象。

Vars:JmeterVariables對象。

threadName:字符串包含當前線程名稱 (在2.3.2 版本中它被誤寫為"theadName")。

sampler:當前采樣器對象(如果存在)。

sampleResult:前面的采樣結果對象(如果存在)。

props:JMeter屬性對象。

Rhinoscript允許通過它的包對象來訪問靜態方法。例如,用戶可以使用如下方法訪問JMeterContextService靜態方法:

Packages.org.apache.jmeter.threads.JMeterContextService.getTotalThreads()

JMeter不是一款瀏覽器,它不會執行從頁面下載的JavaScript。

參數:

第一個參數:JavaScript代碼片段,待執行的JavaScript代碼片段。例如:

1、new Date():返回當前日期和時間

2、 Math.floor(Math.random()*(${maxRandom},+1)):在0 和變量maxRandom之間的隨機數

3、${minRandom}+Math.floor(Math.random()*(${maxRandom}-${minRandom}+1)):在變量 minRandom和maxRandom之間的隨機數"${VAR}"=="abcd"

第二個參數:變量名,重用函數計算值的引用名

請記得為文本字符串添加必要的引號。另外,如果表達式中有逗號,請確保對其轉義。例如,${__javaScript(‘${sp}‘.slice(7\,99999))},對7之後的逗號進行了轉義。

摘自《零成本實現Web性能測試:基於Apache JMeter》 。

步驟:

1、在jmeter中的【選項】中選擇【函數助手對話框】,將會彈出如下對話框:選擇__javaScript

技術分享

這是得到當前日期,引用:

技術分享

得到結果日期:

技術分享

第二個參數是變量名,當該函數被執行一次之後,我們就可以根據變量名引用該函數,得到函數解析的值:

技術分享

需要註意的是:JMeter不是瀏覽器,因此不會執行Sampler接收到的頁面上的javascript,也不能使用__javascript函數來調用用戶自定義的javascript函數。

七、_split函數

${__split(...)} 是JMeter中自帶的拆分字符串為數組的函數,有3個參數, 第1個參數為被分割的字符串,第2個參數為存放分割後字符串的參數名稱,第3個參數為用於分割的分隔符。例如,函數表達式"${__split(a|b|c,VAR,|)}"執行完成後,結果被存放在4個參數中:

  • ${VAR_n}的值為3:總共得到了3個分割後的字符串。
  • ${VAR_1}的值為a:第1個分割得到的字符串。
  • ${VAR_2}的值為a:第2個分割得到的字符串。
  • ${VAR_3}的值為a:第3個分割得到的字符串。

另外有個需要註意的問題是:在${__split(...)} 中,如果拆分字符串中的內容包含有符號",",一定得用符號"\"進行轉義,否則可能被JMeter誤認為是參數分隔符,會導致無法正確生成字符串數組。

八、__threadNum與__machinaName函數

${__threadNum}是一個系統參數,其取值為當前線程的線程號

${__machinaName}是一個系統參數,獲取執行當前Test Plan的機器名。

在調試或記錄日誌時,可以使用這兩個函數輸出與線程號和機器名稱相關的信息。

九、__time函數

time函數可以獲取當前時間,該函數的第一個參數為日期格式,第二個參數為存放獲得當前時間值的參數名稱。如:${__time(yyyy-MM-dd HH:mm:ss,)}

十、__intSum與__longSum函數

__intSum與__longSum函數分別用來進行整型和長整型數據的加法運算。這兩個函數均為可變參數列表的函數,可用來進行任意個整型或長整型數據的加法運算。

十一、__setProperty函數

該函數用於運行時設置JMeter中的任何屬性的值。

十二、__eval和__evalVar函數

這兩個函數用於計算一個參數表達式的值。例如,給定參數值:Table=mytable Column=username Username=dennis

SQL=select ${column} from ${table} where userid=‘${username}‘

則${__eval${SQL}}得到的值為select username from mytable where uername=‘dennis‘

_evalVal函數與__eval函數基本一致,唯一不同的是,__evalVar函數可以將計算後的值存放到一個參數中。

十三、__BeanShell函數

該函數允許用戶運行一段自定義的BeanShell函數,腳本可以用來設置JMeter的屬性和參數值,也可以返回數據。BeanShell是一種非常靈活的腳本方式。

【轉】 JMeter學習(十六)JMeter函數學習