multi-mechanize
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 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来是不是觉得非常不方便?不用急,针对这点,后面的小技巧部分会另辟蹊径给你指条明路。
- 运行项目的测试脚本
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 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流:)
multi-mechanize的更多相关文章
- python学习笔记4-redis multi watch实现锁库存
python 关于redis的基本操作网上已经很多了,这里主要介绍点个人觉得有意思的内容1.redis的事务操作以及watch 乐观锁:后面描述2.tornado下异步使用redis的方式 ...
- Elasticsearch——multi termvectors的用法
前一篇已经翻译过termvectors的使用方法了,这对于学习如何使用tf-idf来说是很有帮助的了. 更多内容参考我整理的ELK教程 什么是TF-IDF? 今天早晨起来,看<ES IN ACT ...
- redis watch multi exec 关系
EXEC 执行所有事务块内的命令. 假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么EXEC 命令只在这个(或这些) key 没有 ...
- 使用multi curl进行http并发访问
curl是一款利用URL语法进行文件传输的工具,它支持多种协议,包括FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET等,我们既可以在命令行上使用它,也可以利用 libcur ...
- No ongoing transaction. Did you forget to call multi?
2016-10-21 14:41:47,551 [ERROR] [http-nio-8032-exec-2] TransactionSynchronizationUtils:171 - Transac ...
- How to use BMW Multi Tool 7.3 to replace lost key for BMW X1
BMW Multi Tool 7.3 version is a high quality auto key programmer that supports CAS 1, CAS2, CAS3, CA ...
- Python使用mechanize模拟浏览器
Python使用mechanize模拟浏览器 之前我使用自带的urllib2模拟浏览器去进行訪问网页等操作,非常多站点都会出错误,还会返回乱码.之后使用了 mechanize模拟浏览器,这些情况都没出 ...
- redis multi exec
multi(),返回一个redis对象,并进入multi-mode模式,一旦进入multi-mode模式,以后调用的所有方法都会返回相同的对象,直到exec()方法被调用. phpredis是php的 ...
- Keras Xception Multi loss 细粒度图像分类
作者: 梦里茶 如果觉得我的工作对你有帮助,就点个star吧 关于 这是百度举办的一个关于狗的细粒度分类比赛,比赛链接: http://js.baidu.com/ 框架 Keras Tensorflo ...
- Save results to different files when executing multi SQL statements in DB Query Analyzer 7.01
1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainl ...
随机推荐
- vscode 插件设置
VS Code 安装插件 prettier Beautify vscode 首选项 --> 设置 "editor.detectIndentation": false, &qu ...
- asp.net 链接数据库ADO.NET
web.config <configuration> <connectionStrings> <add name="constr" connectio ...
- spingBoot-自定义过滤器
package com.cx.springboot.filters; import java.io.IOException; import javax.servlet.Filter; import j ...
- ssh免密登录方法不生效?Authentication refused: bad ownership or modes for directory
机器A通过ssh登录机器B,方法有两种: 1.密码方式 2.密钥方式: 两种方式同时开启的时候,优先使用密钥方式. 密钥登录方式的配置方法是,首先在登录机器B上创建文件authorized_keys( ...
- BigDecimal 执行精确小数计算
来考虑这样一种情况,先来看代码: public class Test { public static void main(String[] args) { System.out.println(0.4 ...
- @Redis Desktop Manager无法连接虚拟机中启动的redis服务问题解决
Redis Desktop Manager下载地址 https://redisdesktop.com/download 安装好以后连接linux服务器上的Redis服务器错误: 问题排查: 1.检查R ...
- 出现"未将对象引用设置到对象的实例“问题的总结
今天做机房收费系统时,将DataGridView中的数据导入到Excel中,当运行到这一句代码”xlApp.Cells(rows + 2, j + 1) = DataGridView1(j, rows ...
- springMVC之增删改查
一.核心原理 1. 用于发送请求给server: /home.htm 2. 请求被DispatchServlet拦截到 3. DispatchServlet通过HandleMapping检查url有没 ...
- easyui datagrid 分页保持checkbox选中状态
刚开始我一直迷迷糊糊的写了很久,发现其实很简单 先给大家看看我的笨办法 var checkedItems = []; function ischeckItem() { for (var i = 0; ...
- C++ 之 基础回顾(一)
1 exe 程序