1. 安装

万能的pip&easy_install(python27环境)

pip install multi-mechanize mechanize numpy matplotlib

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

2. 使用方法

  • 创建项目(windows 环境:multi-mechanize安装路径 utilities目录下执行以下命令,如我的安装路径是D:\Python27\Lib\site-packages\multimechanize\utilities)
python multimech-newproject.py 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 timeclass 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_timerself.custom_timers['Example_Homepage'] = latencyassert (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来是不是觉得非常不方便?不用急,针对这点,后面的小技巧部分会另辟蹊径给你指条明路。

  • 运行项目的测试脚本
python multimech-run.py 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 loggingclass 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 testlatency = time.time() - start_timerself.custom_timers['%s' % func[len(self._TEST_CASE_PREFIX):]] = latencyexcept Exception, e:logging.error(traceback.format_exc())raise e

test_case_google.py里是真正的测试case,这里是同时测试多个google站点:

# -*- coding: utf-8 -*-from base import BaseTransactionclass Transaction(BaseTransaction):def test_google_com_hk(self):#  测试逻辑代码,如类似于上面的测试example.compassdef test_google_com_sg(self):passdef 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相关推荐

  1. Redis 笔记(08)— 事务(一次执行多条命令、命令 watch/multi/exec/discard、错误处理)

    1. 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的 ...

  2. (multi)set的某些操作

    (multi)set的某些操作 我们可以把multiset当作平衡树用~ 注意,必须定义小于运算符. s.begin() 返回指向第一个元素的迭代器. s.end() 返回指向最后元素的后面那个虚拟元 ...

  3. 在Ubuntu 16.04.1 LTS上安装XnView Multi Platform图片浏览器0.83

    XnView Multi Platform是一个全平台(Windows, Linux, Mac)下的全能图片工具,类似Windows平台的美图看看,阿香婆图片浏览器等等,效果非常赞,是我在Ubuntu ...

  4. celery源码分析:multi命令分析

    celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery简介 celery是一款异步任务框架,基于AMQP协议的任务调度框架.使用的场景 ...

  5. python模块学习---mechanize(模拟浏览器)

    mechanize是非常合适的模拟浏览器的模块. 它的特点主要有: 1 http,https协议等. 2 简单的HTML表单填写. 3 浏览器历史记录和重载. 4 Referer的HTTP头的正确添加 ...

  6. R语言ggplot2可视化:为可视化图像添加多行标题(multi line title)并将多行标题居中对齐(center align)

    R语言ggplot2可视化:为可视化图像添加多行标题(multi line title)并将多行标题居中对齐(center align) 目录

  7. Multi task learning多任务学习背景简介

    2020-06-16 23:22:33 本篇文章将介绍在机器学习中效果比较好的一种模式,多任务学习(Multi task Learning,MTL).已经有一篇机器之心翻译的很好的博文介绍多任务学习了 ...

  8. odoo API装饰器one、model、multi的区别

    1.one装饰器详解 odoo新API中定义方式:     date=fields.Date(string="date",compute="_get_date" ...

  9. Python编程基础:第四十二节 多重继承Multi Level Inheritance

    第四十二节 多重继承Multi Level Inheritance 前言 实践 前言 我们之前已经讲过继承的相关知识,当一个类是另一个类的父类,而此时这里的子类又是另一个类的父类,那此时就涉及多重继承 ...

  10. python模拟浏览器模块,python模块学习---mechanize(模拟浏览器)

    mechanize是非常合适的模拟浏览器的模块. 它的特点主要有: 1 http,https协议等. 2 简单的HTML表单填写. 3 浏览器历史记录和重载. 4 Referer的HTTP头的正确添加 ...

最新文章

  1. 分页刷新(SwipeRefreshLayout+SwipeMenuRecyclerView)
  2. aria2的安装与配置
  3. 2009年4月计算机网络原理,全国2009年4月高等教育自学考试计算机网络原理
  4. 下载 | 李宏毅:1 天搞懂深度学习,我总结了 300 页 PPT
  5. Python随手记—各种方法的使用
  6. MongoDB学习总结(五) —— 安全认证
  7. pandas数据处理实践三(DataFrame.apply、merge、rename,数据预处理、DataFrame.drop_duplicates去重)
  8. Categorical variable(类别变量)学习笔记(未完)
  9. ios tabtar 使用方法_Appium界面自动化测试(13)(iOS/Python):元素定位及操作
  10. ue的 linux版本,UltraEdit Linux版RPM包 64位 V16.1.0.22
  11. 如何写一份优秀的Web前端简历【面试秘籍】
  12. SQL Server列转行
  13. python中cnt是什么意思_CNT是什么意思
  14. 在进行时间筛选的时候出现RuntimeWarning:DateTimeField LogList.operation_date received a naive datetime
  15. Linux系统优化篇
  16. LaTex如何自动生成参考文献
  17. 完全模拟FIFA2014世界杯 原创求顶!
  18. 基于Adams联合MATLAB的联合仿真设置
  19. 简单的stm32入门小程序(交通信号灯)STM32F103C8T6
  20. 总结!Github年度最强Python库排行榜

热门文章

  1. 一个HTML简单实例
  2. Simulink建模:CRC校验模型
  3. 《最忆是江南》 电视散文
  4. web项目答辩总结_javaWEB项目答辩
  5. php ood,php-ood技巧
  6. /WEN-INF/jsp文件夹下文件不能直接访问--20180209第一篇
  7. 微服务间用户信息共享机制
  8. 山寨厂商集体转战上网本:积压手机当工资发
  9. Python之函数定义(3)
  10. 二手车价格预测预测-特征工程