首页 > 其他分享 >Locust性能测试实践

Locust性能测试实践

时间:2024-06-14 21:32:26浏览次数:25  
标签:-- Locust locust LOCUST 实践 master 测试

Locust性能测试实践

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秒。然后启动测试。

image-20240614202353738

结果结果统计:

image-20240614202941230

图标性能曲线:

image-20240614203403015

测试报告下载:

image-20240614203511379

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,配置测试参数并启动测试:

image-20240614210302721

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. 参考

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

  2. Locust性能测试之快速入门: https://www.cnblogs.com/xyztank/articles/16932194.html

标签:--,Locust,locust,LOCUST,实践,master,测试
From: https://www.cnblogs.com/lldhsds/p/18248698

相关文章

  • 接口测试
    Postman接口测试中的参数化功能是的,Postman的参数化功能非常实用,它允许你在请求中使用变量,进而实现数据的动态替换。这可以通过预定义环境变量、全局变量或者集合内的数据文件(如CSV、JSON)来实现。你可以利用这些功能进行参数化测试,比如迭代测试不同用户登录、测试不同数据场景......
  • 电商项目的性能测试流程,看完就懂!
    今天给大家带来一套完整的性能测试实操流程,就以大家耳熟能详的电商项目来进行示例。现在就花个5分钟,认真看一下吧!一、核心业务梳理做一个项目的性能测试,首先得梳理出哪些业务需要进行性能测试。这个过程有一个前提就是:要对测试的对象(项目)熟悉。熟悉到什么程度呢?明确知道......
  • mac下locust的安装
    mac下locust的安装 一、locust介绍 二、安装  1.先安装python  安装命令:brewinstallpython3  2.安装locust  pip3installlocust  3.检查locust是否安装成功  1)检查locust安装信息  pip3showlocust1Name:locust2Version:2.29.0......
  • 运维shell脚本之测试mysql密码正确与否
    shell脚本实战:测试mysql密码正确与否在迁移过程中,常有批量迁移数据库的情况,因此在割接前,需要批量测试一次割接后的数据库信息是否配置正常,故写了一个shell脚本用于测试数据库密码是否正确有误,具体步骤如下:测试前,需要测试当前服务器是否已安装mysql,可通过命令进行测试:mysq......
  • 【思考】:一个项目完全交由一个人来做自动化测试,可行吗?
       昨夜凌晨两点多,辗转反侧,夜不能寐。   回想起在目前这家公司的三年,经历了大大小小几个项目,过后总结发现,其实或多或少,都存在一些人为因素及管理上的问题。而这些问题,是不在其位的我所改变不了的。(况且,我只是一个最强工具人角色,没有任何管理的实权,也没有较强的话语权......
  • SSH实践生成密码
    $ssh-keygen-trsa-P''-f~/.ssh/id_rsa$cat~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys$chmod0600~/.ssh/authorized_keys-t:指定生成密钥类型(rsa、dsa、ecdsa等)-P:指定passphrase,用于确保私钥的安全-f:指定存放密钥的文件(公钥文件默认和私钥同目录下,不同的是,存......
  • OpenTelemetry 实践指南:历史、架构与基本概念
    背景之前陆续写过一些和OpenTelemetry相关的文章:实战:如何优雅的从Skywalking切换到OpenTelemetry实战:如何编写一个OpenTelemetryExtensions从一个JDK21+OpenTelemetry不兼容的问题讲起这些内容的前提是最好有一些OpenTelemetry的背景知识,看起来就不会那么枯燥,为......
  • linux环境 kafka3.4.0 刚搭建好(用kraft替代zookeeper) 怎么建个topic测试一下消费有没
        在使用Kafka3.4.0并且用Kraft(KafkaRaft)替代Zookeeper的情况下,步骤会有一些变化。这是因为Kraft模式下Kafka自身管理元数据,而不再依赖Zookeeper。以下是使用Kraft模式的Kafka3.4.0创建topic并进行生产和消费测试的具体步骤:###1.**启动Kaf......
  • Golang性能优化实践
    内存警察警惕一切隐式内存分配典型case:函数返回了字符串、切片,警惕一切字符串传进去的输入,函数内部重新分配了一个新的内存返回对象复用1.sync.pool 保证有一个ch大小的对象可用 假设有cpu核数那么多并发任务,可以保证gc的时候有保底在 2.局部cachesync.pool......
  • SDN VMware NSX网络原理与实践-NSX 网络虚拟化概览【1.3】
    第2章NSX网络虚拟化概览        网络虚拟化技术诞生后,有不少厂商都推出了所谓的网络虚拟化解决方案。这些厂商实现“网络虚拟化”的方式各异,有些是自己研发的项目,有些是通过收购,有些是利用开源项目进行再开发。而VMwareNSX网络虚拟化平台的基本架构到底是怎样......