Locust web性能测试实践

Locust web性能测试实践

Locust 是一个开源的负载测试工具,使用Python语言实现,其简洁、轻量、高效的并发机制基于Gevent协程,可以实现单机模拟生成较高的并发压力。具有分布式和可扩展的特点,能够帮助你评估系统的性能并找到潜在的瓶颈。

Locust 的主要特点:

  1. 使用 Python 编写测试脚本:你可以用 Python 编写用户行为脚本,定义各种用户操作和请求。
  2. 分布式测试:支持分布式测试,允许在多台机器上同时运行,从而模拟大量的并发用户。
  3. 实时 Web 界面:提供直观的 Web 界面,用于配置测试参数、启动和监控测试。
  4. 可扩展性强:可以通过编写自定义代码来扩展 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, --locustfileLOCUST_LOCUSTFILElocustfile要导入的Python模块文件,例如’…/other.py’。默认为locustfile。
-H, --hostLOCUST_HOSThost负载测试主机地址,例如’https://www.baidu.com’。
-u, --usersLOCUST_USERSusers并发用户数。主要与--headless一起使用。您可以在测试期间使用"w"和"W"(增加1或10个用户)以及"s"和"S"(停止1或10个用户)来更改。
-r, --spawn-rateLOCUST_SPAWN_RATEspawn-rate每秒产生用户的速率。主要与--headless一起使用。
--hatch-rateLOCUST_HATCH_RATEhatch-rate启动虚拟用户的速率。
-t, --run-timeLOCUST_RUN_TIMErun-time在指定的时间段后停止测试,例如(300s、20m、3h、1h30m等)。仅与--headless一起使用。默认为永久运行。
--web-hostLOCUST_WEB_HOSTweb-host绑定Web界面的主机。默认为’*'(所有接口)。
--web-port, -PLOCUST_WEB_PORTweb-port运行Web主机的端口地址。默认为8089。
--headlessLOCUST_HEADLESSheadless禁用Web界面,立即开始负载测试。需要指定-u-t
--autostartLOCUST_AUTOSTARTautostart立即开始测试(不禁用Web UI)。使用-u-t控制用户数和运行时间。
--autoquitLOCUST_AUTOQUITautoquit在测试运行完成后 X 秒后完全退出 Locust。仅与--autostart一起使用。默认为保持Locust运行,直到使用 CTRL+C 关闭。
--headfulLOCUST_HEADFULheadful启用Headful模式。
--web-authLOCUST_WEB_AUTHweb-auth使用基本身份验证打开Web界面。格式为username:password。
--tls-certLOCUST_TLS_CERTtls-cert用于HTTPS服务的TLS证书的路径。
--tls-keyLOCUST_TLS_KEYtls-key用于HTTPS服务的TLS私钥的路径。
--masterLOCUST_MODE_MASTERmaster以Master模式运行,用于分布式负载测试。
--master-bind-hostLOCUST_MASTER_BIND_HOSTmaster-bind-hostMaster节点绑定的主机名或IP地址。仅在与--master一起使用。默认为’*'(所有可用接口)。
--master-bind-portLOCUST_MASTER_BIND_PORTmaster-bind-portMaster节点绑定的端口。仅在与--master一起使用。默认为5557。
--expect-workersLOCUST_EXPECT_WORKERSexpect-workers预期的分布式客户端数量。仅在与--headless一起使用时生效。
--expect-workers-max-waitLOCUST_EXPECT_WORKERS_MAX_WAITexpect-workers-max-wait等待Worker连接的最长时间。默认为永远等待。
--workerLOCUST_MODE_WORKERworker以Worker模式运行,用于分布式负载测试。
--master-hostLOCUST_MASTER_NODE_HOSTmaster-hostMaster节点的主机名或IP地址。仅在与--worker一起使用。默认为127.0.0.1。
--master-portLOCUST_MASTER_NODE_PORTmaster-portMaster节点使用的端口。仅在与--worker一起使用。默认为5557。
-T, --tagsLOCUST_TAGStags测试中要包含的标签列表,仅执行具有任何匹配标签的任务。
-E, --exclude-tagsLOCUST_EXCLUDE_TAGSexclude-tags要从测试中排除的标签列表,仅执行没有匹配标签的任务。
--csvLOCUST_CSVcsv将请求统计信息以CSV格式存储到文件中。
--csv-full-historyLOCUST_CSV_FULL_HISTORYcsv-full-history将每个统计信息条目以CSV格式存储到_stats_history.csv文件中。
--print-statsLOCUST_PRINT_STATSprint-stats在控制台中周期性打印统计信息。
--only-summaryLOCUST_ONLY_SUMMARYonly-summary仅打印摘要统计信息。
--reset-statsLOCUST_RESET_STATSreset-stats完成后重置统计信息。在分布式模式下,应在Master和Worker上设置。
--htmlLOCUST_HTMLhtml将HTML报告存储到指定的文件路径。
--skip-log-setupLOCUST_SKIP_LOG_SETUPskip-log-setup禁用Locust的日志记录设置。
--loglevel, -LLOCUST_LOGLEVELloglevel日志级别,选择DEBUG/INFO/WARNING/ERROR/CRITICAL。默认为INFO。
--logfileLOCUST_LOGFILElogfile日志文件的路径。如果未设置,日志将输出到stderr。
--exit-code-on-errorLOCUST_EXIT_CODE_ON_ERRORexit-code-on-error在测试结果包含任何失败或错误时设置退出代码。默认为1。
-s, --stop-timeoutLOCUST_STOP_TIMEOUTstop-timeout退出之前等待模拟用户完成的任务的秒数。仅在运行Locust分布式时设置在主进程上。

