首先不得不承認這只是一種很基礎的web性能加載測試,因爲之前一直沒有專業的學過應該如何測試。原因是我們公司的網站快完成了,但是感覺打開的速度很慢啊,後來自己寫了一個簡單的python腳本主要模擬對web資源的獲取。所以這些時間不包括瀏覽器的渲染js時間,我就先忽略不計吧。
當然很感謝借這個機會讓我學習了一下python的裝飾器語法,之前一直有聽說,而且看了很多資料其實都不是很懂。直到這次實戰讓我加深了對裝飾器的理解,本文並不會詳細介紹裝飾器的語法,網上講python裝飾器的文章真的很多,我就不給url了。
首先在一切事情之前我們先設計兩個裝飾器,一個是輸出某個函數的運行時間,一個在測試的開始和結束輸出一段字符串。
import time
from functools import wraps
def timeit(func):
@wraps(func)
def _timeit(*args,**kwargs):
start = time.time()
ret = func(*args,**kwargs)
print("elapsed time %5.3f"%(time.time()-start))
return ret
return _timeit
def test(test_name):
def _test(func):
@wraps(func)
def __test(*args,**kwargs):
print("test {0} begin:".format(test_name))
func(*args,**kwargs)
print("test {0} end\n".format(test_name))
return __test
return _test
在準備好上述的裝飾器我們開始設計測試類。對web的訪問測試分爲兩種,不需要session支持的(比如訪問首頁)和需要session支持的(比如查看用戶個人信息需要先登陸)。
import requests,re,urlparse
class TaskBase(object): #儘量繼承object
def __init__(self):
self._request = requests
@property
def request(self):
return self._request
def run(self):
pass
@timeit
def get(self,url,*args,**kwargs):
print(url,end=" ")
reply = self.request.get(url,*args,**kwargs)
return reply
@timeit
def post(self,url,*args,**kwargs):
print(url,end=" ")
reply = self.request.post(url,*args,**kwargs)
return reply
def get_html(self,url):
self.parse_html(self.get(url))
def parse_html(self,reply):
if not reply.url.endswith(("js","css","jpg")):
resource = re.findall("(?<=\").*?\.js(?=\")",reply.text)
resource += re.findall("(?<=src=\").*?\.jpg(?=\")",reply.text)
resource += re.findall("(?<=href=\").*?\.css(?=\")",reply.text)
for res in resource:
self.get_html(urlparse.urljoin(reply.url,res))
class TaskSessionBase(TaskBase):
def __init__(self):
TaskBase.__init__(self)
self._request = requests.session()
def login(self):
url = "https://xxxxx"
data={"username":"xxxx","password":"xxxx"}
reply = self.post(url,data=data).json()
return "errorCode" in reply and reply["errorCode"]==0
@test("Login")
def run(self):
self.login()
上面主要是兩個基類,一個是TaskBase用於處理與session無關的請求,一個是TaskSessionBase用於處理與session有關的請求,其繼承TaskSessionBase的子類可以先調用父類的login()函數先登陸。
在上面TaskBase和TaskSessionBase類中都有run方法用於執行測試函數。
比如當測試訪問用戶中心的類如下:
class TaskUsercenter(TaskSessionBase):
def __init__(self):
TaskSessionBase.__init__(self)
@test("Usercenter")
def run(self):
if self.login():
self.get_html("https://xxxx/usercenter")
else:
print("login error")
其實真正寫python時間不長,其中寫的不好還請各位看官多多提出修改意見。