Locust web性能测试实践
Locust 是一个开源的负载测试工具,使用Python语言实现,其简洁、轻量、高效的并发机制基于Gevent
协程,可以实现单机模拟生成较高的并发压力。具有分布式和可扩展的特点,能够帮助你评估系统的性能并找到潜在的瓶颈。
Locust 的主要特点:
- 使用 Python 编写测试脚本:你可以用 Python 编写用户行为脚本,定义各种用户操作和请求。
- 分布式测试:支持分布式测试,允许在多台机器上同时运行,从而模拟大量的并发用户。
- 实时 Web 界面:提供直观的 Web 界面,用于配置测试参数、启动和监控测试。
- 可扩展性强:可以通过编写自定义代码来扩展 Locust 的功能,满足不同测试需求。
1. 安装Locust
使用 pip 进行安装:
pip3 install locust -i https://mirrors.aliyun.com/pypi/simple/
查看安装版本:
locust -V
2. web demo应用
使用 Python 的 Flask 框架实现一个简单的web服务器,包含主页 (/
) 和关于页 (/about
),用于Locust执行测试。
2.1 安装Flask
使用pip安装:
pip3 install flask -i https://mirrors.aliyun.com/pypi/simple/
2.2 创建Flask应用
新建一个名为 app.py
的文件,编写如下代码:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def index():
return jsonify(message="Welcome to the homepage!")
@app.route('/about')
def about():
return jsonify(message="This is the about page.")
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
2.3 运行 Flask 应用
在终端中运行以下命令启动 Flask 服务器:
python app.py
默认情况下,Flask 服务器会在 http://localhost:5000
运行。你可以通过浏览器访问这个地址,查看主页和关于页是否正常显示。
3. 运行模式
Locust支持单机模式、分布式模式和无头模式。每种模式适用于不同的测试场景。
3.1 单机模式
适用于小规模测试。简单直接,只需在一台机器上运行 Locust。
一个简单的 Locust 测试脚本如下所示:
# locust-test1.py
from locust import HttpUser, TaskSet, task, between
# 定义一个任务类继承TaskSet类
class UserBehavior(TaskSet):
# @task(1) 是装饰器,声明此方法是一个任务,权重为1。权重不写的话默认为1
@task(1)
def index(self):
self.client.get("/")
# @task(2) 是装饰器,声明此方法是一个任务,权重为2
@task(2)
def about(self):
self.client.get("/about")
# 定义一个运行类继承HttpUser类
class WebsiteUser(HttpUser):
tasks = [UserBehavior]
wait_time = between(1, 5)
host = "http://localhost:5000"
在这个脚本中,我们定义了一个 UserBehavior
类,其中包含两个任务:访问主页(index
)和访问关于页(about
)。然后我们定义了一个 WebsiteUser
类,指定用户行为、请求之间的等待时间以及测试的web服务器。
运行 Locust:
在终端中运行以下命令启动 Locust:
locust -f locust-test1.py
配置和启动测试:
打开浏览器访问 http://localhost:8089
,在 Locust 的 Web 界面中设置测试参数,设置并发用户数为50,设置每秒增加的用户数为10,即以多快的速度增加用户。测试host为本机运行的flask服务器,运行时间为60秒。然后启动测试。
结果结果统计:
图标性能曲线:
测试报告下载:
3.2 分布式模式
适用于大规模测试。支持多台机器协同工作,能够模拟大量并发用户,包括 master 和 worker 节点,worker节点产生负载, master 节点主要负责协调和收集来自多个 worker 节点的数据。
运行方法:
-
启动 master:
locust -f locust-test1.py --master
-
启动 worker:
# worker机器同样需要安装locust locust -f locust-test1.py --worker --master-host=<master_ip>
worker运行后,master侧命令行会有worker已连接的打印,可以看到当前master下面连接的worker数量。
在浏览器中打开 http://<master_ip>:8089
,配置测试参数并启动测试:
3.3 无头模式(Headless Mode)
适用于持续集成(CI)环境或不需要图形界面的场景。可以自动执行测试,并将结果输出到控制台或文件中。
运行方法:
使用命令行参数配置和启动测试:
locust -f locust-test1.py --headless -u 100 -r 10 -H http://192.168.0.210:5000 --run-time 1m --csv=results
参数说明:
--headless
:无头模式运行。-u
或--users
:模拟的用户数。-r
或--spawn-rate
:每秒启动的用户数。--run-time
:测试运行时间,例如1m
表示 1 分钟。--csv
:将测试结果输出到 CSV 文件。
3.4 总结
- 单机模式 适用于简单的小规模测试。
- 分布式模式 适用于大规模测试,通过多个 worker 节点协同工作来模拟大量并发用户。
- 无头模式 适用于自动化测试和持续集成环境,可以在没有图形界面的情况下运行测试并输出结果。
4. locust运行参数说明
命令行选项 | 环境变量 | 配置文件字段 | 描述说明 |
---|---|---|---|
-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主机的端口地址。默认为8089。 |
--headless | LOCUST_HEADLESS | headless | 禁用Web界面,立即开始负载测试。需要指定-u 和-t 。 |
--autostart | LOCUST_AUTOSTART | autostart | 立即开始测试(不禁用Web UI)。使用-u 和-t 控制用户数和运行时间。 |
--autoquit | LOCUST_AUTOQUIT | autoquit | 在测试运行完成后 X 秒后完全退出 Locust。仅与--autostart 一起使用。默认为保持Locust运行,直到使用 CTRL+C 关闭。 |
--headful | LOCUST_HEADFUL | 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 | 以Master模式运行,用于分布式负载测试。 |
--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 | 预期的分布式客户端数量。仅在与--headless 一起使用时生效。 |
--expect-workers-max-wait | LOCUST_EXPECT_WORKERS_MAX_WAIT | expect-workers-max-wait | 等待Worker连接的最长时间。默认为永远等待。 |
--worker | LOCUST_MODE_WORKER | worker | 以Worker模式运行,用于分布式负载测试。 |
--master-host | LOCUST_MASTER_NODE_HOST | master-host | Master节点的主机名或IP地址。仅在与--worker 一起使用。默认为127.0.0.1。 |
--master-port | LOCUST_MASTER_NODE_PORT | master-port | Master节点使用的端口。仅在与--worker 一起使用。默认为5557。 |
-T, --tags | LOCUST_TAGS | tags | 测试中要包含的标签列表,仅执行具有任何匹配标签的任务。 |
-E, --exclude-tags | LOCUST_EXCLUDE_TAGS | exclude-tags | 要从测试中排除的标签列表,仅执行没有匹配标签的任务。 |
--csv | LOCUST_CSV | csv | 将请求统计信息以CSV格式存储到文件中。 |
--csv-full-history | LOCUST_CSV_FULL_HISTORY | csv-full-history | 将每个统计信息条目以CSV格式存储到_stats_history.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的日志记录设置。 |
--loglevel, -L | LOCUST_LOGLEVEL | loglevel | 日志级别,选择DEBUG/INFO/WARNING/ERROR/CRITICAL。默认为INFO。 |
--logfile | LOCUST_LOGFILE | logfile | 日志文件的路径。如果未设置,日志将输出到stderr。 |
--exit-code-on-error | LOCUST_EXIT_CODE_ON_ERROR | exit-code-on-error | 在测试结果包含任何失败或错误时设置退出代码。默认为1。 |
-s, --stop-timeout | LOCUST_STOP_TIMEOUT | stop-timeout | 退出之前等待模拟用户完成的任务的秒数。仅在运行Locust分布式时设置在主进程上。 |
有关更多详细信息,包括如何使用文件或环境变量设置选项,请参阅文档:https://docs.locust.io/en/stable/configuration.html
5. 参考
-
官方文档:http://docs.locust.io/en/stable/installation.html
-
Locust性能测试之快速入门: https://www.cnblogs.com/xyztank/articles/16932194.html
何使用文件或环境变量设置选项,请参阅文档:https://docs.locust.io/en/stable/configuration.html