Python Web 性能和压力测试 multi-mechanize

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(多进程)和多线程机制来实现的。

1. 安装

万能的pip&easy_install

pip install multi-mechanize mechanize numpy matplotlib

  • mechanize是一个模拟browser行为的一个库,当然你也可以用其它的如urllib2、request、tornado.httpclient等等库,不是必须。
  • 后面两个numpy和matplotlib也是可选的,当你需要它自动生成图形化报表时才会用到,安装matplotlib你的系统有可能需要安装libpng和freetype库。

2. 使用方法

  • 创建项目
    multimech-newproject my_project

自动创建一个my_project目录,子目录test_scripts用来放测试脚本,config.cfg是测试配置,主要要配的是测试时间、测试脚本和并发threads量。

  • 脚本编写,借用官方的一个简单例子:
#
#  Copyright (c) 2010 Corey Goldberg ([email protected])
#  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版本的结果统计如下图所示:

3. 使用小技巧

  • Cookie:

如果使用的是mechanize,可以通过下面的方式,从上面的browser对象br里获取到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

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
  • 真实的并发量计算: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流:)

时间: 2025-01-10 03:20:27

Python Web 性能和压力测试 multi-mechanize的相关文章

Web 应用性能和压力测试工具 Gor - 运维生存时间

Web 应用性能和压力测试工具 Gor - 运维生存时间 undefined 无需花生壳,dnspod实现ddns - 推酷 undefined

【转】 详细介绍windows下使用python pylot进行网站压力测试

windows下使用python进行网站压力测试,有两个必不可少的程序需要安装,一个是python,另一个是pylot.python是一个安装软件,用来运行python程序,而pylot则是python的一个功能插件,作用是进行网站压力测试.本文将介绍在windows下如何使用python pylot进行网站压力测试. 一.安装python 如果你已经成功安装了python,那么可以忽略这步.否则,请首先正确安装python,确保能运行正常.可以看看这里,windows安装python详细教程

python对web服务器做压力测试并做出图形直观显示

压力测试有很多工具啊.apache的,还有jmeter, 还有loadrunner,都比较常用. 其实你自己用python写的,也足够用. 压力测试过程中要统计时间. 比如每秒的并发数,每秒的最大响应时间, 最小响应时间, 平均响应时间.最后再统一所有的请求完成后的上术参数. 将这些参数输出成CSV格式的文件. 如果不知道什么是CSV就是指将数据用引号包起来,中间用逗号分开,一系统数据放一行. 有了这个CSV文件,你用EXCEL打开来做图就可以. 如果你熟练,可以使用gnuplot这个命令行工具

十步完成Web应用程序压力测试(转)

Web 应用程序是决定网站性能的关键,对其进行测试是网站测试的核心.压力测试的目的是测试系统在各种负荷(由并发用户所产生的综合处理量)下的性能和稳定性.为了保证Web 应用程序的压力测试能取得理想的测试效果,压力测试也应该遵循软件工程中软件测试的一般规范.整个测试流程应有文档记录,压力测试应得到相应的重视.需求分析 对不同的系统其压力测试的强度和侧重点也不同.一个用于中小企业内部网和一个要处理大量用户的电子商务站点的负荷量和负荷分布是明显不同的.前者的最大负荷量和负荷分布是可预期的,而且对企事业

web服务器之压力测试工具

web服务器压力测试工具:ab 一.apache压力测试工具 ab是apache自带的一款测试工具,功能非常强大 语法格式: ab  [option] URL -c concurrency:一次性发起的请求个数,默认为1:-i:测试时使用HEAD方法,默认为GET:-k:启用HTTP长连接请求方式:-n requests:发起的模拟请求总个数:默认为1个:请求数要大于等于并发连接数:-q:静默模式,在请求数大于150个时不输出请求完成百分比: 输出结果:Time taken for tests:

linux web站点常用压力测试工具httperf

一.工具下载&&安装 软件获取 ftp://ftp.hpl.hp.com/pub/httperf/ 这里使用的是如下的版本 ftp://ftp.hpl.hp.com/pub/httperf/httperf-0.9.0.tar.gz 软件安装 # ls httperf-0.9.0.tar.gz  httperf-0.9.0.tar.gz #tar zxvf httperf-0.9.0.tar.gz  && cd httperf-0.9.0 &&./config

python 对mongodb进行压力测试

最近对mongoDB数据库进行性能分析,需要对数据库进行加压. 加压时,最初采用threading模块写了个多线程程序,测试的效果不理想. 单机读数据库每秒请求数只能达到1000次/s.而开发的java程序请求数能达到6000-7000次/s. 证明受限于GIL,python的多线程表现确实不理想. 后来,采用了multiprocessing模块,采用多进程的方式进行加压. 经过测试证明,multiprocessing的性能还是不错,和开发java程序的性能相当. 脚本如下: #!/usr/bi

【测试123】性能测试之压力测试

https://sq.163yun.com/blog/article/196036888966840320 线上问题:由于上游某系统数据分布突变,引起下游本系统的一个特定时间性能指标未达线. 性能需求: 1.  调整数据分布,重新测量系统在新的压力场景下的吞吐量和关键性能指标,及此特定时间 2.  需要提高系统的处理能力,使得此时间性能达标,并且对其他性能指标无大幅度影响 一.性能测试数据准备 1. 铺底数据准备 铺底数据有目的: 铺底数据的首要目的是让性能测试环境与线上保持一致,或者说接近线上

入门级----黑盒测试、白盒测试、手工测试、自动化测试、探索性测试、单元测试、性能测试、数据库性能、压力测试、安全性测试、SQL注入、缓冲区溢出、环境测试

黑盒测试 黑盒测试把产品软件当成是一个黑箱子,只有出口和入口,测试过程中只要知道往黑盒中输入什么东西,知道黑盒会出来什么结果就可以了,不需要了解黑箱子里面是如果做的. 即测试人员不用费神去理解软件里面的具体构成和原理,只要像用户一样看待产品就可以了. 例如银行转账功能,不需要知道转账的具体实现代码是怎样工作的,只需要把自己想象成各种类型的用户,模拟多种转账情况看系统是否能正常转账即可. 但是仅仅像用户一样去测试又是不够的.如果只做黑盒测试,必然是存在一定的风险的. 例如某个安全性较高的软件系统,