[雪峰磁针石博客]multi-mechanize性能测试工具

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: Multi-Mechanize简介 Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务)。测试输出报告保存为HTML或JMeter的兼容的XML。

Multi-Mechanize简介

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

主要特性:

  • 支持各种 HTTP methods

  • 高级超链接和HTML表单支持

  • 支持 SSL

  • 自动处理 Cookies

  • 可设置HTTP头

  • 自动处理重定向

  • 支持代理

  • 支持 HTTP 认证

600
图片.png

安装

使 用标准的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.

如果有出现figure没有定义,请在相关文件的头部从matplotlib导入。

测试结果参见:

700
image.png
700
图片.png
700
图片.png

目录结构

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

  • 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 httplib
import time

class 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.status
 
 if __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 还有更多的实例。


import mechanize
import time


class Transaction(object):

    def __init__(self):
        pass

    def run(self):
        # create a Browser instance
        br = mechanize.Browser()
        # don't bother with robots.txt
        br.set_handle_robots(False)
        # add a custom header so wikipedia allows our requests
        br.addheaders = [('User-agent', 'Mozilla/5.0 Compatible')]

        # start the timer
        start_timer = time.time()
        # submit the request
        resp = br.open('http://www.wikipedia.org/')
        resp.read()
        # stop the timer
        latency = time.time() - start_timer

        # store the custom timer
        self.custom_timers['Load_Front_Page'] = latency

        # verify responses are valid
        assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code
        assert ('Wikipedia, the free encyclopedia' in resp.get_data())

        # think-time
        time.sleep(2)

        # select first (zero-based) form on page
        br.select_form(nr=0)
        # 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 custom timer
        self.custom_timers['Search'] = latency

        # verify responses are valid
        assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code
        assert ('foobar' in resp.get_data()), 'Text Assertion Failed'

        # think-time
        time.sleep(2)
import urllib2
import time

class Transaction(object):
    def run(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

        assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code
        assert ('Example Web Page' in content), 'Text Assertion Failed'

import urllib2
import time

class Transaction(object):
    def __init__(self):
        self.custom_timers = {}
        with open('soap.xml') as f:
            self.soap_body = f.read()

    def run(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

        assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code
        assert ('Example SOAP Response' in content), 'Text Assertion Failed'

参考资料

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
2月前
|
前端开发 测试技术 Python
【Selenium全攻略】掌握这一工具,实现自动化测试的所有梦想
本文分享了使用Selenium进行UI自动化测试的全过程,包括开发环境部署、代码实现、思路分析和难点解析。作者通过一个实际案例,讲述了如何利用Selenium处理前端生成报告失败的问题,以及在UI自动化中定位元素和处理元素不唯一的情况。同时,文章强调了解决问题思路的重要性,鼓励读者开拓思维,寻找不同的解决方案。
93 4
【Selenium全攻略】掌握这一工具,实现自动化测试的所有梦想
|
2月前
|
前端开发 jenkins 测试技术
自动化测试介绍,为何 Apifox 是进行自动化测试的最佳工具
自动化测试利用专用软件执行测试用例,比手动测试更高效准确。Apifox是一款集API文档、调试与自动化测试于一体的工具,提供一体化解决方案,简化API变更管理。其强大的测试功能支持丰富的断言及测试场景组合,便于模拟真实业务流程。Apifox还提供详尽的测试报告与分析功能,有助于快速定位问题。此外,它能轻松集成到CI/CD流程中,并支持定时任务及多分支管理,极大提升了测试效率和团队协作。相较于其他工具,Apifox以其全面的功能和友好的界面脱颖而出。
|
15天前
|
测试技术
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
27 4
|
1月前
|
监控 安全 Linux
如何利用Kali Linux进行网站渗透测试:最常用工具详解
如何利用Kali Linux进行网站渗透测试:最常用工具详解
70 6
|
1月前
|
安全 Linux 测试技术
Kali Linux预装的自动化渗透测试工具
Kali Linux预装的自动化渗透测试工具
43 2
|
2月前
|
测试技术
基于LangChain手工测试用例转Web自动化测试生成工具
该方案探索了利用大模型自动生成Web自动化测试用例的方法,替代传统的手动编写或录制方式。通过清晰定义功能测试步骤,结合LangChain的Agent和工具包,实现了从功能测试到自动化测试的转换,极大提升了效率。不仅减少了人工干预,还提高了测试用例的可维护性和实用性。
44 4
|
2月前
|
消息中间件 Kafka 测试技术
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
|
2月前
|
测试技术 API
软件测试:Postman 工具的使用。开发及测试均需要掌握的测试工具
这篇文章详细介绍了Postman工具的各个模块功能,包括创建请求、集合、环境、自动化测试等,并解释了如何使用Postman进行GET、POST、PUT和DELETE等常见HTTP请求的测试。
|
2月前
|
JSON jenkins 测试技术
Python接口自动化测试框架(工具篇)-- 接口测试工具HTTPRUNNER
本文介绍了Python接口自动化测试框架HTTPRunner,包括其安装、使用方法,并通过实际操作演示了如何利用HTTPRunner进行接口测试,同时还探讨了HTTPRunner作为接口自动化测试解决方案的可能性和实用性。
44 0
|
25天前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
51 2
下一篇
无影云桌面