python模块介绍- multi-mechanize 性能测试工具
2013-09-13 磁针石
#承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319
#博客:http://blog.csdn.net/oychw
#版权所有,转载刊登请来函联系
# 深圳测试自动化python项目接单群113938272深圳广州软件测试开发 6089740
#深圳湖南人业务户外群 66250781武冈洞口城步新宁乡情群49494279
#参考资料:python手册
Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务)。
Multi-Mechanize最常用于web性能和可扩展性(scalability)测试,也适用于任何python可以访问的API。
测试输出报告保存为HTML或JMeter的兼容的XML。主要特性:
- 支持各种 HTTP methods
- 高级超链接和HTML表单支持
- 支持 SSL
- 自动处理 Cookies
- 可设置HTTP头
- 自动处理重定向
- 支持代理
- 支持 HTTP 认证
安装
使用标准的python安装方式。注意,需要安装matplotlib以支持作图,在centos6下面可以这样安装yum -y install python27-matplotlib。这里都以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 tofinish...
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.
至此,我们已经完成了一个简单的性能测试。
查看性能测试结果:./my_project/results/results_2013.09.13_11.47.46/results.html
Performance Results Report
Summary
transactions: 125
errors: 0
run time: 30 secs
rampup: 0 secs
test start: 2013-09-1311:47:47
test finish: 2013-09-1311:48:16
time-series interval: 10secs
workload configuration:
group name |
threads |
script name |
user_group-1 |
v_user.py |
|
user_group-2 |
v_user.py |
All Transactions
Transaction Response Summary (secs)
count |
min |
avg |
80pct |
90pct |
95pct |
max |
stdev |
1.021 |
1.499 |
1.796 |
1.890 |
1.972 |
2.002 |
0.282 |
Interval Details (secs)
interval |
count |
rate |
min |
avg |
80pct |
90pct |
95pct |
max |
stdev |
4.30 |
1.021 |
1.462 |
1.688 |
1.841 |
1.897 |
2.002 |
0.263 |
||
3.90 |
1.026 |
1.543 |
1.830 |
1.934 |
1.976 |
1.986 |
0.290 |
||
3.70 |
1.025 |
1.495 |
1.806 |
1.964 |
1.985 |
1.988 |
0.295 |
Graphs
Response Time: 10 sectime-series
Response Time: raw data (allpoints)
Throughput: 5 sec time-series
Custom Timer: Example_Timer
Timer Summary (secs)
count |
min |
avg |
80pct |
90pct |
95pct |
max |
stdev |
1.020 |
1.497 |
1.794 |
1.889 |
1.970 |
2.000 |
0.281 |
Interval Details (secs)
interval |
count |
rate |
min |
avg |
80pct |
90pct |
95pct |
max |
stdev |
4.30 |
1.020 |
1.461 |
1.686 |
1.839 |
1.895 |
2.000 |
0.262 |
||
3.90 |
1.025 |
1.542 |
1.828 |
1.932 |
1.975 |
1.984 |
0.289 |
||
3.70 |
1.024 |
1.493 |
1.804 |
1.962 |
1.983 |
1.986 |
0.295 |
Graphs
Response Time: 10 sectime-series
Response Time: raw data (allpoints)
Throughput: 10 sec time-series
目录结构:
每个测试项目包含以下内容:
config.cfg的配置文件。用于设定测试选项。
test_scripts/虚拟用户脚本的目录。在这里添加您的测试脚本。
results/:结果存储目录。对于每个测试都声称一个时间戳目录,里面包含结果的报告。
multimech-newproject,默认生成一个随机数的脚本。脚本如下:
# cat v_user.py
import random
import time
class Transaction(object):
def__init__(self):
pass
defrun(self):
r= random.uniform(1, 2)
time.sleep(r)
self.custom_timers['Example_Timer'] = r
if __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
- xml_report: turn on/off xml/jtl report
- results_database: database connection string (optional)
- post_run_script: hook to call a script at test completion (optional)
特别提下 rampup表示多长时间内加载完所有用户。详细的配置参见: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。
下例使用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), 'BadResponse: HTTP %s' % resp.codes
assert ('service name' inresp.get_data())
下面用httplib库重写脚本,并增加定时器。通过定时器,可以分析各个步骤的耗时。
import httplib
import time
class Transaction(object):
defrun(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.status
if __name__ == '__main__':
trans= Transaction()
trans.run()
fortimer 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还有更多的实例:
importmechanize
importtime
classTransaction(object):
def__init__(self):
pass
defrun(self):
# create a Browserinstance
br = mechanize.Browser()
# don't bother withrobots.txt
br.set_handle_robots(False)
# add a customheader so wikipedia allows our requests
br.addheaders = [('User-agent', 'Mozilla/5.0Compatible')]
# start the timer
start_timer= time.time()
# submit therequest
resp = br.open('http://www.wikipedia.org/')
resp.read()
# stop the timer
latency = time.time() - start_timer
# store the customtimer
self.custom_timers['Load_Front_Page'] = latency
# verify responsesare valid
), 'Bad Response: HTTP%s'% resp.code
assert ('Wikipedia, thefree encyclopedia'in resp.get_data())
# think-time
)
# select first(zero-based) form on page
)
# set form field
br.form['search'] ='foo'
# start the timer
start_timer= time.time()
# submit the form
resp = br.submit()
resp.read()
# stop the timer
latency = time.time() - start_timer
# store the customtimer
self.custom_timers['Search'] = latency
# verify responsesare valid
), 'Bad Response: HTTP%s'% resp.code
assert ('foobar'in resp.get_data()), 'Text AssertionFailed'
# think-time
)
importurllib2
importtime
classTransaction(object):
defrun(self):
start_timer= time.time()
resp = urllib2.urlopen('http://www.example.com/')
content = resp.read()
latency = time.time() - start_timer
self.custom_timers['Example_Homepage'] = latency
), 'Bad Response: HTTP%s'% resp.code
assert ('Example Web Page'in content), 'Text AssertionFailed'
importurllib2
importtime
classTransaction(object):
def__init__(self):
self.custom_timers = {}
withopen('soap.xml') as f:
self.soap_body = f.read()
defrun(self):
req = urllib2.Request(url='http://www.foo.com/service', data=self.soap_body)
req.add_header('Content-Type', 'application/soap+xml')
req.add_header('SOAPAction', 'http://www.foo.com/action')
start_timer= time.time()
resp = urllib2.urlopen(req)
content = resp.read()
latency = time.time() - start_timer
self.custom_timers['Example_SOAP_Msg'] = latency
), 'Bad Response: HTTP%s'% resp.code
assert ('Example SOAPResponse'in content), 'Text AssertionFailed'
importhttplib
importurllib
importtime
classTransaction(object):
def__init__(self):
self.custom_timers = {}
defrun(self):
post_body=urllib.urlencode({
'USERNAME': 'corey',
'PASSWORD': 'secret',})
headers = {'Content-type': 'application/x-www-form-urlencoded'}
start_timer= time.time()
conn = httplib.HTTPConnection('www.example.com')
conn.request('POST', '/login.cgi', post_body, headers)
resp = conn.getresponse()
content = resp.read()
latency = time.time() - start_timer
self.custom_timers['LOGIN'] = latency
), 'Bad Response: HTTP%s'% resp.status
assert ('Example Web Page'in content), 'Text AssertionFailed'
参考资料:
http://testutils.org/multi-mechanize/
python模块介绍- multi-mechanize 性能测试工具的更多相关文章
-
python模块介绍-locustio:性能测试工具locustio
转自:http://automationtesting.sinaapp.com/blog/m_locustio_doc python测试文章 http://weibo.com/cizhenshi?is ...
-
python模块介绍- HTMLParser 简单的HTML和XHTML解析器
python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...
-
python模块介绍- xlwt 创建xls文件(excel)
python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...
-
python模块介绍- binascii 二进制和ASCII转换
python模块介绍-binascii二进制和ASCII转换 目录 项目简介 简介: Uu编码 Binhex编码 Base64编码 QP码 CRC校验和 二进制转换 其他实例 项目简介 Python中 ...
-
将Python模块转变为命令行工具
问:如何输入命令行就能执行python代码呢? 答:要将python模块转变为命令行工具只用在 setup.py 文件中添加参数entry_points 例如: entry_points={ 'con ...
-
python成长之路【第十八篇】:python模块介绍、模块导入和重载
一.模块和命名空间 一般来说,Python程序往往由多个模块文件构成,通过import语句连接在一起.每个模块文件是一个独立完备的变量包,即一个命名空间.一个模块文件不能看到其他文件定义的变量名,除非 ...
-
python模块介绍二。
全局变量 全局变量 python在一个.py文件内部自动添加了一些全局变量 print(vars()) #查看当前的全局变量 执行结果: {'__package__': None, '__loader ...
-
python模块介绍- SocketServer 网络服务框架
来源:https://my.oschina.net/u/1433482/blog/190612 摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServe ...
-
Python—模块介绍
什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...
随机推荐
-
jstl 小总结 以及 jstl fn
1.1.1 JSTL的使用 JSTL是JSP标准标签库.结合EL替换传统页面的<%%> * JSTL如果不会用.也是可以使用<%%>.但是一般在大公司使用JSTL.进入小公司. ...
-
closure!
总结一下闭包. 闭包的定义:当一个内部函数被其外部函数之外的变量所引用时,就形成了一个闭包. 一个最简单的闭包: function A(){ var count=0; return function( ...
-
优化DP的奇淫技巧
DP是搞OI不可不学的算法.一些丧心病狂的出题人不满足于裸的DP,一定要加上优化才能A掉. 故下面记录一些优化DP的奇淫技巧. OJ 1326 裸的状态方程很好推. f[i]=max(f[j]+sum ...
-
redis3.0.0 集群安装详细步骤
Redis集群部署文档(centos6系统) Redis集群部署文档(centos6系统) (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对 ...
-
用python实现远程复制 (scp + expect )
scp 功能很强大,但需要人工输入 password, 当然可以通过把 公钥保存在远程主机的 ~/.ssh 目录中,而后就不用输入password,但这需要配置. 用 sshpass 可能在命令输入 ...
-
Codevs 2611 观光旅游(floyed最小环)
2611 观光旅游 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某旅游区里面有N个景点.两个景点之间可能直接有道路相连,用 ...
-
python常用的内置函数
python常用的内置函数集合做一个归类用的时候可以查找- abs 返回数字x的绝对值或者x的摸 - all (iterable)对于可迭代的对象iterable中所有元素x都有bool(x)为tru ...
-
Python-初识模块
#系统自带的模块 import sys print(sys.path)#打印环境变量 print(sys.argv)#打印绝对路径 import os #cmd_res = os.system(&qu ...
-
[Beego模型] 三、高级查询
[Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...
-
Unity3D加密保护案例分享(一)
Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.通过u ...