Python 模块 locust 性能测试

news2024/11/27 20:27:04

简介

        locust 是 Python 的一个开源的负载测试工具,用于测试网络应用程序的性能和可伸缩性。它使用Python编写,并提供了一个简单易用的语法来定义和执行负载测试。locust模块允许用户模拟大量并发用户并观察系统在高负载下的响应情况。

目录

1. 基本用法

1.1. 基础代码

1.2. 执行方法

1.2.1. web 界面执行

1.2.2. 命令执行

2. 多用例调度

2.1. 数据关联

2.1.1. 自定义辅助方法

2.1.2. 自定义初始操作

2.1.3. 任务依赖方法

2.2. 执行顺序

2.3. 线程分配

3. 分布式压测


                              

1. 基本用法

1.1. 基础代码

from locust import HttpUser, task, between

class MyUser(HttpUser):
    # 设置用户在执行任务时等待 1~3 秒
    wait_time = between(1, 3)

    @task   #标记为测试任务
    def test1(self):
        # 发送 get 请求
        response = self.client.get('xxx')
        # 通过状态码来断言
        assert response.status_code == 200

                                       

post 请求方法

data = {"username": "yt", "password": "123456"}
self.client.post("xxx", json=data)  # 发送POST请求到指定URL,并附带JSON数据

get 带头部信息

headers = {"Authorization": "yt token123"}
self.client.get("xxx", headers=headers)  # 发送带头部的GET请求

                                       

1.2. 执行方法

1.2.1. web 界面执行

1、执行命令

locust -f 文件

                                       

2、通过提示的地址打开浏览器

提示地址:http://0.0.0.0:8089

把 0.0.0.0 改成 localhost

http://localhost:8089/

                                       

3、查看结果

大项选择

                                       

统计数据(Statistics)

  • Requests:总请求数
  • Fails:总失败数
  • Median (ms):中位数响应时间(将所有观察值按从小到大排序后,正好处于中间位置的值)
  • 90%ile (ms):90% 的响应时间(有 90% 的请求的响应时间小于或等于该值)
  • 99%ile (ms):99% 的响应时间(有 99% 的请求的响应时间小于或等于该值)
  • Average (ms):平均响应时间
  • Min(ms):最小响应时间
  • Max(ms):最大响应时间
  • Average size (bytes):请求返回的平均响应内容大小
  • Current RPS:当前的每秒请求数
  • Current Failures/s: 当前每秒失败请求数

                                       

图表信息(Charts)

每秒总请求数(Total Requests per Second)

  • RPS:当前请求数
  • Failures/s:当前失败数

                                       

响应时间(Response Times (ms))

  • Median Response Time:中位数响应时间
  • 95% percentile:95% 的响应时间

                                       

用户数(Number of Users)

                                       

1.2.2. 命令执行

常用参数选项

-f:指定Python测试文件
-H:设置主机地址
-u:设置用户数
-r:每秒生成n个用户
-t:指定测试时长(例如:300s, 20m, 3h, 1h30m)
-P:指定web界面端口
-l:显示可能的User类列表并退出

web UI 参数选项

--web-host:要绑定web接口的主机。默认为'*'(所有接口)
--web-port:指定web界面端口
--headless:不使用web界面测试,直接启动测试
--autostart:直接启动测试,不禁用web
--autoquit:执行运行结束后n秒完全退出。只能与——autostart一起使用。默认情况下,在使用CTRL+C关闭Locustl之前,它将一直运行
--web-auth:打开web界面的基本验证。基本格式为 username:password
--tls-cert:用于通过HTTPS提供服务的TLS证书的可选路径
--tls-key:用于通过HTTPS提供服务的TLS私钥的可选路径

分布式压测选项

--master:将locust设置为以分布式模式运行,并将此进程设置为主进程
--master-bind-host:master绑定的接口(主机名、ip)(默认:*(所有可用接口))
--master-bind-port:locust绑定的端口(默认:5557)
--expect-workers:在开始测试之前(仅当使用——headless/autostart时),master应该连接多少worker
--expect-workers-max-wait:主节点等待备节点的时间(默认:永远等待)

--worker:将locust设置为以分布式模式运行,并将此进程作为辅助进程
--master-host:指定主机或IP地址(默认:127.0.0.1)
--master-port:指定要连接的端口。默认为5557。

输出信息选项

--html:将HTML报告存储到指定的文件路径
--csv:以CSV格式将当前请求状态存储到文件中
--csv-full-history:将每个统计条目以CSV格式存储到统计历史记录中。必须指定'--csv'
--print-stats:在控制台中打印统计信息
--only-summary:仅打印摘要统计信息
--reset-stats:开始之前重置所有的统计数据(包括请求数、响应时间等),分布式需要同时设置主备。
               该参数主要用于在连续运行多个测试场景时,确保每个测试都从零开始计算统计信息,以避免之前的数据对当前测试的影响。

