标签:repo plot origin func ima scripts adr tip 完成
http://www.aikaiyuan.com/5318.html
对Web服务做Performance & Load测试,最常见的工具有Apache Benchmark俗称ab和商用工具LoadRunner。ab简单直接,功能也相对较弱,但我们经常看到的对一些Web server或者Framework的性能测试用的ab做的,而LoadRunner功能也确实很强大,各种大型软件公司、软件外包企业几乎是必备了,用起来很High,当然其价格也确实很High
这里要介绍的multi-mechanize(这名忒难记)是一款用Python开发的Performance & Load测试工具,是由Pylot的作者新近开发的,算是升级换代的产品。用multi-mechanize可以通过编写Python脚本来实现较复杂的测试逻辑,其并发测试是通过multiprocessing(多进程)和多线程机制来实现的。
multimech-newproject my_project
自动创建一个my_project目录,子目录test_scripts用来放测试脚本,config.cfg是测试配置,主要要配的是测试时间、测试脚本和并发threads量。
# # Copyright (c) 2010 Corey Goldberg (corey@goldb.org) # License: GNU LGPLv3 # # This file is part of Multi-Mechanize # import mechanize import time class Transaction(object): def __init__(self): self.custom_timers = {} def run(self): br = mechanize.Browser() br.set_handle_robots(False) start_timer = time.time() resp = br.open(‘http://www.example.com/‘) resp.read() latency = time.time() - start_timer self.custom_timers[‘Example_Homepage‘] = latency assert (resp.code == 200), ‘Bad HTTP Response‘ assert (‘Example Web Page‘ in resp.get_data()), ‘Failed Content Verification‘ if __name__ == ‘__main__‘: trans = Transaction() trans.run() print trans.custom_timers
注意:按multi-mechanize的默认规则,每个脚本必须有一个Transaction的类,类要有一个run方法,在run里面写测试业务逻辑。这个例子是打开http://www.example.com,记录访问所耗时长,非常简单明了,而实际的场景你可能需要有用户登录、然后测试某个或多个页面(API),只是测试业务复杂一些,写法是类似的。一个脚本文件只能有一个Transaction的类、类也只能有一个run方法,写起case来是不是觉得非常不方便?不用急,针对这点,后面的小技巧部分会另辟蹊径给你指条明路。
multimech-run my_project
测试结果报表和原始数据将放到results目录下按测试时间生成的子目录中,生产的html版本的结果统计如下图所示:
如果使用的是mechanize,可以通过下面的方式,从上面的browser对象br里获取到cookie信息。
br._ua_handlers[“_cookies”].cookieja
base.py,Transaction基类:
# -*- coding: utf-8 -*- import mechanize import time import traceback import logging class BaseTransaction(object): _TEST_CASE_PREFIX = "test_" def __init__(self): self._init() self.custom_timers = {} self.browser = mechanize.Browser() self.browser.set_handle_robots(False) self.browser.set_handle_redirect(True) self.browser.set_handle_referer(True) def _init(self): self.funcs = [] funcs_ = dir(self) for func_ in funcs_: if func_.startswith(self._TEST_CASE_PREFIX): self.funcs.append(func_) def run(self): """"所有继承BaseTransaction的类,只需要在以test_开头的方法里实现测试case即可,运行时多个case都可以得到测试""" try: for func in self.funcs: start_timer = time.time() getattr(self, func)() # run test latency = time.time() - start_timer self.custom_timers[‘%s‘ % func[len(self._TEST_CASE_PREFIX):]] = latency except Exception, e: logging.error(traceback.format_exc()) raise e
test_case_google.py里是真正的测试case,这里是同时测试多个google站点:
# -*- coding: utf-8 -*- from base import BaseTransaction class Transaction(BaseTransaction): def test_google_com_hk(self): # 测试逻辑代码,如类似于上面的测试example.com pass def test_google_com_sg(self): pass def test_google_com(self): pass
更多的文档和一手资料请参考文档http://testutils.org/multi-mechanize/和git代码库https://github.com/cgoldberg/multi-mechanize 。最后multi-mechanize还不是很好用,一是使用过程中发现有一些情况会抛异常,导致不能正确生成报表,另一个别扭的是case的编写不是unittest那一套,是作者自创Transaction流:)
Python Web 性能和压力测试 multi-mechanize
标签:repo plot origin func ima scripts adr tip 完成
原文地址:http://www.cnblogs.com/Thriving-Heart/p/7640997.html