有关更多详细信息,包括如何使用文件或环境变量设置选项,请参阅文档:https://docs.locust.io/en/stable/configuration.html

5. 参考

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

  2. Locust性能测试之快速入门: https://www.cnblogs.com/xyztank/articles/16932194.html
    何使用文件或环境变量设置选项,请参阅文档:https://docs.locust.io/en/stable/configuration.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/711033.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GO RACE 测试在低版本GCC上报错误 exit status 0xc0000139

windows机器环境&#xff0c;go程序使用race定位时一运行就报错&#xff0c;写了个example如&#xff1a; 能看到加了race之后就不行了&#xff0c; 搜了一下&#xff0c;git上有个issue&#xff1a; runtime: Race detector causes exit status 0xc0000139 on Windows 11 wi…

html圆盘钟表纯js有解释【搬代码】

结果如图所示&#xff1a; 使用的idear中的html编写 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

从入门到高手的99个python案例(2)

51. 列表和数组比较 - 列表通用&#xff0c;NumPy数组高效。 import numpy as np normal_list [1, 2, 3] np_array np.array([1, 2, 3]) print(np_array.shape) # 输出 (3,), 数组有形状信息 52. Python的内置模块datetime - 处理日期和时间。 from datetime import…

cocos creator如何使用cryptojs加解密(及引入方法)

cocos creator如何使用cryptojs加解密&#xff08;及引入方法&#xff09; 如果想转请评论留个言并注明原博 Sclifftop 13805064305 阿浚 cocos creator如何使用cryptojs加解密&#xff08;及引入方法&#xff09; 步骤 获取库 1. npm install crypto-js -g&#xff0c;加不加…

电源小白入门学习11——反激电源电路原理

电源小白入门学习11——反激电源、正激电源 隔离电源变压器介绍反激电源 前面我们学习了BUCK、BOOST、BUCK-BOOST 等各种各样的DCDC变换器&#xff0c;但是他们都有一共同的特点&#xff0c;即能量的传输路径时一个完整的通路&#xff0c;输入与输出之间不存在电气隔离&#xf…

[Java基本语法] 逻辑控制与方法

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

Qwen-Agent:Qwen2加持,强大的多代理框架 - 函数调用、代码解释器以及 RAG!

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; Qwen-Agent&#xff1a;Qwen2加持&#xff0c;强大的多代理框架 - 函数调用、代码解释器以及 RAG&…

程序优化 --- arthas trace命令使用

最近在做优化,通过arthas的trace命令去观察方法内的耗时情况以便对程序进行修改. 1.启动arthas之后选择需要监测的程序 2.找到需要监测的接口,一般都是直接找service例子如下: trace 类地址.类名 方法名 (中间有空格)

【odoo15】前端自定义模态弹窗

概要 在odoo15或者在15之前&#xff0c;odoo前端的owl框架还没完全替换当前前端框架的时候&#xff0c;我们很多时候都是用js或者jq来直接操作dom&#xff0c;那么我们如果需要在前端用到一个模态弹窗&#xff0c;可以怎么解决呢&#xff1f; 方法1 直接用js原生的模态弹窗&am…

blender