输出日志选项

--skip-log-setup:禁用locust的日志设置,由Locust测试或Python默认值提供。
--loglevel:设置日志级别(默认:INFO),可选 DEBUG、INFO、WARNING、ERROR、CRITICAL
--logfile:指定日志文件的路径。如果没有设置,日志将转到stderr

                                       

直接使用命令执行

locust -f tmp1.py --host=abc --headless -u 10 -r 1 -t 10s
  • -f:指定测试文件 tmp1.py
  • --host:指定访问地址(代码中已写死地址,这里随便写都行)
  • --headless:禁用web,直接测试
  • -u:设置10个总用户数
  • -r:每秒增加1个用户
  • -t:总共执行10秒

                                       

将命令放入 Python 文件

import os

if __name__ == '__main__':
    file_path = os.path.abspath(__file__)
    os.system(f'locust -f {file_path} --host=abc --headless -u 1 -t 1s')

                                       

                                       

2. 多用例调度

2.1. 数据关联

2.1.1. 自定义辅助方法

方法结构

代码如下

from locust import HttpUser, task

class MyUser(HttpUser):
    # 定义一个空的token
    token = ""

    '''定义测试用例'''
    @task
    def test1(self):
        # 先调用登录方法
        self.login()
        # 再调用查询信息的方法
        self.query_information()

    '''定义登录方法'''
    def login(self):
        # 使用post请求登录界面
        response = self.client.post("/login", json={"username": "yt", "password": 123456})
        # 获取登录的token值
        self.token = response.json()["token"]

    '''定义登录之后的查询信息'''
    def query_information(self):
        # 通过登录方法获取的token值,组成headers
        headers = {"Authorization": f"yt {self.token}"}
        # 查询个人信息
        self.client.post("xxx", headers=headers, json={"data": "data"})

                                       

2.1.2. 自定义初始操作

方法结构

代码如下

from locust import HttpUser, task

class MyUser(HttpUser):
    # 定义一个空的token
    token = ""

    """定义一个开始方法,on_start是固定名称"""
    def on_start(self):
        # 在测试前进行登录,并获取token值
        response = self.client.post("/login", json={"username": "yt", "password": 123456})
        self.token = response.json()["token"]

    """封装测试用例"""
    @task
    def test1(self):
        # 通过测试前获取的token代入headers
        headers = {"Authorization": f"yt {self.token}"}
        # 执行post请求测试
        self.client.post("xxx", headers=headers, json={"data": "data"})

                                       

2.1.3. 任务依赖方法

方法结构

代码如下

from locust import HttpUser, task

class MyUser(HttpUser):
    # 定义一个空的token
    token = ""

    """定义一个登录测试方法"""
    @task
    def login(self):
        # 使用post请求登录界面
        response = self.client.post("/login", json={"username": "yt", "password": 123456})
        # 获取登录token值
        self.token = response.json()["token"]

    """定义一个登录后查询信息的方法"""
    @task
    def query_information(self):
        # 通过登录方法获取的token值,组成headers
        headers = {"Authorization": f"yt {self.token}"}
        # 查询个人信息
        self.client.post("xxx", headers=headers, json={"data": "data"})

                                       

2.2. 执行顺序

使用 tasks = [ ] 来指定任务函数的执行顺序。任务函数会循环执行,按照列表中的顺序进行调度。

【错误示例】直接使用 HttpUser 方法不能保证顺序

from locust import HttpUser, task

class MyUser(HttpUser):
    @task
    def test1(self):
        print('test1  --登录')

    @task
    def test2(self):
        print('test2  --查询商品信息')

    @task
    def test3(self):
        print('test3  --查看评价')

    tasks = [test1, test3, test2]

                                       

使用 SequentialTaskSet 方法(从上往下顺序执行)

from locust import HttpUser, task, SequentialTaskSet

class MyUser(HttpUser):

    """定义一个顺序执行的类,方法从上往下的执行"""
    @task
    class MySequentialTaskSet(SequentialTaskSet):

        @task
        def test1(self):
            print('test1  --登录')

        @task
        def test2(self):
            print('test2  --查询商品信息')

        @task
        def test3(self):
            print('test3  --查看评价')

    # 在user类中,指定类的顺序
    tasks = [MySequentialTaskSet]

                                       

