Python 模块 locust 性能测试

简介

        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, betweenclass 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 osif __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, taskclass MyUser(HttpUser):# 定义一个空的tokentoken = ""'''定义测试用例'''@taskdef 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值,组成headersheaders = {"Authorization": f"yt {self.token}"}# 查询个人信息self.client.post("xxx", headers=headers, json={"data": "data"})

                                       

2.1.2. 自定义初始操作

方法结构

代码如下

from locust import HttpUser, taskclass MyUser(HttpUser):# 定义一个空的tokentoken = """""定义一个开始方法,on_start是固定名称"""def on_start(self):# 在测试前进行登录,并获取token值response = self.client.post("/login", json={"username": "yt", "password": 123456})self.token = response.json()["token"]"""封装测试用例"""@taskdef test1(self):# 通过测试前获取的token代入headersheaders = {"Authorization": f"yt {self.token}"}# 执行post请求测试self.client.post("xxx", headers=headers, json={"data": "data"})

                                       

2.1.3. 任务依赖方法

方法结构

代码如下

from locust import HttpUser, taskclass MyUser(HttpUser):# 定义一个空的tokentoken = """""定义一个登录测试方法"""@taskdef login(self):# 使用post请求登录界面response = self.client.post("/login", json={"username": "yt", "password": 123456})# 获取登录token值self.token = response.json()["token"]"""定义一个登录后查询信息的方法"""@taskdef query_information(self):# 通过登录方法获取的token值,组成headersheaders = {"Authorization": f"yt {self.token}"}# 查询个人信息self.client.post("xxx", headers=headers, json={"data": "data"})

                                       

2.2. 执行顺序

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

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

from locust import HttpUser, taskclass MyUser(HttpUser):@taskdef test1(self):print('test1  --登录')@taskdef test2(self):print('test2  --查询商品信息')@taskdef test3(self):print('test3  --查看评价')tasks = [test1, test3, test2]

                                       

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

from locust import HttpUser, task, SequentialTaskSetclass MyUser(HttpUser):"""定义一个顺序执行的类,方法从上往下的执行"""@taskclass MySequentialTaskSet(SequentialTaskSet):@taskdef test1(self):print('test1  --登录')@taskdef test2(self):print('test2  --查询商品信息')@taskdef test3(self):print('test3  --查看评价')# 在user类中,指定类的顺序tasks = [MySequentialTaskSet]

                                       

2.3. 线程分配

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

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

from locust import HttpUser, taskclass 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, TaskSetclass MyUser(HttpUser):"""定义一个顺序执行的类"""@taskclass 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.mzph.cn/news/31232.shtml

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

相关文章

多线程的实现方式Thread、Runnable、Callable

1.并发和并行 并发&#xff1a;在同一时刻&#xff0c;有多个指令在单个CPU上交替执行。 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上同时执行 2.多线程的实现方式 2.1 继承Thread类实现方式 2.2 实现Runnable接口的实现方式 2.3 利用Callable接口和Futur…

基于金融行业的软件测试分析

随着银行业务不断增加&#xff0c;业务模式不断复杂化&#xff0c;对我们的银行软件也要求越来越高&#xff0c;产出高质量的产品也非常重要&#xff0c;下面对银行软件测试进行分析总结。 银行软件集中度高&#xff0c;规模庞大&#xff0c;往往是以系统群的方式存在&#xff…

F. Sum and Product - 思维

分析&#xff1a; 题目中的格式有点像韦达定理&#xff0c;就是对于一元二次方程ax^2 bx c 0有 所以可以推出要找的就是两个点&#xff0c;可以直接二分查找存不存在&#xff0c;这题有很多边界问题&#xff0c;有b^2 - 4ac小于0或者等于0&#xff0c;或者求出来的根在数组中…

【STM32】利用CubeMX对FreeRTOS用按键控制任务

对于FreeRTOS中的操作&#xff0c;最常用的就是创建、删除、暂停和恢复任务。 此次实验目标&#xff1a; 1.创建任务一&#xff1a;LED1每间隔1秒闪烁一次&#xff0c;并通过串口打印 2.创建任务二&#xff1a;LED2每间隔0.5秒闪烁一次&#xff0c;并通过串口打印 3.创建任…

Java算法_ 房子强盗(LeetCode_Hot100)

题目描述&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表…

【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

**本人是第六届字节跳动青训营&#xff08;后端组&#xff09;的成员。本文由博主本人整理自该营的日常学习实践&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go语言入门指南&#xff1a;基础语法和常用特性解析 | 青训营 本文主要梳理自第六届字节跳动青训营&#xff…