通用设置: 仅显示/取消隐藏:数字键盘/移动视角:shift+鼠标中键Blender如何给场景添加参考图片-百度经验 (baidu.com)进入编辑模式:Tab编辑模式:点-线-面 反选:ctrl+按键重新计算面朝向:shift+n水密:+修改器:焊接连选的区别: 视窗设置 两个视图 …

拥抱数字世界|AI在娱乐行业的应用,娱乐新纪元已到来

在蓬勃发展的全球化趋势下&#xff0c;越来越多的厂商正在批量涌入娱乐赛道&#xff0c;期待能创造新的增长奇迹。随着科技的不断发展&#xff0c;人工智能技术正日益深入各行各业&#xff0c;其中媒体和娱乐行业更是迎来了一场革命性的变革。在媒体和娱乐领域展现出了巨大的潜…

Zig标准库:最全数据结构深度解析(1)

最近新闻看到17岁中专女生拿下阿里全球数学竞赛第12名。咱们学习标准库中的数据结构是和学习数学是一脉相承的&#xff0c;结构体很多&#xff0c;也非常枯燥&#xff0c;但是不能全面解读过一遍&#xff0c;你很难写出合理的代码。所以&#xff0c;这一章节我们开始深度解析Zi…

网站接口是怎么开发的,开发之后是怎么用的

网站接口的开发流程 1.确定接口需求 在开发接口之前我们先要知道&#xff0c;要开发什么样的接口&#xff0c;这个接口是用来干什么的&#xff0c;得先知道相关的需求&#xff0c;才能规划下一步&#xff0c;比如客户想要一个文章列表&#xff0c;那么我们就知道这个需求…

酒店民宿小程序开发,旅游业发展下的商业机遇

随着人们生活水平的日益提高&#xff0c;对各种娱乐方式的需求在不断上升&#xff0c;其中旅游成为了大众的“新宠”。旅游业的快速发展也推动了酒店民宿的蓬勃发展&#xff0c;打造一个便捷高效的线上酒店民宿小程序成为了至关重要的发展趋势&#xff01; 如今&#xff0c;不…

RFID技术在农产品管理中的应用

使用RFID技术对农产品生产、加工、存储和销售的全过程进行跟踪&#xff0c;追溯食品的生产和加工过程&#xff0c;能够有效加强农产品的管理&#xff0c;如图7—10所示。 将RFID技术应用于农业食品安全&#xff0c;首先是建立完整、准确的食品供应链信息记录。借助RFID 对物体…

什么是无杂散动态范围 (SFDR)?为什么 SFDR 很重要?

有多种不同的规格可用于表征电路线性度。SFDR 指标是一种常用的规范。该指标定义为所需信号幅度与感兴趣带宽内杂散的比率&#xff08;图 1&#xff09;。 图 1. 显示 SFDR 指标的图表。 对于 ADC&#xff0c;SFDR 展示了 ADC 如何在存在大信号的情况下同时处理小信号。作为一个…

如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题

&#x1f6e0;️ 如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题 摘要 在这篇文章中&#xff0c;我们将详细探讨如何解决在升级到 IntelliJ IDEA 最新版&#xff08;2024.1.3 Ultimate Edition&#xff09;后遇到的 Git 记住密码功能失效的问题。…

嵌入式操作系统_2.嵌入式操作系统的一般架构

1.嵌入式操作系统的概念 嵌入式操作系统通常由硬件驱动程序、调式代理、操作系统内核、文件系统和可配置组件等功能组成&#xff0c;并为应用软件提供标准的API&#xff08;Application Programming Interface&#xff09;接口服务。 2.一般嵌入式操作系统的体系结构 从嵌入…

LeetCode 230.二叉搜索树中第K小的元素

各位看官们&#xff0c;大家好啊&#xff0c;今天这个题我用的方法时间复杂度比较高&#xff0c;但也是便于便于理解的一种方法&#xff0c;大家如果觉得的好的话&#xff0c;就给个免费的赞吧,谢谢大家了^ _ ^ 题目要求如图所示: 题目步骤&#xff1a; 1.我们可以一维数组来接…

oracle安装,导出、导入domp文件、解开oracle行级锁

下载地址&#xff1a; https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html 然后解压&#xff0c;请记住你的解压地址&#xff0c;也就是软件安装地址&#xff0c; 后面还会有一个数据库存储位置&#xff0c;导出的domp文件就是在这里。 然后按照…