首先不得不承认这只是一种很基础的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时间不长,其中写的不好还请各位看官多多提出修改意见。