最近需要一個web系統進行接口性能測試,這里順便說一下性能測試的步驟吧,大概如下
一、分析接口頻率
根據系統的復雜程度,接口的數量有多有少,應該優先對那些頻率高,數據庫操作頻繁的接口進行性能測試,所以先和開發根據業務情況,找到頻率最高的幾個接口。完成這些后再逐步完成剩余接口的測試。
二、找到合適的測試工具
性能測試工具簡直數不勝數,最著名莫過於loadrunner,因為它支持windows,呵呵呵,這也是我剛畢業時用的工具(當然是盜版了。。。),簡單易用,功能強大,不過收費版是真貴。我現在用得最多是jmeter,用起來也很簡單。
三、根據實際調整測試頻率
有的性能測試純粹為了對比新舊版本的性能提升的,那就不用管三七二十一,全力去壓既可。有的性能測試只是為了找到正常情況下,系統能支撐的最大並發之類,那么就要根據實際情況調整測試頻率了,比如業務不繁忙時應該按多大頻率,業務繁忙時應該按多大頻率,業務正常時應該按多大頻率。
四、分析測試結果
測試結果用於分析被測系統的性能瓶頸,它並不單單指測試工具的測試結果,還包括被測系統的日志,例如數據庫訪問日志,打印慢查詢之類,作為一個性能測試人員,應該需要具備分析日志和測試工具結果的能力。
下面說我在本次測試中遇到的難題,因為被測系統會對接口請求內容進行分析,如果格式不對就直接返回失敗,所以用jmeter模擬請求時我都是根據實際請求內容來模擬的,其中有一個接口怎么模擬都返回失敗,通過wireshark抓包后發現,正常的包接口請求body中有的換行符是"0a"有的是"0d0a"而且不能亂否則達不到想要的效果(同時多條數據查詢),用jmeter模擬的請求參數卻只能全是"0a"(用parameters的detail模擬)或者全是"0d0a"(用body data模擬),折騰許久仍然不行,最終只能郁悶地用python寫代碼來對這個接口做性能測試,其實真心不建議這樣做,如果可以的話寧可讓開發修改接口來臨時繞過也好,因為術業有專攻,python畢竟不是專門用來做性能測試的,用它做性能測試是下策。windows下用python做性能測試大概有幾種方案:
1、多線程
2、多進程
3、協程
本來打算用eventlet(基於協程),卻發現用eventlet需要用它的“綠色標准庫”,我這個接口請求內容如果用它的“綠色urllib2”來模擬的話又比較麻煩,用pycurl則簡單許多,為了利用多核CPU的優勢,我決定先用多進程+多線程的方式來實現一個比較挫的“接口性能測試”了。代碼大概如下:
import string, threading, time import random import multiprocessing def perf(): a=0 while a<int(packets):#請求包總數,如果用時間長短來限制是更好的 for i in xrange(int(vusers)):#並發數,即並發線程數 t = threading.Thread(target=cloudquery,args=(random.randint(1, 1000000000)))#cloudquery是指每個線程干的活,就是實際的被測試接口,隨機數用來盡量保證每次請求不同的內容,可以用其他方法來實現,不過要挑選性能比較好的方法,以免浪費資源在這上面 t.start()#啟動線程 a+=1 if __name__ == '__main__': jobs = [] for i in range(int(process)):#並發進程 p = multiprocessing.Process(target=perf)#啟動多個進程,每個進程啟動同樣的線程 jobs.append(p) p.start() for aa in jobs: aa.join()
有時間再用綠色urllib2來實現一次,看看是不是更好一些。
后記:已經用多進程+協程實現了,不過不知道是否我用法錯誤,從抓包看兩者並發沒有比多進程+多線程快啊。2進程*100線程的並發 > 2進程*協程的並發。。。