python_locust实现http接口性能测试

locust官方API文档:https://docs.locust.io/en/stable/api.html

locust简介

开源
python开发
基于事件
支持分布式
Web UI 执行测试 / 结果展示
性能测试工具

locust使用的核心库

gevent:基于协程的python网络库,它使用greenlet在libev或libuv事件循环之上提供高级同步API
flask:是一个微型的Python开发的Web框架
requests:Python Http库
msgpack-python:主要提供MessagePack数据序列化及反序列化的方法
pyzmq:用来实现Locust的分布式模式运行

Locust压测组件图

python_locust实现http接口性能测试_第1张图片

主流压测工具对比

python_locust实现http接口性能测试_第2张图片

安装locust

安装命令

pip install locust

python_locust实现http接口性能测试_第3张图片

查看版本命令

locust --version

python_locust实现http接口性能测试_第4张图片

编写测试脚本

打开pycharm --> 创建dept_list.py文件 --> 将以下脚本复制到文件中

from locust import HttpUser, TaskSet, task
import json

# 定义每个用户的任务集合
class DeptList(TaskSet):

    # 任务A--GET示例
    @task(7)        # 权重 7/ 10
    def t_login(self):
        url = '/api/ip/ipdept/deptList'
        h = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
             "Cookie": "sessionToken=2e183b7bb566461d"}
        data = {'draw': '5',
                'start': '0',
                'length': '13',
                'deptTypes': '[]',
                'defunctInd': 'N',
                'searchStr': 'FSK_01',
                '_': '1597112917355'}

        # catch_response =True:允许该请求被标记为失败
        with self.client.get(url, headers=h, params=data, catch_response=True) as response:
            if response.status_code == 200:
                response.success()

    # 任务B--POST示例
    @task(3)        # 权重 3/ 10
    def t_query_dept(self):
        url = '/api/ip/entity/save'
        h = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
             "Content-Length": "355",
             "Cookie": "sessionToken=6b67c3bfd60c4008"}
        entity = {"ipEntityMstrId": 7233101,
                      "entityCode": "BLL1",
                      "entityDesc": "BLL2019",
                      "entityDescLang1": "BLL2019#",
                      "shortCode": "BLL",
                      "seqNo": "1",
                      "entityNameAlias": "BL",
                      "entityNameAlias1": "BL#",
                      "addressDetail": "详细地址111"}

        body = {'entityInfo': json.dumps(entity)}

        with self.client.post(url, headers=h, data=body, catch_response=True) as response:
            if response.status_code == 200:
                response.success()


# 继承Locust类
# 生成的每一个虚拟的HTTP用户
# 用来发送请求到进行负载测试的系统
class Login(HttpUser):
    tasks = [DeptList]
    # 权重
    weight = 1
    # 执行事务之间用户最小等待时间
    min_wait = 1000
    # 执行事务之间用户最大等待时间
    max_wait = 3000
    # 超时时间
    stop_timeout = 5
    host = "10.227.253.226:7000"

运行脚本文件

dept_list.py对应cmd命令窗口下执行以下命令

locust -f dept_list.py --host=http://10.227.253.226:7000

python_locust实现http接口性能测试_第5张图片
启动遇到的问题

1、导入HttpLocust,在运行时报
ImportError: The HttpLocust class has been renamed to HttpUser in version 1.0
解决办法:
将from locust import HttpLocust 修改成 from locust import HttpUser

2、运行时报
DeprecationWarning: Usage of User.task_set is deprecated since version 1.0. Set the tasks attribute instead (tasks = [DeptList])
解决办法:
将task_set = DeptList 修改成 tasks = [DeptList]

打开浏览器中,输入http://localhost:8089/
python_locust实现http接口性能测试_第6张图片

页面参数说明:

Number of total users to simulate:要模拟的总用户数
Hatch rate (users spawned/second):每秒生成的用户数
Host (e.g. http://www.example.com):测试服务器地址
Start swarming:开始运行性能测试

查看测试结果
python_locust实现http接口性能测试_第7张图片

工具栏参数说明:

HOST
http://10.227.253.226:7000:被测服务器地址
STATUS
RUNNING
10 users:运行10个虚拟用户
RPS
3.7:每秒请求数
FAILURES
0%:运行失败比例
STOP:停止
Reset Stats:重置统计信息

列表参数说明:

Type: 请求的类型,例如GET/POST
Name:请求的路径
request:当前请求的数量
fails:当前请求失败的数量
Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值
Average:平均值,单位毫秒,所有请求的平均响应时间
Min:请求的最小服务器响应时间,单位毫秒
Max:请求的最大服务器响应时间,单位毫秒
Content Size:单个请求的大小,单位字节
reqs/sec:是每秒钟请求的个数

主从模式

启动mastr节点:locust -f dept_list.py --master

启动worker节点:locust -f dept_list.py --worker

在其他机器上启动worker节点:locust -f dept_list.py --worker --master-host=192.168.x.xx

python_locust实现http接口性能测试_第8张图片
python_locust实现http接口性能测试_第9张图片

Host格式一定要正确,不然的话启动后会报:
raise InvalidSchema(“No connection adapters were found for ‘%s’” % url)
No connection adapters were found for ‘10.227.253.226:7000/api/ip/ipdept/deptList’

主从模式下测试结果
python_locust实现http接口性能测试_第10张图片
no_web模式命令

locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
–no-web: 表示不使用Web界面运行测试
-c:设置虚拟用户数
-r:设置每秒启动虚拟用户数
-t:设置设置运行时间

Locust web模式的性能监控和展示的明显缺陷:

1、rps、平均响应时间波动图没有持久化存储,刷新后便丢失
2、整体统计信息只是表格的形式,不能体现波动时序
3、测试报告过于简陋且只有文字版,只能下载存档

# Locust web模式的性能监控和展示优化解决方案

Locust + Prometheus + Grafana
参考:https://testerhome.com/topics/24873

你可能感兴趣的:(Python,接口测试,python)