2.3. 线程分配

  • 使用 @task 装饰器设置权重(权重为1,执行1次;权重为2,执行2次...)。设置权重后 tasks 指定的顺序将会受到影响。

示例(测试前登录,登录后多次调用其他方法)

from locust import HttpUser, task

class MyUser(HttpUser):
    """测试前调用登录方法"""
    def on_start(self):
        self.test1()

    """封装一个登录方法"""
    def test1(self):
        print('test1  --登录')

    """封装一个查询商品信息的方法"""
    @task(3)    # 设置权重为3,执行3次
    def test2(self):
        print('test2  --查询商品信息')

    """封装一个查看评价的方法"""
    @task(5)    # 设置权重为5,执行5次
    def test3(self):
        print('test3  --查看评价')

    """指定执行顺序,基本无效"""
    tasks = [test2, test3]

                                       

使用 SequentialTaskSet 方法指定顺序,并设置权重

from locust import HttpUser, task, SequentialTaskSet, TaskSet

class MyUser(HttpUser):

    """定义一个顺序执行的类"""
    @task
    class MySequentialTaskSet(SequentialTaskSet):

        @task(1)    # 执行1次
        def test1(self):
            print('test1  --登录')

        @task(5)    # 执行5次
        def test2(self):
            print('test2  --查询商品信息')

        @task(3)    # 执行3次
        def test3(self):
            print('test3  --查看评价')

                                       

                                       

3. 分布式压测

方法简单,步骤如下

  • 编写 locust 脚本 → 主节点执行 →  从节点执行 → web 端启动

1、编写 locust 脚本(根据实际情况写,方法同上示例)

2、主节点启动 locust 100个线程

locust -f <Python文件> --master --users 100

3、从节点启动 locust 50个线程

locust -f <Python文件> --slave --master-host=<主节点的IP> --clients 50

4、登录 web 界面执行即可(见目录 1.2.1)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue中transition动画的使用

1.vue文件 说明&#xff1a;加name属性 <transition name"sort"><div class"sort" v-show"show"><div class"all-sort-list2" click"goSearch"><div class"item bo" v-for"(item1, in…

图像膨胀+滤波达到边缘外扩模糊效果

有一个扯淡需求, 根据某些格网值渲染对应的颜色, 我们做的实现方案是按照色代码渐变做颜色映射, 但是某些厂家不顾结果正确性与否, 应是为了好看做的好看, 将边界膨胀模糊, 一个非风场,力场类似场数据做了一个类似场的渲染效果, 也不知道说啥好, 例如原始图渲染如下 经过一系列…

初识http协议,简单实现浏览器和服务器通信

文章目录 认识urlhttp协议格式通信代码验证细节Util.hppprotocol.hppServer.hppServer.cc 结果分析 认识url 平时俗称的 “网址” 其实就是说的 URL&#xff0c;例如在百度上搜索一个C 可以看到这段网址前面有个 https 那么这个就代表着使用的是https协议&#xff0c;现在都是…

0807hw

1. 2. (1)a100,b10; a10,b100;//值传递 (2)*a100,*b10; a100,b10;//地址传递 (3)*a100,*b10; a10,b100;

深入探索 Splashtop Enterprise 的潜力

在当今高度技术化的环境中&#xff0c;远程访问解决方案已成为无数组织的支柱。远程访问解决方案缩短了员工与工作之间的地理差距&#xff0c;提高了工作的效率和灵活性&#xff0c;促进形成了无缝的工作体验。在众多远程访问解决方案中&#xff0c;Splashtop Enterprise 作为远…

FFmpeg中AVIOContext的使用

通过FFmpeg对视频进行编解码时&#xff0c;如果输入文件存在本机或通过USB摄像头、笔记本内置摄像头获取数据时&#xff0c;可通过avformat_open_input接口中的第二个参数直接指定即可。但如果待处理的视频数据存在于内存块中时&#xff0c;该如何指定&#xff0c;可通过FFmpeg…

Linux初识网络基础

目录 网络发展 认识“协议 ” 网络协议 OSI七层模型&#xff1a; TCP/IP五层&#xff08;或四层&#xff09;模型 网络传输基本流程 网络传输流程图&#xff1a; 数据包封装和封用 网络中的地址 认识IP地址&#xff1a; 认识MAC地址&#xff1a; 网络发展 1.独立…

JAVA实用工具: 改良版雪花算法-分布式唯一ID神器

Seata内置了一个分布式UUID生成器,用于辅助生成全局事务ID和分支事务ID。具体如下特点: 高性能全局唯一趋势递增这个分布式UUID生成器是基于雪花算法进行改良的,本文针对改良的方法、目的等进行总结 改良点 改良版雪花算法的实现原理参考如下: Seata基于改良版雪花算法的…

