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、任务类
-
TaskSet
或SequentialTaskSet
,当类里面的任务请求有先后顺序时继承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