Locust性能测试之快速入门

Locust是使用Python语言编写的开源性能测试工具,其简洁、轻量、高效的并发机制基于Gevent协程,可以实现单机模拟生成较高的并发压力。使用该工具可以节省实际的物理机资源,通过单机达到并发的效果,从而进行压力测试,找到最大的承压点。Locust用于对网站(或其他系统)进行负载测试,并确定系统可以处理多少个并发用户。

一、安装

安装方式:

pip3 install locust

查看安装版本:

locust -V

二、快速开始

1、web UI 模式

UI模式可以直接在浏览器上配置要压测的用户数,以及每秒产生的用户数等等信息,比较直观方便。如下所示:

#test_locust_01.py

from locust import HttpUser, task

class HelloWorldUser(HttpUser):
    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

打开命令行,运行脚本:

locust -f test_locust_01.py

服务器已经启动,然后打开浏览器,访问:http://localhost:8089

点击开始start swarming,查看性能测试结果:

2、headless模式

除了web UI模式,还有无头模式(headless)可以选择,通过命令行的方式,把需要配置的参数设置好,便于后续部署持续集成,快速、方便的执行压测脚本。

locust -f test_locust_01.py --headless --users 10 --spawn-rate 1 -H http://your-server.com

#--headless:表示无头模式
#--users:表示总的并发用户数
#--spawn-rate:表示每秒产生的用户数
#-H:表示要压测的主机地址

headless模式下的报告如下:

三、报告参数

1、Statistics统计

  • Type:请求的类型,例如GET/POST;
  • Name:请求的路径;
  • Requests:表示成功发出请求的次数;
  • Fails:表示请求处理失败的次数;
  • Median:表示所有请求响应时间的中位数,单位为毫秒;
  • 90%ile: 正态分布平均值,表示有90%的数据小于此数值;
  • Average:平均值,单位毫秒,所有请求的平均响应时间;
  • Min:请求的最小服务器响应时间,单位毫秒;
  • Max:请求的最大服务器响应时间,单位毫秒;
  • Average size:请求平均数据大小,单位字节;
  • Current RPS: 每秒钟请求成功的个数,相当于TPS,即每秒处理的事务数;
  • Current Failures: 每秒创建请求的失败数量;

2、Charts 图表

  • Total Request per Second :每秒的请求总数,横轴为时间轴,纵轴为每秒请求的数量(请求处理通过的)。
    • 绿色线:每秒钟请求成功的个数
    • 红色线:每秒钟请求失败的个数

  • Response Time: 响应时间,横轴为时间轴,纵轴为以毫秒为单位的响应时间。需要注意的是,图表上面两根线并不是表示平均值,而是响应时间的“中位数”和“95%百分位数值”。
    • 绿色线:表示中位数
    • 黄色线:表示95%百分位数值

  • Number of Users: 用户数,横轴为时间轴,纵轴为时间所对应的“用户数”。

3、Failures 失败日志

脚本请求产生的异常响应、失败都可以在这里看到

4、Exceptions 异常日志

脚本运行抛出的异常可以在这里看到

5、Download Data

内容和 Statistics 的一致

四、脚本例子

1、脚本

定义一个任务类,这个类名称自定义,比如:HelloWorld是一个任务类;再定义一个管理运行类,这个类名称自定义,比如:UserRun是一个管理运行类。

import os
import time
from locust import HttpUser, task, between, TaskSet

# 定义一个任务类继承TaskSet类
class HelloWorld(TaskSet):

    # @task 是装饰器,声明此方法是一个任务,,权重默认为1
    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

    # @task(3) 是装饰器,声明此方法是一个任务,权重为3
    @task(3)
    def view_items(self):
        for item_id in range(10):
            self.client.get(f"/item?id={item_id}", name="/item")
            time.sleep(1)

# 定义一个运行类继承HttpUser类
class UserRun(HttpUser):
    # 声明执行的任务集是哪个类
    tasks = [HelloWorld]
    # 设置运行过程中间隔时间
    wait_time = between(1, 5)

    # 每用户初始动作,作用等同于pytest、unittest的setup
    def on_start(self):
        self.client.post("/login", json={"username": "foo", "password": "bar"})

    # 每用户结束动作,作用等同于pytest、unittest的teardown
    def on_stop(self):
        self.client.close()

