JMeter的七種參數(shù)化

一、CSV Data Set Config

以中信銀行的基金搜索接口為例,在線程組鼠標(biāo)右鍵選擇”添加”->”配置元件”->”CSVDataSetConfig”


  1. 文件名:可以輸入?yún)?shù)文件的絕對(duì)路徑或相對(duì)路徑,參數(shù)文件可以保存在txt或csv文件里。

  2. 文件編碼:大部分情況下都是UTF-8,如果出現(xiàn)中文亂碼可以嘗試下GBK。

  3. 變量名:接口請(qǐng)求時(shí),引用這個(gè)參數(shù)化的變量名稱(chēng),多個(gè)變量用英文逗號(hào)隔開(kāi)。

  4. 忽略首行:若參數(shù)文件的數(shù)據(jù)量較小,可以設(shè)置成FALSE。若較多建議設(shè)置成TRUE(實(shí)際上就是表頭).

  5. 分隔符:參數(shù)文件里多個(gè)參數(shù)之間用分隔符隔開(kāi),默認(rèn)情況下是英文逗號(hào),但是如果你的參數(shù)帶逗號(hào)比如第一個(gè)參數(shù)是”hello,wego”,第二個(gè)參數(shù)是”你好,我們走”,此時(shí)若使用默認(rèn)分隔符,系統(tǒng)會(huì)認(rèn)為有4個(gè)參數(shù),第一個(gè)是hello第二個(gè)是wego,第三個(gè)是你好,第四個(gè)是我們走;這時(shí)要修改CSVDataSetConfig里的分隔符,觀察發(fā)現(xiàn)兩個(gè)參數(shù)中都不含”==”,所以我們可以把分隔符改成==,分隔符如何設(shè)置全憑個(gè)人喜好,只要參數(shù)中沒(méi)有這個(gè)符號(hào)即可。

后面4個(gè)不常用,使用默認(rèn)配置就行了。

輸入CSV Set Config的變量名,并用${}把變量名包在大括號(hào)里,第一次請(qǐng)求,key會(huì)讀取“股票”,type會(huì)讀取“1”,5次全部讀取完后,會(huì)循環(huán)讀取,直到所有進(jìn)程結(jié)束。

可以看到第三次請(qǐng)求調(diào)用的就是第三組的參數(shù)A和3。

二、用戶(hù)定義變量

這次我們加一個(gè)接口,產(chǎn)品搜索接口,產(chǎn)品搜索界面如下:


用戶(hù)定義變量有2個(gè)地方可以設(shè)置,第一個(gè)是測(cè)試計(jì)劃,第二個(gè)是配置元件。首先看一下測(cè)試計(jì)劃,點(diǎn)擊測(cè)試計(jì)劃節(jié)點(diǎn),點(diǎn)擊添加,輸入變量名稱(chēng)和變量值,接口應(yīng)用變量的方式和CSV一樣,${key}

圖片.png

第二個(gè)配置元件,線程組鼠標(biāo)右鍵”添加”->”配置元件”->”用戶(hù)定義變量”

兩者區(qū)別在于測(cè)試計(jì)劃中設(shè)置的變量,是針對(duì)所有線程,所有請(qǐng)求的。而配置元件添加的用戶(hù)定義變量,是根據(jù)他的上級(jí)節(jié)點(diǎn)決定的。若上級(jí)節(jié)點(diǎn)是線程,則只對(duì)這個(gè)線程起作用,若上級(jí)節(jié)點(diǎn)是請(qǐng)求,則只對(duì)這個(gè)請(qǐng)求起作用,若上級(jí)節(jié)點(diǎn)是測(cè)試計(jì)劃,則對(duì)所有線程的所有請(qǐng)求都起作用。比如圖中的配置元件,就只對(duì)“Thread Group”這個(gè)線程組起作用。

三、計(jì)數(shù)器

線程組鼠標(biāo)右鍵,”添加”->”配置元件”->”計(jì)數(shù)器”

Starting value: 開(kāi)始值

Maximum value: 最大值

Increment: 遞增值,每次增長(zhǎng)值,在基金搜索接口中有一個(gè)參數(shù)是fundType,代表基金類(lèi)型,取值范圍是1到5,所以我們這里設(shè)置開(kāi)始值是1,最大值是5,每次遞增1。

Number format: 數(shù)字格式,若不填寫(xiě),則會(huì)從初始值到最大值之間以自然數(shù)的方式遞增,比如1,2,3,4,5。上面的截圖中,我輸入了00,所以系統(tǒng)會(huì)為我補(bǔ)齊到2位,在請(qǐng)求時(shí)會(huì)是00,01,02,03,04,05。

