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时间不长,其中写的不好还请各位看官多多提出修改意见。

你可能感兴趣的:(python,性能测试)