if __name__ == '__main__':
    os.system("locust -f test_locust01.py --headless --users 10 --spawn-rate 1 -H http://your-server.com")

2、任务类

  • TaskSetSequentialTaskSet,当类里面的任务请求有先后顺序时继承SequentialTaskSet类,没有先后顺序,可以使用继承TaskSet

  • tag:标签

  • @task: 标记为事务,不定义数值时默认权重为1,权重比越高执行倍率越大

  • 事务场景自定义函数方法,命名上没有限制

3、运行管理类

  • HttpUser:主要用于做http请求,基于reques进行了封装,定义session

  • tasks:用于指向用户行为,可以定义为列表或字典,列表类型时采用随机访问方式,为字典类型时可以自定义执行权重。权重越高,执行概率越大

  • host:配置要测试的目标服务器地址,配置后场景事务访问的接口则不需要再添加该地址

  • wait_time:设置每用户执行事务等待时间。单位:秒

  • on_start: 每用户初始动作,作用等同于pytest、unittest的setup

  • on_stop: 每用户结束动作,作用等同于pytest、unittest的teardown

4、断言

HTTP客户端中使用调用response.failure()或response.success()

with self.client.get("/", catch_response=True) as response:
    if response.text != "Success":
        response.failure("Got wrong response")
    elif response.elapsed.total_seconds() > 0.5:
        response.failure("Request took too long")

五、属性说明

task: from locust import # 用于标记任务

HttpUser: from locust import # 用于http请求,封装原request库

FastHttpUser: from locust.contrib.fasthttp import FastHttpUser # 高并发请求

TaskSet: from locust import # 用于测试场景

SequentialTaskSet: from locust import # 用于测试场景,顺序执行task标记任务

between: from locust import # 每任务执行间隔时间范围(3, 5) 单位:秒

constant: from locust import # 同上,固定时间

tag: from locust import # 任务标签,可根据参数控制执行指定标签任务

六、分布式运行

指定宿主机,并启动压测脚本

locust -f my_locustfile.py --master

指定压力机,并启动压测脚本

locust -f my_locustfile.py --worker --master-host=192.168.0.14

七、运行参数说明