Exported Variable Name: 引用變量名稱(chēng),這里輸入count,在接口請(qǐng)求時(shí),我們輸入${count}。

Track counter independently for each user: 與每用戶(hù)獨(dú)立的跟蹤計(jì)數(shù)器。我們把線程組設(shè)置線程數(shù)2,循環(huán)數(shù)2。若這里勾選用戶(hù)獨(dú)立計(jì)數(shù),就是線程1循環(huán)2次,請(qǐng)求發(fā)送時(shí),fundType字段分別請(qǐng)求的是1和2。線程2循環(huán)2次,請(qǐng)求發(fā)送時(shí),fundType字段分別請(qǐng)求的是1和2。若這里不勾選用戶(hù)獨(dú)立計(jì)數(shù),則4次請(qǐng)求,fundType字段分別請(qǐng)求的是1、2、3、4。

Reset counter on each thread Group Iteration: 在每個(gè)線程組迭代上重置計(jì)數(shù)器。若勾選則4次請(qǐng)求的fundType字段全都是1,這兩個(gè)都勾選的時(shí)候,一般都是線程組內(nèi)有循環(huán),每次循環(huán)的時(shí)候會(huì)遞增。否則這樣設(shè)置就沒(méi)有意義了。

四、請(qǐng)求默認(rèn)值

線程組鼠標(biāo)右鍵,”添加”->”配置元件”->”HTTP默認(rèn)請(qǐng)求”

可以看到有很多種默認(rèn)請(qǐng)求,中信銀行是一個(gè)web系統(tǒng),所以這里測(cè)試使用的是http或https請(qǐng)求,這里我就說(shuō)一下http默認(rèn)請(qǐng)求值的使用方法,其他默認(rèn)請(qǐng)求的使用思路基本相同。不做贅述。

實(shí)際測(cè)試中,會(huì)有多個(gè)環(huán)境,比如測(cè)試環(huán)境,開(kāi)發(fā)環(huán)境,生產(chǎn)環(huán)境A,生產(chǎn)環(huán)境B等等。為了實(shí)現(xiàn)環(huán)境的快速切換,我們不能每次切換環(huán)境,都去把所有的請(qǐng)求地址修改一遍。正確的做法是把所有請(qǐng)求的ip、端口、協(xié)議、編碼都清空,添加一個(gè)http默認(rèn)請(qǐng)求值,在默認(rèn)請(qǐng)求值里面輸入ip、端口、協(xié)議、編碼。當(dāng)有多個(gè)環(huán)境時(shí),可以配置多個(gè)http默認(rèn)請(qǐng)求值。保留一個(gè)為啟用狀態(tài),其余全部禁用。

若多個(gè)請(qǐng)求中,有相同的參數(shù),比如截圖中“搜索有關(guān)的請(qǐng)求”線程組下的所有請(qǐng)求,都有兩個(gè)參數(shù)pageSize和currentPage,這樣的參數(shù)也可以在請(qǐng)求中直接刪除,添加到http默認(rèn)請(qǐng)求值。

五、Beanshell采樣器或JSR223采樣器

線程組鼠標(biāo)右鍵,”添加”->”取樣器”->”BeanShell取樣器”,在采樣器內(nèi)輸入vars.put("responseFormat","JSON");如下圖:

括號(hào)中第一個(gè)引號(hào)內(nèi)的字符串是變量名,第二個(gè)引號(hào)內(nèi)的字符串是變量值,在接口發(fā)送請(qǐng)求時(shí),使用${responseFormat},就可以實(shí)現(xiàn)參數(shù)化。

JSR223采樣器功能類(lèi)似,只是提供了更多的腳本語(yǔ)言可以選擇,如果選擇beanshell那么就等于是beanshell采樣器了,jmeter官方的使用說(shuō)明中推薦使用groovy語(yǔ)言,理由是性能較好,但是我實(shí)際測(cè)試過(guò),如果只是執(zhí)行賦值語(yǔ)句,只是把beanshell采樣器當(dāng)做定義參數(shù)化來(lái)使用,beanshell采樣器性能還是略高于JSR223+groovy的。

六、后置處理器json和正則表達(dá)式

