内容简介:mechanize是一个模拟browser行为的一个库,当然你也可以用其它的如urllib2、request、tornado.httpclient等等库,不是必须。后面两个numpy和matplotlib也是可选的,当你需要它自动生成图形化报表时才会用到,安装matplotlib你的系统有可能需要安装libpng和freetype库。注意:按multi-mechanize的默认规则,每个脚本必须有一个Transaction的类,类要有一个run方法,在run里面写测试业务逻辑。这个例子是打开http://w
pip install multi-mechanize mechanize numpy matplotlib
mechanize是一个模拟browser行为的一个库,当然你也可以用其它的如urllib2、request、tornado.httpclient等等库,不是必须。
后面两个numpy和matplotlib也是可选的,当你需要它自动生成图形化报表时才会用到,安装matplotlib你的系统有可能需要安装libpng和freetype库。
multimech-newproject my_project
# # 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
使用小技巧
Cookie:
br._ua_handlers[“_cookies”].cookieja
单个脚本多个测试用例的支持:这个思路来源于testsuite的概念,同一个testsuite里的case作为一组相关的case可以共享一些代码逻辑和资源(如browser对象),而multi-mechanize默认的方式是不支持的,要实现这一点,只需要一点小小的技巧即可,上代码:
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
# -*- 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
真实的并发量计算:multi-mechanize使用了multiprocessing库,会同时起多个进程,且每个进程按config里的配置起多个线程来实现并发测试,但真正的单位时间内的并发量并不是config里设置threads=10这样的表示每秒10个并发,真实的并发量需要根据最终完成的transaction数和这些transaction里面包含多少次http请求和总的完成时间来计算得知,这点不是很直观。
自定义统计数据:你可以往self.custom_timers这个内建的字典里塞任意的自定义统计数据,他们在报表中都能够得到体现。
更多的文档和一手资料请参考文档http://testutils.org/multi-mechanize/和git代码库https://github.com/cgoldberg/multi-mechanize 。最后multi-mechanize还不是很好用,一是使用过程中发现有一些情况会抛异常,导致不能正确生成报表,另一个别扭的是case的编写不是unittest那一套,是作者自创Transaction流:)
以上所述就是小编给大家介绍的《multi-mechanize负载压力》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 性能测试vs压力测试vs负载测试
- 没有压力的“压力测试”:LSTM神经网络是如何预测焦虑的?
- [原]压力测试
- jmeter 分布式压力测试
- 使用ab压力命令测试网站性能
- 漫谈数据治理(一):计算与存储压力
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Uberland
Alex Rosenblat / University of California Press / 2018-11-19 / GBP 21.00
Silicon Valley technology is transforming the way we work, and Uber is leading the charge. An American startup that promised to deliver entrepreneurship for the masses through its technology, Uber ins......一起来看看 《Uberland》 这本书的介绍吧!