【对于一维信号的匹配】对一个一维(时间)信号y使用自定义基B执行匹配追踪(MP)研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C++——关于命名空间

写c项目时&#xff0c;大家常用到的一句话就是&#xff1a; using namespace std; 怎么具体解析这句话呢&#xff1f; 命名冲突&#xff1a; 在c语言中&#xff0c;我们有变量的命名规范&#xff0c;如果一个变量名或者函数名和某个库里面自带的库函数或者某个关键字重名&…

python优雅地爬虫

申明&#xff1a;仅用作学习用途&#xff0c;不提供任何的商业价值。 背景 我需要获得新闻&#xff0c;然后tts&#xff0c;在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路&#xff1a;获得html内容-> python的工具库解析&#xff0…

Multimap用法详解

Multimap Multimap 是 Google 的 Guava 库为 Java 引入的一种新集合类型&#xff0c;它允许将多个值存储在单个键下。它被设计为一种替代 Map<K, List> 或 Map<K, Set>&#xff08;JDK 标准集合框架&#xff09;的方案。 Multimap<K, V> 扩展了 AbstractMul…

0基础学C#笔记09:希尔排序法

文章目录 前言一、希尔排序的思想二、使用步骤总结 前言 希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序&#xff0c;如果数组的最大值刚好是在第一位&#xff0c;要将它挪到正确的位置就需要 n - 1 次移动。也就是说&#xff0c;原数组的一个元素如果距离它…

LeetCode--HOT100题(26)

目录 题目描述&#xff1a;142. 环形链表 II&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;142. 环形链表 II&#xff08;中等&#xff09; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返…

Vue--》打造个性化医疗服务的医院预约系统(五)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…

stm32项目(8)——基于stm32的智能家居设计

目录 一.功能设计 二.演示视频 三.硬件选择 1.单片机 2.红外遥控 3.红外探测模块 4.光敏电阻模块 5.温湿度检测模块 6.风扇模块 7.舵机 8.WIFI模块 9.LED和蜂鸣器 10.火焰传感器 11.气体传感器 四.程序设计 1.连线方式 2.注意事项 3.主程序代码 五.课题意义…

【Linux】线程的概念以及与进程的区别

目录 背景知识 什么是线程&#xff1f; 进程和线程的区别 线程的优缺点 背景知识 在了解线程前&#xff0c;我们要首先知道&#xff0c;OS是可以做到让进程进行细粒度划分的! 比如我们所说的进程地址空间中的堆区&#xff0c;它在进程PCB中的mm_structz中有一个start和…

re学习(30)攻防世界-hackme(代码复原2)

思路&#xff1a; 1.输出成功&#xff0c;v26不为0,说明关系式&#xff1a;v21((unsigned __int8)v24 ^ v20) →2.在汇编代码第37行&#xff0c;输入v16v20&#xff0c;所以求的值为v20 →3.根据关系式&#xff0c;求的值v20v21^v24 →4.v21在第汇编代码第36行也可以提取出来…

【时间格式引发的事故】

时间格式引发的事故 背景实战演示结论 背景 前不久写了一个删除数据接口&#xff0c;条件是根据时间删除时间后面的数据。入参是 时间字符串。后台的时间格式 是 yyyyMMdd。然后当时前端传参数的时候&#xff0c;随意的传了2023-07-31的时间&#xff0c;然后将该表的数据全部删…

servlet三大类HttpSevlet,HttpServletRequest,HttpServletResponse介绍

一、HttpServlet HttpServlet类是一个被继承的方法&#xff0c;可以看做一个专门用来响应http请求的类&#xff0c;这个类的所有方法都是为响应http请求服务的&#xff0c;要对一个某个路径谁知http响应时&#xff0c;需要写一个类来继承HttpServlet类&#xff0c;并重写里面的…

【深度学习】多粒度、多尺度、多源融合和多模态融合的区别

多粒度&#xff08;multiresolution&#xff09;和多尺度&#xff08;multiscale&#xff09; 多粒度&#xff08;multiresolution&#xff09;和多尺度&#xff08;multiscale&#xff09;都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度&#xff1…

ABPVNEXT-微服务框架基础入门

准备工作&#xff1a; 1.登录ABPvNext官网 网址 http://abp.io 2.跳转到商业版的说明文档&#xff0c;目前商业版没有中文&#xff0c;只能使用谷歌浏览器的内置翻译功能了 3.框架的相关环境要求&#xff0c;请自自行查看 适用于 Windows 的Visual Studio 2022 (v17.3) /…