有時(shí)我們需要的參數(shù)是動(dòng)態(tài)的,這時(shí)候就需要把第一個(gè)請(qǐng)求的響應(yīng)結(jié)果提取出來(lái),作為第二個(gè)請(qǐng)求的參數(shù)發(fā)送出去,后置處理器可以解決這個(gè)問(wèn)題,常用的有正則表達(dá)式提取器,若接口返回的數(shù)據(jù)是json字符串,也可以用json提取器。以中信銀行基金為例,先搜索,然后查看第一個(gè)基金的詳情頁(yè)。

鼠標(biāo)右鍵第一個(gè)請(qǐng)求,”添加”->”后置處理器”->”正則表達(dá)式提取器”。

引用名稱(chēng):就是變量名。例如輸入number

正則表達(dá)式:使用正則表達(dá)式在響應(yīng)結(jié)果中提取數(shù)據(jù),例如截圖中想要提取的數(shù)據(jù)是"prodNo":"000043"中的000043,那么正則表達(dá)式可以寫(xiě)成"prodNo":"(.*?)",這樣就會(huì)把004698賦值給number,后面的請(qǐng)求使用${number}就可以獲取到000043了。

模板:格式為1,2...以此類(lèi)推,意思是若正則表達(dá)式匹配到多個(gè)值,則返回第幾個(gè)值,1代表第一個(gè)。缺省值:若正則表達(dá)式?jīng)]有匹配到數(shù)據(jù),則返回缺省值中的數(shù)據(jù)。

第二種是json提取器,鼠標(biāo)右鍵第一個(gè)請(qǐng)求,”添加”->”后置處理器”->”json提取器”。

Namesofcreatedvariables:是變量名,多個(gè)用分號(hào)隔開(kāi)。

Jsonpathexpressions:json路徑。根據(jù)請(qǐng)求的響應(yīng)結(jié)果,輸入json路徑,例如基金搜索接口,使用$.content.resultList[*].prodNo可以匹配到第一頁(yè)10條數(shù)據(jù)的基金代碼

MathNo.:若1個(gè)路徑提取了多個(gè)參數(shù),匹配第x個(gè)參數(shù)。上面匹配到了10條數(shù)據(jù),我們?nèi)〉谝粭l就輸入1。

Defaultvalues:缺省值。

七、函數(shù)

舉3個(gè)比較典型的例子,其他函數(shù)可在官網(wǎng)的使用說(shuō)明中,自己查看學(xué)習(xí)。
第一個(gè),線程內(nèi)傳參,以隨機(jī)數(shù)為例:

點(diǎn)擊菜單欄”工具”->”函數(shù)助手”,選擇”Random”,這是一個(gè)隨機(jī)函數(shù),輸入最小值1,最大值5,變量名R,點(diǎn)擊生成,“{__Random(1,5,R)}”。在整個(gè)線程里,第一次使用需要輸入完整的字符串{__Random(1,5,R)},之后使用則可以輸入${R}。作用是隨機(jī)生成1到5之間的整數(shù)。

第二個(gè),線程內(nèi)傳參,函數(shù)助手里,選擇setProperty(全局變量),變量名輸入number,值輸入0408,生成${__setProperty(number,0408,)},這樣可以在不同線程之間引用這個(gè)變量了,應(yīng)用方式為${__P(number)},也可以把0408改成動(dòng)態(tài)獲取,例如結(jié)合上面的json提取器提取到的number,想讓number跨線程傳參就可以寫(xiě)成${__setProperty(n,${number},)},就是把0408這個(gè)靜態(tài)的值寫(xiě)成動(dòng)態(tài)的${number},把第一個(gè)變量名改成n,保證2個(gè)變量不重名,其他線程應(yīng)用時(shí),寫(xiě)成${__P(n)}。

第三個(gè),變量名嵌套變量名,V函數(shù)。

例如系統(tǒng)中有三個(gè)變量分別是number_1,number_2,number_3,設(shè)置一個(gè)計(jì)數(shù)器count,此時(shí)若想應(yīng)用這3個(gè)變量,直接寫(xiě){number_{count}},系統(tǒng)是無(wú)法識(shí)別的。要使用變量名嵌套函數(shù),V函數(shù)。正確寫(xiě)法是${_V(number${count})}。

八、總結(jié)第1-4種是第一類(lèi)配置元件,第5種是第二類(lèi)采樣器,第6種是第三類(lèi)前置處理器與后置處理器,第7種是第四類(lèi)函數(shù)。Jmeter參數(shù)化4類(lèi)中常用的7種方法,各有各的好處。

原文:http://download.51testing.com/wenzhang/51Testing_wenzhang59_1.pdf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容