日常工作過程中,我們需要對網站的併發量、響應時間進行測試,這種測試通常是對網站平臺的 測試,其原理是:客戶端發出一個請求,服務端收到這個請求給予相應的響應,從收到請求到做出響 應的這一段時間稱爲系統的響應時間,而系統在不同的負載,即不同的用戶訪問數的情況下,這個響 應時間是不相同的。實際應用中能這些點的第三方軟件很多,但不是本文的重點,所以本文中,我們 利用pytho n腳本來編寫一段簡單的代碼來實現網站併發量和響應時間的測試。 總體而言這樣的測試實質上也是一次性能測試,結合測試的類型來看,所有的性能測試都可以從 兩個維度劃分:一種是基於用戶行爲模擬的性能測試,例如本文將要介紹的“使用python對網站進行 測試”;另一種抽象程度更高的構造數據包級的測試,關於這種類型的測試,在後續的博文中,有 機會的我們再舉例說明。 一、測試網站的響應時間 測試網頁的響應時間,代碼如下: import threading import urllib from time import sleep,ctime def getHtml(func,url): try: print 'start request: %s,%s' %(func,ctime()) page = urllib.urlopen(url) html = page.read() print 'receive response:%s,%s' %(func,ctime()) return html except: print 'error……' return [] if __name__== '__main__': url = "http://image.baidu.com/channel?c=%E7%BE%8E%E5%A5%B3#%E7%BE%8E%E5%A5%B3" for i in range(1,11): print '%s : request'%i test = getHtml(i,url) print '----------------------------------------------' 運行程序,結果如下: Type "copyright", "credits" or "license()" for more information. >>> ================================ RESTART ================================ >>> 1 : request start request: 1,Sun May 03 13:29:41 2015 receive response:1,Sun May 03 13:29:41 2015 ---------------------------------------------- 2 : request start request: 2,Sun May 03 13:29:41 2015 receive response:2,Sun May 03 13:29:42 2015 ---------------------------------------------- 3 : request start request: 3,Sun May 03 13:29:42 2015 receive response:3,Sun May 03 13:29:42 2015 ---------------------------------------------- 4 : request start request: 4,Sun May 03 13:29:42 2015 receive response:4,Sun May 03 13:29:43 2015 ---------------------------------------------- 上面是一個很粗糙的代碼片段,但如果將程序的輸出信息寫到一個文件中,並寫一個相應數據分 析統 計代碼,我們就能實現一個測試網頁訪問時間的代碼。 二、使用多線程實現網頁並非訪問 import threading import urllib from time import sleep,ctime def getHtml(func,url): try: print 'start request: %s,%s' %(func,ctime()) page = urllib.urlopen(url) html = page.read() print 'receive response:%s,%s' %(func,ctime()) return html except: print 'error……' return [] if __name__== '__main__': url = "http://www.baidu.com/" threads = [] list = range(1,11) for i in list: t = threading.Thread(target=getHtml,args=(i,url)) threads.append(t) print '---------------------start -------------------------' for j in list: print '%s : request'%j threads[j-1].start() for k in list: threads[k-1].join() print '---------------------over -------------------------'
程序運行結果如下所示:
---------------------start -------------------------
1 : request
start request: 1,Sun May 03 15:16:54 20152 : request
start request: 2,Sun May 03 15:16:54 20153 : request
4 : requeststart request: 3,Sun May 03 15:16:54 2015
start request: 4,Sun May 03 15:16:54 20155 : request
start request: 5,Sun May 03 15:16:54 20156 : request
start request: 6,Sun May 03 15:16:54 20157 : request
start request: 7,Sun May 03 15:16:54 20158 : request
9 : requeststart request: 8,Sun May 03 15:16:54 2015
10 : requeststart request: 9,Sun May 03 15:16:54 2015
start request: 10,Sun May 03 15:16:54 2015
receive response:3,Sun May 03 15:16:54 2015
receive response:7,Sun May 03 15:16:54 2015
receive response:2,Sun May 03 15:16:54 2015
receive response:5,Sun May 03 15:16:54 2015
receive response:1,Sun May 03 15:16:54 2015
receive response:4,Sun May 03 15:16:54 2015
receive response:6,Sun May 03 15:16:54 2015
receive response:10,Sun May 03 15:16:54 2015
receive response:9,Sun May 03 15:16:55 2015
receive response:8,Sun May 03 15:16:55 2015
---------------------over -------------------------
由於是多線程,程序的運行結果,顯得比較混亂,在具體計算一個請求和對應的響應時間時,我們可
以根據請求的start request後面的seq號和receive response後面的seq來匹配對應的響應數據包,例如
receive response:2,Sun May 03 15:16:54 2015 seq =2與start request: 2,Sun May 03 15:16:54 20153 :
request中的seq =2相等,那麼receive response:2是start request: 2的響應事務,同理可計算出全部的
請求對應的響應時間,最後根據一定的規則來生成所需的報告數據。