命令行 环境 配置文件 描述说明
-f, --locustfile LOCUST_LOCUSTFILE locustfile 要导入的Python模块文件,例如'../other.py'。默认值:locustfile
-H, --host LOCUST_HOST host 负载测试主机地址:https://www.baidu.com
-u, --users LOCUST_USERS users 并发用户数。主要与–headless一起使用。可以在测试期间通过输入w,W(生成1,10个用户)和s,S(停止1,10个用户)来更改
-r, --spawn-rate LOCUST_SPAWN_RATE spawn-rate 产生用户的每秒速率。主要与–headless一起使用
--hatch-rate LOCUST_HATCH_RATE hatch-rate 启动虚拟用户的速率
-t, --run-time LOCUST_RUN_TIME run-time 在指定的时间段后停止,例如(300s,20m,3h,1h30m等)。仅与–headless一起使用。默认为永久运行。
--web-host LOCUST_WEB_HOST web-host 将Web界面绑定到的主机。默认为“ *”(所有接口)
--web-port, -P LOCUST_WEB_PORT web-port web ui端口地址,默认为8089
--headless LOCUST_HEADLESS headless 禁用Web界面,而是立即开始负载测试。需要指定-u和-t。true/false
--autostart LOCUST_AUTOSTART autostart 立即开始测试(不禁用 Web UI)。使用 -u 和 -t 控制用户数和运行时间
--autoquit LOCUST_AUTOQUIT autoquit 在运行完成 X 秒后完全退出 Locust。仅与 –autostart 一起使用。默认设置是保持 Locust 运行,直到您使用 CTRL+C 将其关闭
--headful LOCUST_HEADFUL headful
--web-auth LOCUST_WEB_AUTH web-auth 打开Web界面的基本身份验证。应该以以下格式提供:username:password
--tls-cert LOCUST_TLS_CERT tls-cert 用于通过HTTPS服务的TLS证书的可选路径
--tls-key LOCUST_TLS_KEY tls-key 用于通过HTTPS服务的TLS私钥的可选路径
--master LOCUST_MODE_MASTER master 分布式模式下运行:true/false
--master-bind-host LOCUST_MASTER_BIND_HOST master-bind-host master应绑定的接口(主机名,ip)。仅在与–master一起运行时使用。默认为*(所有可用接口)。
--master-bind-port LOCUST_MASTER_BIND_PORT master-bind-port master应该绑定的端口。仅在与–master一起运行时使用。默认为5557
--expect-workers LOCUST_EXPECT_WORKERS expect-workers 预期分布式客户端数量,当分布式客户端与master建立数达到设定数后开始自动执行,必须配合headless=true时生效
--expect-workers-max-wait LOCUST_EXPECT_WORKERS_MAX_WAIT expect-workers-max-wait master在放弃之前等待worker连接的最长时间。默认为永远等待
--worker LOCUST_MODE_WORKER worker 分布式模式运行客户端
--master-host LOCUST_MASTER_NODE_HOST master-host 用于分布式负载测试的蝗虫主服务器的主机或IP地址。仅在与–worker一起运行时使用。默认为127.0.0.1。
--master-port LOCUST_MASTER_NODE_PORT master-port 蝗虫主服务器使用与之连接的端口进行分布式负载测试。仅在与–worker一起运行时使用。默认为5557
-T, --tags LOCUST_TAGS tags 测试中要包含的标签列表,因此仅执行具有任何匹配标签的任务
-E, --exclude-tags LOCUST_EXCLUDE_TAGS exclude-tags 要从测试中排除的标签列表,因此仅执行没有匹配标签的任务
--csv LOCUST_CSV csv 将当前请求统计信息以CSV格式存储到文件中。设置此选项将生成三个文件:[CSV_PREFIX] _stats.csv,[CSV_PREFIX] _stats_history.csv和[CSV_PREFIX] _failures.csv
--csv-full-history LOCUST_CSV_FULL_HISTORY csv-full-history 将每个统计信息条目以CSV格式存储到_stats_history.csv文件中。您还必须指定“ –csv”参数以启用此功能。
--print-stats LOCUST_PRINT_STATS print-stats 在控制台中打印统计信息
--only-summary LOCUST_ONLY_SUMMARY only-summary 仅打印摘要统计信息
--reset-stats LOCUST_RESET_STATS reset-stats 完成后重置统计信息。在分布式模式下运行时,应同时在master和worker上设置
--html LOCUST_HTML html 存储HTML报告文件
--skip-log-setup LOCUST_SKIP_LOG_SETUP skip-log-setup 禁用日志记录设置。而是由Locust测试或Python默认设置提供配置。
--loglevel, -L LOCUST_LOGLEVEL loglevel 在DEBUG / INFO / WARNING / ERROR / CRITICAL之间进行选择。默认值为INFO。
--logfile LOCUST_LOGFILE logfile 日志文件的路径。如果未设置,日志将转到stdout / stderr
--exit-code-on-error LOCUST_EXIT_CODE_ON_ERROR exit-code-on-error 设置流程退出代码以在测试结果包含任何故障或错误时使用
-s, --stop-timeout LOCUST_STOP_TIMEOUT stop-timeout 退出之前等待模拟用户完成任何正在执行的任务的秒数。默认为立即终止。仅在运行Locust分布式时才需要为主进程指定此参数。

八、参考

1、官方文档:http://docs.locust.io/en/stable/installation.html

2、Locust 的测试报告_性能监控平台:https://testerhome.com/topics/24873

3、locust+prometheus+grafana性能指标平台搭建:https://www.jianshu.com/p/e41d8357f94b

4、locust+prometheus+grafana性能指标平台:https://blog.csdn.net/fudacaitao/article/details/123236817

5、prometheus脚本:https://github.com/ContainerSolutions/locust_exporter

posted @ 2022-11-28 14:48  xyztank  阅读(645)  评论(0编辑  收藏  举报