python模块介绍- multi-mechanize 通用的性能测试工具

简介

Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务)。测试输出报告保存为HTML或JMeter的兼容的XML。Multi-Mechanize最常用于web性能和可扩展性(scalability)测试,也适用于任何python可以访问的API。尤其适合后台性能测试。稍微懂点编程的话,这个工具会远强过商业的性能测试工具。

主要特性:

  • 支持各种 HTTP methods
  • 高级超链接和HTML表单支持
  • 支持 SSL
  • 自动处理 Cookies
  • 可设置HTTP头
  • 自动处理重定向
  • 支持代理
  • 支持 HTTP 认证

安装

使用标准的python安装方式。注意,需要安装matplotlib以支持作图,在centos6下面可以这样安装yum -y install python27-matplotlib。multi-mechanize采用标准的python安装方式pip install multi-mechanize或者easy_install multi-mechanize这里都以linux(centos)为例。

快速入门

创建项目

# multimech-newproject my_project

执行项目

# multimech-run my_project

  user_groups:  2
  threads: 6

[================100%==================]  30s/30s   transactions: 119  timers: 119  errors: 0
waiting for all requests to finish...

analyzing results...

transactions: 125
errors: 0

test start: 2013-09-13 11:47:47
test finish: 2013-09-13 11:48:16

created: ./my_project/results/results_2013.09.13_11.47.46/results.html

done.

测试结果参见:

目录结构

每个测试项目包含以下内容:

  • config.cfg的配置文件。用于设定测试选项。
  • test_scripts/虚拟用户脚本的目录。在这里添加您的测试脚本。
  • results/:结果存储目录。对于每个测试都声称一个时间戳目录,里面包含结果的报告。

multimech-newproject,默认生成一个随机数的脚本。脚本v_user.py如下:

import randomimport timeclass Transaction(object):
    def __init__(self):
        pass

    def run(self):
        r = random.uniform(1, 2)
        time.sleep(r)
        self.custom_timers[‘Example_Timer‘] = rif __name__ == ‘__main__‘:
    trans = Transaction()
    trans.run()
    print trans.custom_timers

配置参数的含义如下:

  • run_time: duration of test (seconds) 测试的执行时间
  • rampup: duration of user rampup (seconds) 多少秒内发完请求
  • results_ts_interval: time series interval for results analysis (seconds) 结果分析时间
  • progress_bar: turn on/off console progress bar during test run 是否显示进度条
  • console_logging: turn on/off logging to stdout 是否输出到stdout
  • xml_report: turn on/off xml/jtl report 是否生成xml报告。
  • results_database: database connection string (optional) 保存结果的数据库连接字符串(可选)
  • post_run_script: hook to call a script at test completion (optional) 调用的善后脚本(可选)

更多介绍参见: http://testutils.org/multi-mechanize/configfile.html

脚本书写

用Python书写,测试脚本模拟虚拟用户对网站/服务/ API的请求,脚本定义了用户事务,更多内容参见脚本手册:http://testutils.org/multi-mechanize/scripts.html#scripts-label

每个脚本必须实现一个Transaction()类。这个类必须实现一个run()方法。基本的测试脚本结构如下:

class Transaction(object):
    def run(self):
        # do something here
        return

运行期间,Transaction()实例化一次,run()方法则反复调用:

class Transaction(object):

    def __init__(self):
        # do per-user user setup here
        # this gets called once on user creation
        return

    def run(self):
        # do user actions here
        # this gets called repeatedly
        return

从结构上看,如果每次run如果需要setup和teardown,时间也会计算在run里面,会显得事务处理的时间更长。这个就需要使用定时器来精确计时。

另外脚本建议先调试之后在运行,因为Multi-Mechanize有可能报错不够精准。可以这样运行:# python v_suds.py。v_suds.py是你实际使用的脚本名。另外suds这个库好像实现时性能一般,并发200时,客户端cpu占用率经常会100%,为此web service如果要上大量用户的话,建议用其他库替代,比如soapPy。进一步提升效率可以试用python的ctypes模块,或者cython(性能接近c语言)。不过Multi-Mechanize的多进程是基于python的,实在对性能有相当高的要求,就只能全部用c书写了。

下例使用mechanize进行web测试。

