python-web加載性能測試(初級)

首先不得不承認這只是一種很基礎的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時間不長,其中寫的不好還請各位看官多多提出修改意見。
發佈了27 篇原創文章 · 獲贊 11 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章