企業(yè)應用開發(fā)過程中,性能測試是很重要的一個環(huán)節(jié),在這個環(huán)節(jié)中Apache的JMeter以它開源、100%純Java、操作方便等優(yōu)點發(fā)揮著很大的作用。
經(jīng)過一段時間的使用,多少有些心得和技巧,拿出來共享,希望能有些幫助。
1、制作測試腳本:
手工制作測試腳本,需要你知道請求的url和攜帶的參數(shù)等等,太花費時間,
所以可以用badboy工具錄制腳本。這個工具雖然不是開源的,但是卻可以用來免費的錄制成.jmx的腳本,使用起來很方便。
官方網(wǎng)站是:
http://www.badboy.com.au/2、出現(xiàn)亂碼了?
在用JMeter發(fā)行HTTPRequest時,在請求參數(shù)中有中文時,發(fā)現(xiàn)存儲到DB中后,相應的字段是亂碼,
明明在參數(shù)后面的Encode選項中打了V。后來發(fā)現(xiàn)badboy錄制腳本的時候并沒有記錄編碼方式,所以修改腳本,
在Content encoding中設置正確的編碼方式就不會出現(xiàn)亂碼了。
3、JMeter的妙用---準備測試數(shù)據(jù):
要求性能測試開始前,先準備5W條數(shù)據(jù)。當然可以通過直接修改DB,但是如果這5W條數(shù)據(jù)涉及到很多表的關聯(lián),
甚至還要通過存儲過程的處理怎么辦,直接修改DB很容易出現(xiàn)錯誤的數(shù)據(jù),要是在客戶的機器上弄錯,可就闖禍了。
這時候想到了JMeter,它本來是用來模擬大量用戶并發(fā)請求的,現(xiàn)在用它來批量的生成數(shù)據(jù)吧。
如果要求每條數(shù)據(jù)都不同,就要修改腳本,使用JMeter的函數(shù)來動態(tài)產(chǎn)生數(shù)據(jù),比較常用的是CSVRead函數(shù),
記不住名的話Ctrl+F可以呼喚出函數(shù)助手。使用這個函數(shù)的時候需要注意幾點,首先是csv文件的編碼格式,
使用ansi沒有問題,使用unicode時會使讀取的第一行數(shù)據(jù)出現(xiàn)錯誤;
${__CSVRead(data.txt,0)}---讀取本行的第一列值
${__CSVRead(data.txt,1)}${__CSVRead(data.txt,next)}---讀取本行的第二列值,并把行標移動到下一行
試驗證明JMeter應該做好了同步,在多線程環(huán)境下上面的調(diào)用方法沒有問題;
最后,修改JMeter的線程數(shù)會加快數(shù)據(jù)生成的速度,原理是當并發(fā)線程在20左右的時候會達到最大的吞吐量(request/分),
所以應該設定線程數(shù)20左右。
4、JMeter中debug方法:
JMeter提供了log函數(shù)輸出log,但是有時候并不好用,比如我想輸出某個函數(shù)的返回值看是不是正確的,
${__log(${__CSVRead(data.txt,1)})}這樣的寫法是錯誤的,JMeter會拋出異常,該怎么辦呢?
答案是巧用監(jiān)聽器(Listener)來輸出想看到的數(shù)據(jù),結果顯示為樹的那個監(jiān)聽器,
它可以讓你查看每個sampler的請求數(shù)據(jù)和響應數(shù)據(jù),在請求數(shù)據(jù)中就有你想看到的信息。
5、常用的功能:
使用HTTP Cookie Manager或URL重寫實現(xiàn)同一線程內(nèi)的多個請求共享Session。
把Login的請求放到只執(zhí)行一次的控制器中,那么即使循環(huán)多次,Login也只請求一次。
如果想讓多個線程在同一時刻同時請求,那么用Synchronizing Timer來做集合點。
為了節(jié)省系統(tǒng)資源,使用非窗口模式運行JMeter(jmeter -n -t test.jmx)
如果模擬并發(fā)用戶過多,比如200線程,那么可以分散到多臺機器上運行Jmeter(比如4臺電腦,每臺50線程)
更多功能請參照使用手冊
中文手冊(未完成)
http://wiki.javascud.org/pages/viewpage.action?pageId=55666、在winnt系統(tǒng)上,使用perfmon來幫助Jmeter采集服務器的系統(tǒng)資源數(shù)據(jù),可以配置log輸出這些數(shù)據(jù)作為性能瓶頸分析時使用。