利用locust和multi-mechanize 针对flask服务做压力测试

执行环境

  • centos7

Locust

  • 前面的帖子已经针对locust做了一个简单的介绍,这里将记录一下使用locust编写简单的压测脚本
  • 适用环境: python 2.7,python 3.3,3.4,3.5和3.6
  • 官网: http://docs.locust.io/
  • 所需库: locustio

Multi-mechanize

  • Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务)。测试输出报告保存为HTML或JMeter的兼容的XML。Multi-Mechanize最常用于web性能 和可扩展性(scalability)测试,也适用于任何python可以访问的API。尤其适合后台性能测试。
  • 适用环境: python 2.7,不支持python3
  • 所需库(以centos为例):
    • yum -y install gcc gcc-c++
    • yum install python-matplotlib
    • yum install freetype-devel libpng-devel
    • yum install python-devel
    • pip install multi-mechanize mechanize numpy matplotlib

Flask

  • Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug,模板引擎则使用 Jinja2。
  • 适用环境: python 2.6,2.7,python3.3,3.4,3.5
  • 官网文档:http://docs.jinkan.org/docs/flask/index.html
  • 所需库:flask

脚本编码

编写简单的flask服务

  • 实现功能:生成5位随机数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # !/usr/bin/env python
    # -*- coding :utf-8 -*-
    from flask import Flask
    import random
    app = Flask(__name__)
    @app.route('/getnum')
    def getnum():
    numuid = str(random.randint(10000, 99999))
    return numuid
    if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)
  • 启动:yourip:5000/getnum

编写简单的locust压测脚本

  • 实现功能:get请求flask的numid

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # -*- coding:utf-8 -*-
    from locust import HttpLocust, TaskSet, task
    class WebsiteTasks(TaskSet):
    def on_start(self):
    pass
    @task
    def getuser(self):
    self.client.get("/getnum")
    class WebsiteUser(HttpLocust):
    task_set = WebsiteTasks
    min_wait = 5000
    max_wait = 15000
    host = "http://yourip:5000"
  • 启动: locust -f filename.py

编写简单的multi-mechanize压测脚本

  • 实现功能:get请求flask的numid

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import time
    import sys
    import requests
    class Transaction(object):
    def __init__(self):
    pass
    def run(self):
    url = 'http://yourip:5000/getnum'
    res = ''
    try:
    r = requests.get(url)
    assert (r.status_code == 200), "request error:{0}".format(r.status_code)
    #print r.text
    except Exception as e:
    print str(e)
    print str(sys.exc_info())
    raise Exception('Error: {0}--{1}'.format(str(e), str(sys.exc_info())))
    if __name__ == '__main__':
    trans = Transaction()
    trans.run()
  • 新建压测项目:multimech-newproject projectname

  • 脚本存放位置:projectname/test_scripts/v_user.py
  • 配置文件:projectname/config.cfg
  • 启动:multimech-run projectname