class Transaction(object):
    def __init__(self):
        pass

    def run(self):
        br = mechanize.Browser()
        br.set_handle_robots(False)
        resp = br.open(‘http://192.168.4.13/env.htm‘)
        assert (resp.code == 200), ‘Bad Response: HTTP %s‘ % resp.codes        assert (‘service name‘ in resp.get_data())

下面用httplib库重写脚本,并增加定时器。通过定时器,可以分析各个步骤的耗时。

import httplibimport timeclass Transaction(object):
    def run(self):
        conn = httplib.HTTPConnection(‘192.168.4.13‘)
        start = time.time()
        conn.request(‘GET‘, ‘/env.htm‘)
        request_time = time.time()
        resp = conn.getresponse()
        response_time = time.time()
        conn.close()
        transfer_time = time.time()

        self.custom_timers[‘request sent‘] = request_time - start        self.custom_timers[‘response received‘] = response_time - start        self.custom_timers[‘content transferred‘] = transfer_time - start        assert (resp.status == 200), ‘Bad Response: HTTP %s‘ % resp.statusif __name__ == ‘__main__‘:
    trans = Transaction()
    trans.run()

    for timer in (‘request sent‘, ‘response received‘, ‘content transferred‘):
        print ‘%s: %.5f secs‘ % (timer, trans.custom_timers[timer])

http://testutils.org/multi-mechanize/scripts.html#scripts-label 还有更多的实例。

参考资料

时间: 2024-10-10 02:12:21

python模块介绍- multi-mechanize 通用的性能测试工具的相关文章

python 模块介绍 - Base16, Base32, Base64 数据编码

简介 功能:RFC 3548: Base16, Base32, Base64 数据编码.转换二进制数据为适合明文协议传输的 ASCII 序列.转换8bits 为每个字节包含 6,5 或 4bits 的有效数据,比如 SMTP, URL 的一部分或者 HTTP POST 的一部分.参考:RFC 3548.编码算法不同于 uuencode.类型:标准库相关模块:uu, binhex, uu, quopri Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法.由于 2 的 6 次方

python模块之lib2to3(py2转py3自动化工具)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之lib2to3(py2转py3自动化工具) #http://tieba.baidu.com/p/3939904893 #操作步骤: 1.需要转换test.py文件为py3代码 #test.py文件放置在Scripts目录下,如果test.py文件不放置在Scripts目录下则 -w后面写完整的路径 #如: C:\python27\Tools\Scripts>2to3.py -w C:\P

python模块介绍

adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:连接MySQL数据库的py2exe:用来生成windows可执行文件Pylons:我们领导推荐的web frameworkpysql

python模块介绍-webbrowser:方便的web浏览器控制器

源码:Lib/webbrowser.py 简介 webbrowser模块提供了展示基于web文档的高层接口.多数情况下, 简单地调用open() 函数即可. 在Unix的X11下,首选调用图形浏览器.如果图形浏览器不可用或者没有显示终端,则使用文本模式浏览器 .如果使用文本模式浏览器, 在用户退出浏览器之前调用进程都会阻塞. 如果设置了BROWSER环境变量,它将覆盖平台默认的浏览器列表. BROWSER是os.pathsep分割的的浏览器列表.如果列表的部分值包含字符串"%s",解析

python模块介绍- binascii 二进制和ASCII转换

简介 binascii模块包含很多用来方法来转换二进制和各种ASCII编码的二进制表示法.通常不直接使用这些功能,而是使用封装模块,如uu, base64或binhex.binascii模块包含用C语言编写更快的低级功能,通常为高级模块所使用. 功能:二进制和ASCII转换. 类型:标准模块 相关模块: base64 标准模块. binhex 标准模块. uu        标准模块. quopri  标准模块. Uu编码 uu编码格式现在已经比较少使用(http://zh.wikipedia.

python模块介绍- SocketServer 网络服务框架

来源:https://my.oschina.net/u/1433482/blog/190612 摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer.这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步. 创建服务器的步骤.首先,你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()

python模块介绍-Tornado:Tornado中文文档-概述

快速链接 tornado-4.1.tar.gz, tornado最新版本 tornado源码@github 邮件列表:讨论.最新公告 tornado@stackoverflow tornado wiki tornado bug跟踪 快速入门 import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler):     def get(self):         self.write("He

python模块介绍- google 谷歌搜索引擎python接口

简介 google 模块是谷歌搜索引擎python接口,系用urllib2在google上进行搜索,使用BeautifulSoup进行解释外部封装,非google官方接口. 功能:谷歌搜索引擎python接口 类型:外部模块 当前版本:1.0.5(查看日期2013-12-22) 下载地址: https://pypi.python.org/pypi/google 月下载量:1万左右 平台:跨平台 安装 从https://pypi.python.org/pypi/setuptools下载最新版本的s

python模块介绍-requests:人性化的HTTP

目录 人性化的HTTP Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. 在Python的世界里,事情不应该这么麻烦. 线程对象 最简单的方法:使用target指定线程要执行的目标函数,再使用start()启