redis安装(Windows+Linux)

redis安装 文章目录 redis安装一. windows下安装二.Linux环境下安装 一. windows下安装 下载地址(github): https://github.com/tporadowski/redis/releases (强烈推荐) https://github.com/MicrosoftArchive/redis/releases 选择安装包 下载完成后根据提示进行安装即可(这…

电源控制--品质因素Q值全解

什么是品质因素Q值&#xff1f; 在电源控制中&#xff0c;品质因素 Q 值通常用于描述电源滤波器的性能。电源滤波器用于减小电源中的噪声和干扰&#xff0c;以提供干净稳定的电源供应给电子设备。 品质因素 Q 值在电源滤波器中表示滤波器的带宽和中心频率之比&#xff0c;用于…

VS Code无法跳转,搜索也搜不到

1. 公司安装的加密软件&#xff0c;天锐绿盾&#xff08;绿盾&#xff09;导致VS Code无法使用 如果的绿盾的策略里面没有VS Code的话&#xff0c;就会导致VScode 无法使用&#xff0c;其它软件也是一样&#xff0c;出问题极有可能就是绿盾拦截了&#xff0c;像我的电脑使用wi…

springboot 集成 mybatis-plus 代码生成器

springboot 集成 mybatis-plus 代码生成器 一、导入坐标依赖二、配置快速代码生成器三、自定义代码生成器模板 一、导入坐标依赖 前置依赖&#xff0c;需要用到 mybatis,mysql驱动,lombok插件以及swapper.(因为后面接口测试文档&#xff0c;所以swapper也配了) <dependenc…

Python编程从入门到实践练习第七章:input输入和while循环

目录 一、input输入函数实例 二、while循环2.1 while结构练习题 2.2 使用while循环处理列表和字典2.2.1 在列表之间移动元素2.2.2 删除为特定值的多个列表元素2.2.3 使用用户输入来填充字典练习题 一、input输入函数 input( ) 方法&#xff1a;获取用户的输入信息&#xff0c;使…

【2.2】Java微服务:nacos的使用

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 深度学习 ✨特色专栏&#xff1a; 知识分享 &…

排序八卦炉之归并、计数

文章目录 1.归并排序1.1初识代码1.2代码分析1.3复杂度1.4非递归版本1.01.初识代码2.代码分析 1.5非递归版本2.01.初识代码2.代码分析 2.计数排序2.1初始代码2.2代码分析 1.归并排序 1.1初识代码 //归并排序 时间复杂度&#xff1a;O(N*logN) 空间复杂度&#xff1a;O(N) vo…

Kaggle First Place Winner Solution Study——多变量回归问题

本期分享一个Kaggle上playground系列多变量回归问题的第一名解决方案。试着分析、复现、学习一下金牌选手的数据分析思路。 赛题链接&#xff1a; Prediction of Wild Blueberry Yield | Kagglehttps://www.kaggle.com/competitions/playground-series-s3e14第一名解决方案链…

前端小练习:案例5.律动爱心

目录 一.效果预览图 二.实现思路 ​编辑 1.html部分 2.css部分 三.完整代码 一.效果预览图 二.实现思路 想要实现爱心律动效果并不难&#xff0c;核心点是关键帧动画。 定义律动爱心需要的元素块&#xff0c;使用定位或者弹性布局等方法&#xff08;定位元素不适合布局&…

【Spring Boot】(一)Spring Boot 项目的创建和使用

文章目录 前言一、什么是 Spring Boot1.1 初识 Spring Boot1.2 Spring Boot 的核心设计思想1.3 Spring Boot 的优点 二、Spring Boot 项目的创建2.1 使用 IDEA 创建2.2 使用网页创建2.3 项目的目录结构 三、Hello World3.1 运行启动类3.2 通过浏览器页面输出 Hello World3.3 约…

当编程遇上AI,纵享丝滑

目录 前言 一、提出需求 二、检查代码 三、进一步提出需求 总结 前言 自从CHATGPT火了以后&#xff0c;我发现我身边的人再也不怕写报告了&#xff0c;什么个人总结&#xff0c;汇报材料&#xff0c;年度总结&#xff0c;伸手就来&#xff08;反正哪些报告也没人看&#x…

JavaScript 一段代码快速入门

仅记录了和c有所不同之处&#xff0c;其余类似。 一段简单代码 // 关注点分离&#xff0c;指html页面设计和javascript页面行为分离// 对象&#xff0c;键值对形式 const user {name: "gyf",age: 20,jobs: ["front-end", "engineer", 2, true…