測試工具
JMeter 4.0
場景描述
- 公司是某電商網(wǎng)站,測試Search框在用戶可以輸入關(guān)鍵字后所坯,返回一些相應的關(guān)鍵字或者商品信息等钦讳。
- 用戶在輸入字符時,每隔0.5秒停頓一次鳄逾,直到字符輸入完畢;
- 用戶輸入的每一個字符都會觸發(fā)JS請求Service進行處理灵莲,并返回結(jié)果雕凹;
- 長短皆有,有空格和特殊符號政冻;
測試場景
由提供一些關(guān)鍵字作為測試數(shù)據(jù)枚抵;
Web Server & Service端
常規(guī)場景
- 輸入這些關(guān)鍵字,查看其返回的結(jié)果明场;使用用戶最終輸入的完整關(guān)鍵字汽摹,獲取性能指標;(其作用是模擬用戶使用粘貼復制的方式苦锨,查詢的用戶行為)
- 精確模擬用戶行為逼泣,當用戶每次輸入關(guān)鍵字的字符時,發(fā)送請求產(chǎn)生大壓力下的情況舟舒。并且在每次輸入字符后拉庶,使用高斯分布計時器,延遲0.5秒魏蔗,偏差值為0.1秒的方式來模擬砍的。腳本編寫時,外層使用Transaction controller莺治,內(nèi)層使用Foreach controller的組合來模擬這一行為方式廓鞠;
- 采用20,100 User不同負載下持續(xù)10 min的測試方法
異常場景
- 增壓測試;(不斷增加壓力谣旁,直至達到性能極限)
- 定時器定點發(fā)送請求床佳;(不斷加壓,使用類似于秒殺活動場景來檢測服務器)
測試目的
- 通過性能測試建立性能基線榄审;
- 監(jiān)控服務器在較大壓力下的工作情況砌们,查找是否有隱藏的弱點;
- 分析測試結(jié)果數(shù)據(jù)搁进,確保服務器集群的工作負荷預期需求浪感;
- 為線上服務維護或異常處理時的策略提供依據(jù);
腳本編寫
為了模擬用戶行為所編寫的腳本較為復雜饼问,里面涉及:
- BeanShell的腳本編寫影兽,由于還是有java基礎(chǔ),所以編寫本身并不難莱革;
- 計時器的應用峻堰,使用高斯計時器(正態(tài)分布計時器)
- 使用Transaction Controller和ForEach Controller進行測試;
這里面有幾個小坑:
- 腳本編寫思路是將keyword得到之后盅视,將其按照長度分割成若干子串:
以keyword+key為例:
其分解成:
k
ke
key
keyw
keywo
keywor
keyword
keyword+
keyword+k
keyword+ke
keyword+key
因此需要使用foreach controller來包含HTTP Request Sampler捐名。
注意,但外層的BeanShell腳本編寫不能使用BeanShell PreProcesser來編寫闹击,因為這樣它就不會使內(nèi)層的HTTP Request工作镶蹋,原因不明等以后調(diào)試源代碼才清楚,所以請使用BeanSampler來做這個事情赏半。
-
在代碼中如果使用字符串賦值梅忌,涉及到它本身的變量使用的,需要在變量上加雙引號除破。
如圖:
JmeterScript_UserBehavior_Overview.png 如上圖中的方法keyWordLength()是個聲明牧氮;如果需要調(diào)用就必須在腳本的下方書寫keyWordLength();否則腳本并沒有運行;
- 通過閱讀Beanshell Sampler中的代碼可以知道瑰枫,我最終需要的變量名為keyWd_{子字符串下標}踱葛,這個在jmeter的控制器中,只能使用ForEach Controller光坝。它有三個變量:
- Input variable prefix尸诽,讓你使用變量名的下標;
- Start index for loop (exclusive)盯另,這個就是你下標開始的位置性含,但是特別坑的是,這個值是被排除在外的鸳惯,所以如果是從0開始商蕴,我只能寫-1叠萍;
- End index for loop (inclusive),這個就是下標的最后一位绪商,按照腳本中設置的值苛谷,我應該寫${keyWdLength}-1;
- Add "_" before number? 這個請勾選格郁,在未知長度的循環(huán)中腹殿,這個控制器顯得那么得雪中送炭;
-
因為Foreach controller中為變量自動加下劃線例书,就省去了變量拼接的問題锣尉。實際上,沒有這個控件可能要寫更復雜的腳本才行决采。
JmeterScript_Http_request.png
- 由于關(guān)鍵字存在空格自沧,因此我一開始將關(guān)鍵字中的空格統(tǒng)一轉(zhuǎn)成了%20。但是在實際請求時:
HttpClient會報錯java.net.URISyntaxException: Malformed escape pair at index XX....织狐;
原因在于URL中的%是特殊符號暂幼,我在腳本中的寫法是將關(guān)鍵字逐一拼接,因此會有一個關(guān)鍵字剛好是只帶有%移迫,這是非法的旺嬉。因此,才會報錯厨埋。
解決方法:在上圖中的Parameters頁中可以勾選“Encode?”邪媳。
- 把圖中的Simple Controller改成Transaction Controller就可以了。在較復雜場景中荡陷,報告中生成TPS結(jié)果是更有價值的數(shù)據(jù)雨效。
剩下的腳本就比較簡單了,我就不再贅述废赞。