jmeter參數(shù)化
背景
進(jìn)行接口,性能測試進(jìn)行參數(shù)化是必然要考慮的場景,自從上次使用了jmeter進(jìn)行接口測試后,就已經(jīng)開始思考了jmerer如何進(jìn)行參數(shù)化眼耀,來方便測試,通過查閱相關(guān)資料佩憾,將jmeter參數(shù)化分為兩個部分進(jìn)行講解哮伟。
簡單參數(shù)化
怎么定義簡單呢潭辈,就是直接在jmeter中設(shè)置就可以了,不需要調(diào)用其他的東西(數(shù)據(jù)庫澈吨、CSV)文件。簡單的參數(shù)化設(shè)置主要有以下:
- 用戶定義變量
- 隨機(jī)變量
- 正則表達(dá)式提取器
- 函數(shù)助手
用戶定義變量
添加用戶定義變量主要有兩個地方:點(diǎn)擊測試計(jì)劃-用戶定義變量寄摆。進(jìn)入某一線程租谅辣,右擊-添加配置元件-用戶定義變量。下面對定義變量的作用域進(jìn)行實(shí)驗(yàn):
-
在測試計(jì)劃上添加用戶變量:用戶名與密碼婶恼,在第一個線程組也定義用戶變量桑阶,在第一個線程組的某個請求中定義變量。為了做到區(qū)分勾邦,對每一組變量定義時(shí)蚣录,key與value均不一樣,具體如下眷篇。
通過運(yùn)行測試計(jì)劃萎河,發(fā)現(xiàn)所有的請求均斷言成功,說明只要定義的變量是唯一值蕉饼,那這個變量就是全局的虐杯。從實(shí)際情況出發(fā),如果真的是全局的昧港,可以直接定義再測試計(jì)劃中(域名)擎椰,如果是局部使用的可以直接定義再某個線程組,因?yàn)槎x在測試計(jì)劃中创肥,如果一旦停掉該線程組达舒,則里面用戶自定義的變量將不能被引用。當(dāng)時(shí)還想到一個問題:如果是定義的變量重名叹侄,引用的規(guī)則是什么樣的巩搏,將線程組2中的用戶變量定義與線程組1中請求定義的一致(想當(dāng)然的以為走最近原則還是會調(diào)用同一個線程組的變量),實(shí)際上調(diào)用的是第二個線程組的變量圈膏。其實(shí)就一個原則:不要定義兩個變量名一致的變量塔猾。
隨機(jī)變量
隨機(jī)變量有兩種方式:用戶直接定義,其實(shí)就是用戶定義變量稽坤,只是值不固定丈甸,還有就是借用函數(shù)助手來生成隨機(jī)變量。
用戶定義隨機(jī)變量
用戶定義隨機(jī)變量尿褪,參考用戶定義變量睦擂,可以在測試計(jì)劃、線程組杖玲、sample中定義顿仇。關(guān)于作用域與用戶定義變量一致。在線程組中自定義一個變量如下:
為了查看獲取的電話號碼是否為隨機(jī)數(shù),將線程的循環(huán)次數(shù)定為6臼闻,校驗(yàn)每次發(fā)出請求的參數(shù)是否為隨機(jī)產(chǎn)生的鸿吆。
經(jīng)查看我們的隨機(jī)每次請求中攜帶的參數(shù)是不一樣的述呐,所以簡單的隨機(jī)變量這樣設(shè)置就可以了惩淳。但是我們的隨機(jī)數(shù)的設(shè)置還有一個兩個設(shè)置需要說明下:
Seed for Random function 隨機(jī)數(shù)產(chǎn)生器的種子,默認(rèn)為當(dāng)前時(shí)間(以毫秒為單位)
- Per Thread(User) 如果為False乓搬,則隨機(jī)數(shù)產(chǎn)生器在線程組的所欲線程共享思犁,為True,則每個線程都有自己的隨機(jī)數(shù)產(chǎn)生器
通過函數(shù)助手生成隨機(jī)變量
函數(shù)助手的中對應(yīng)的函數(shù)非常大,如果有需要可以查閱官方文檔查看官方文檔說明进肯,這里只是要用隨機(jī)函數(shù)來生成隨機(jī)變量激蹲,所以對隨機(jī)函數(shù)進(jìn)行說明。
添加隨機(jī)函數(shù):點(diǎn)擊選項(xiàng)函數(shù)助手下拉框中選擇__Random函數(shù)
-
添加對應(yīng)的的參數(shù)江掩,最大值学辱,最小值,變量名
-
點(diǎn)擊生成會產(chǎn)生對應(yīng)的函數(shù)字符串频敛,請求中直接進(jìn)行引用项郊。見下圖
-
運(yùn)行一下請求,查看結(jié)果斟赚,確實(shí)是正常獲取了隨機(jī)變量着降。見下圖
正則表達(dá)式提取器
正則表達(dá)式提取器主要用在jmeter關(guān)聯(lián)中。關(guān)聯(lián)是請求與請求之間擁有數(shù)據(jù)關(guān)聯(lián)拗军∪味矗可以是同一個線程組關(guān)聯(lián),也可以是跨線程組關(guān)聯(lián)发侵。因?yàn)樵谑褂眠^程中發(fā)現(xiàn)正則表達(dá)式會不正確交掏,這里提供一個正則表達(dá)式在線校驗(yàn)地址正則表達(dá)語法校驗(yàn)
線程組內(nèi)正則表達(dá)是提取使用
通過獲取優(yōu)惠券列表后,直接從返回結(jié)果進(jìn)行優(yōu)惠券詳情查詢刃鳄。
整體的構(gòu)造如圖盅弛,有些不用的我直接禁用掉。
-
查詢優(yōu)惠券正常發(fā)出請求叔锐,對返回結(jié)果進(jìn)行提取
備注:對于正則表達(dá)式的配置說明挪鹏,網(wǎng)上相應(yīng)的說明比較多,可自行查閱相關(guān)資料愉烙,這里不進(jìn)行闡述讨盒。
-
進(jìn)行查看優(yōu)惠券請求,其中接口相關(guān)參數(shù)參考優(yōu)惠券列表接口返回結(jié)果步责,如下
-
看看是否正確獲取了相關(guān)參數(shù)
以上就是同一個線程組內(nèi)的正則提取返顺。
跨線程正則提取
依然是用優(yōu)惠券的例子禀苦,只是這次查詢優(yōu)惠券的接口與獲取優(yōu)惠券列表不在一個線程組內(nèi)。主要思路是:將在線程中的變量遂鹊,設(shè)置為屬性振乏,這樣就可以為全局使用。但是前提是第一個線程組要先執(zhí)行秉扑,否則變量獲取不到昆码。所以在測試計(jì)劃中勾選獨(dú)立運(yùn)行每個線程組。
-
測試在獲取到優(yōu)惠券的請求中添加BeanShell PostProcessor 邻储,將通過正則提取獲得的變量設(shè)置為JmeterProperties。具體操作如下
-
可以通過在工作臺中添加非測試元件——Property Display中查看是否設(shè)置JmeterProperties 成功
-
新建一個線程組并添加同樣的查詢用戶券旧噪,直接引用jmeter屬性吨娜,具體如下
4.查看請求結(jié)果可以看到變量引用正常
這樣就實(shí)現(xiàn)了跨線程的變量引用。
函數(shù)助手
函數(shù)助手提供了很豐富的函數(shù)功能淘钟,在獲取隨機(jī)變量已經(jīng)使用了隨機(jī)變量的函數(shù)宦赠,在跨線程組的時(shí)候使用了${__P(coupon,null)},其實(shí)可以用函數(shù)助手米母,找到函數(shù)助手中的-p函數(shù)就行勾扭。因?yàn)楹瘮?shù)助手中的函數(shù)偏多,這里不做詳述铁瞒,可以到官網(wǎng)查看函數(shù)助手妙色。查看之后,自行判斷是否可以使用慧耍。
復(fù)雜一點(diǎn)參數(shù)化
定義復(fù)雜身辨,其實(shí)就是需要用到外部資源,比如外部文件芍碧,比如數(shù)據(jù)庫煌珊。
- 讀取參數(shù)文件
- 讀取數(shù)據(jù)庫
讀取文件
jmeter即可以讀取多種文件,這里只CSV文件進(jìn)行讀取說明泌豆,個人覺得這種用的比較多定庵。讀取CSV文件有兩種方式,一種通過配置CSV Data Set Config 進(jìn)行讀取踪危,還有一種是通過函數(shù)助手進(jìn)行讀取蔬浙。
CSV Data Set Config方式
這里我們模擬的是不同帳號登錄場景,用戶名陨倡,密碼均是讀取CSV敛滋。
- 準(zhǔn)備測試數(shù)據(jù)
建立一份csv數(shù)據(jù),用戶名為第一列,密碼為第二列粮彤。如圖
-
添加CSV Data Set Config
測試計(jì)劃-右擊添加配置元件-選擇CSV Data Set Config進(jìn)行配置,配置項(xiàng)的說明可以自行在網(wǎng)上查閱诈火。
線程組的循環(huán)測試配置的8庶艾,config配置Recycle on EOF 為true袁余,這樣可以循環(huán)讀取,否則讀到最后一行就停止了咱揍。
-
請求配置獲取數(shù)據(jù)颖榜,變量名取的是CSV Data Set Config中的variabld Names
-
運(yùn)行,查看是否請求中讀取了csv中的數(shù)據(jù)煤裙。
函數(shù)助手讀取
-
通過函數(shù)助手中的csvRead函數(shù)讀取掩完。首頁也是準(zhǔn)備數(shù)據(jù),這里就用上面準(zhǔn)備的這份數(shù)據(jù)硼砰。選項(xiàng)函數(shù)助手_csvRead函數(shù)且蓬,按如下配置
-
進(jìn)行請求配置,見下圖
-
查看請求參數(shù)题翰,是否正確獲取了文件內(nèi)容
以上就是讀取csv文件的方法.必須說明的是如果線程組中配置的是線程數(shù)大于1則從第一行讀取恶阴,如果大于配置文件的行數(shù),則循環(huán)讀取數(shù)據(jù)豹障。如果線程數(shù)配置為1則只會讀取第一行數(shù)據(jù)冯事。
讀數(shù)據(jù)庫
csv讀取是自己準(zhǔn)備一些測試數(shù)據(jù),很多情況下我們需要校驗(yàn)落庫或是直接從數(shù)據(jù)庫中讀取數(shù)據(jù)來作為請求參數(shù)血公。設(shè)想場景是查詢數(shù)據(jù)庫昵仅,然后循環(huán)讀取查詢結(jié)果作為下一個請求的參數(shù)。下面就這個場景進(jìn)行實(shí)踐累魔。
-
在測試計(jì)劃中添加數(shù)據(jù)庫配置信息岩饼。測試計(jì)劃_添加配置元件_JDBC Connection Configuration
各個配置項(xiàng)信息在網(wǎng)上又相關(guān)資料,這里配置參數(shù)說明
- 添加數(shù)據(jù)庫請求
這里對返回的數(shù)據(jù)設(shè)置了兩個變量article_id,id 兩個變量薛夜。如果需要時(shí)引用籍茧,${article_id_1}是artilce_id 第一行,${article_id_1}取第二行梯澜,總數(shù)可以用${article_id_#}來獲取寞冯。id同樣也是如此。
- 因?yàn)槭切枰@取循環(huán)讀取晚伙,所以我們可以添加一個循環(huán)控制器
循環(huán)次數(shù)直接用${article_id_#}吮龄。
- 因?yàn)槭侵鹦凶x取,所以可以添加個計(jì)數(shù)器來實(shí)現(xiàn)
-
article_id 需要拼接計(jì)數(shù)器來生成一個變量咆疗,所以需要用的函數(shù)助手中的--V函數(shù)漓帚。配置如下:
-
所有準(zhǔn)備工作都做好了,現(xiàn)在就準(zhǔn)備添加一個請求來讀取數(shù)據(jù)午磁,配置如下
-
校驗(yàn)請求是否正常獲取參數(shù)
- 備注
配置好后進(jìn)行鏈接發(fā)出請求尝抖,提示cannot load JDBC Driver class "com.mysal.jdbc.Driver"毡们,解決方法
jmeter的參數(shù)化就這樣告一段了,下次考慮進(jìn)行簡單壓測腳本編寫昧辽。