Python实现性能测试(locust)
一、安装locust
pip install locust -- 安装(在pycharm里面安装或cmd命令行安装都可)
locust -V -- 查看版本,显示了就证明安装成功了
或者直接在Pycharm中安装locust:

搜索locust并点击安装,其他的第三方包也可以通过这种方式

二、locust介绍
Locust 是一种易于使用、可编写脚本且可扩展的性能测试工具。并且有一个用户友好的 Web 界面,可以实时显示测试进度。甚至可以在测试运行时更改负载。它也可以在没有 UI 的情况下运行,使其易于用于 CI/CD 测试。
Locust 使运行分布在多台机器上的负载测试变得容易。Locust 基于事件(gevent),因此可以在一台计算机上支持数千个并发用户。与许多其他基于事件的应用程序相比,它不使用回调。相反,它通过gevent使用轻量级进程。并发访问站点的每个Locust(蝗虫)实际上都在其自己的进程中运行(Greenlet)。这使用户可以在Python中编写非常有表现力的场景,而不必使用回调或其他机制。
三、脚本
1.方式一(直接在HttpUser中定义任务)
from locust import HttpUser, task, constant
class FlashUser(HttpUser):
host = 'http://127.0.0.1:8080/'
wait_time = constant(1)
@task
def login_test(self):
url = '/api/user/login'
data = {"userName":"xuyang@test.ai","password":"xy123456"}
headers = {"Content-Type": "application/json"}
self.client.request(method='POST', url=url, data=data, headers=headers, name='login登录')
HttpUser:控制用户发请求的频率、用户的思考时间、设置主机的IP地址、也可以定义任务
@task:@task用来标记哪个方法是任务,什么任务,我要做性能测试执行哪个接口
host:被测系统,你要发送请求到哪个服务器
wait_time:每次请求的间隔、停顿时间、思考时间
constant:为固定的思考时间,这里可以简单理解为固定定时器(只是wait_time的其中一种等待时间的方式,其它的可以自己研究一下)
描述:
1.创建一个User类FalshUser, 继承HttpUser,然后定义主机IP地址、思考时间;
2.在类下面编写一个测试接口,跟我们使用request类似,有个别区别;
3.用@task的方式进行定义任务,这个为什么要用task上面解释说了
4.接口方法内需要注意的点:
1)url只需要写路径即可,请求时自动拼接host;
2)发送请求的时候要用self.client.request去请求,并且增加method,和name两个入参,method就是请求方法、name就是接口名称;
3)self.client.request 它的发送请求跟我们常用的接口测试的request库非常类似,因为底层封装的就是request库;
运行描述:
打开你的Terminal,然后cd到你写的测试文件目录下,.py的文件;
运行命令:locust -f 测试文件.py;
回车运行,之后如果出现第一张图显示的那样,就证明运行成功了;
打开你的浏览器输入http://localhost:8089,回车就会打开第二张图显示的GUI的locust页面

locust页面字段解释:
Number of users to simulate:设置模拟的用户总数;
Hatch rate (users spawned/second):每秒启动的虚拟用户数;
host:就是你脚本内写的被测系统地址,打开页面后自动填入的;
Start swarming:开始运行性能测试;
输入模拟的用户总数、输入每秒启动的虚拟用户数,点击Start swarming即可运行
运行结果:



大概就是这样,可以看类似jmeter聚合报告一样的表格,和tps监测、IO监测、可以导出各种类型的测试报告
2.方式二(写在模块内
from locust import HttpUser, task, constant
@task
def my_self_api(user):
url = '/api/user/login'
data = {"userName":"xuyang@test.ai","password":"xy123456"}
headers = {"Content-Type": "application/json"}
# 可以通过user.去调用client
user.client.request(method='POST', url=url, data=data, headers=headers, name='login登录')
class FlashUser(HttpUser):
host = 'http://127.0.0.1:8080/' # 被测系统的地址
wait_time = constant(1) # 每次请求的间隔、停顿时间、LR里面叫做思考时间(constant为固定的思考时间)
tasks = [my_self_api]
描述:
跟方式一代码类似,把User类和任务方法剥离,单独写开,用户操作用FlashUser管理,方法单独管理;
其中任务类剥离后,需要传入一个user字段,我们需要在任务函数里面来通过HttpUser传入的实例self->user来进行调用请求,需要注意我们任务函数传入的这个user,这个user就是FlashUser对象本身,就是FlashUser的一个实例,user指的就是self,这个时候我们就可以通过user.client来请求接口;
tasks解释:定义测试的范围,而测试方法的定义,可以放在测试类的外部,也就说可以用包去管理测试的方法,而真正要测试的时候,引入业务包,然后配置tasks即可,所以[ ]内我传了我写的任务名称,就是说我要执行这个任务,不然User不知道执行谁;
运行方式参考方式一GUI模式运行
3.方式三(把任务写在任务集里面)
from locust import HttpUser, constant, task, TaskSet
class TaskApi(TaskSet):
@task(1)
def login1(self):
url = '/api/user/login'
data = {"userName": "xuyang@test.ai", "password": "xy123456"}
headers = {"Content-Type": "application/json"}
self.client.request(method='POST', url=url, json=data, headers=headers, name='login-登录接口1')
@task(2)
def login2(self):
url = '/api/user/login'
data = {"userName": "xuyang@test.ai", "password": "xy123456"}
headers = {"Content-Type": "application/json"}
self.client.request(method='POST', url=url, json=data, headers=headers, name='login-登录接口2')
class FlashUser(HttpUser):
host = 'http://127.0.0.1:8080/'
wait_time = constant(2)
tasks = [TaskApi]
描述:
TaskSet解释:任务集,所谓的任务集,我理解的就是我有很多的性能测试任务/接口,那么我可以把这些接口写在一个类里面,和User类剥离出来,用User类来控制用户数和条件去进行执行;
方式三我把任务方法做了升级,写了一个TaskApi类,通过继承TaskSet来管理我的任务,这个类我主要写一些测试任务,每个需要执行性能测试的任务用@task标记;
那么代码怎么知道哪个是任务集呢?用TaskSet,需要作为任务集的类TaskApi,继承TaskSet,这样User类就知道,这个是任务集的类;
@task(1)、@task(2)里面的数字是什么意思?@task用来标记哪个方法是任务,括号里面的数字,我理解的是任务权重,比如:1、2,那么可以理解为如果用户有9个,那么@task(1)执行3个,@task(2)执行6个;
关于self.client:当我们在任务集的类中去写发送请求的时候,会发现self.后会出现user,这个user就是User类的实例,也就是说User类让哪个任务去执行,它就会把它自己的对象传给任务本身,当然你可以不写self.user, 直接self.client,当我们写了self.client后,ctrl+鼠标左键点击client,进去client底层方法会发现,它底层封装的是self.user.client;
注意:以上三种方式在执行性能测试的任务的时候,凡是带@task的标签的任务都是是并行运行的、是无序的,而不是按照代码逻辑从上往下执行
4.方式四(SequentialTaskSet)
SequentialTaskSet:如果需要有序的,我们可以继承该方法来进行创建任务
"""按顺序运行"""
class SeqSupTech(SequentialTaskSet):
url = '/api/user/login'
data = {"userName": "xuyang@test.ai", "password": "xy123456"}
headers = {"Content-Type": "application/json"}
@task(1)
def login1(self):
self.client.request(method="POST", url=self.url, json=self.data, headers=self.headers, name='登录接口1')
@task(5)
def login2(self):
self.client.request(method="POST", url=self.url, json=self.data, headers=self.headers, name='登录接口2')
class RequestUser(HttpUser):
host = 'http://127.0.0.1:8080/'
wait_time = constant(2)
tasks = [SeqSupTech]
描述:
只需要在创建任务集的类的时候继承SequentialTaskSet,那么这个任务集在运行的时候就会按照上下组合的顺序根据权重进行执行,比如上面这段代码的@task(1)和@task(5),代表先执行login1,再执行login2,循环执行;
四、非GUI模式运行并生成Html报告
命令:
locust -f denom_chain_query.py --headless -u 1 -r 1 -t 1m --html locust_report.html
-f locust_test.py //代表执行哪一个压测脚本
--headless //代表无界面执行
-u 100 //模拟100个用户操作
-r 100 //每秒用户增长数
-t 10m //压测10分钟
--html report.html //html结果输出的文件路径名称,无需提前创建,自动生成
运行:
Html报告:


最后建议接口传参的name用英文的,不要汉字,容易乱码,这个问题有解决的,可以在评论区讲下,我也学习一下
相关文章:

Python实现性能测试(locust)
一、安装locustpip install locust -- 安装(在pycharm里面安装或cmd命令行安装都可)locust -V -- 查看版本,显示了就证明安装成功了或者直接在Pycharm中安装locust:搜索locust并点击安装,其他的第三方包也可以通过这种方式二、loc…...

【数论】试除法判断质数,分解质因数,筛质数
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 现已更新完KMP算法、排序模板,之…...

【C++】红黑树
文章目录红黑树的概念红黑树的性质特征红黑树结点的定义红黑树的插入操作情况1情况2情况3特殊情况代码实现红黑树的验证红黑树的删除红黑树和AVL树的比较红黑树的应用红黑树的概念 红黑树,是一种二叉搜索树,但是每一个结点都增加一个存储位表示结点的颜…...

【剧前爆米花--爪哇岛寻宝】进程的调度以及并发和并行,以及PCB中属性的详解。
作者:困了电视剧 专栏:《JavaEE初阶》 文章分布:这是关于进程调度、并发并行以及相关属性详解的文章,我会在之后文章中更新有关线程的相关知识,并将其与进程进行对比,希望对你有所帮助。 目录 什么是进程/…...

网络的瓶颈效应
python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm1001.2014.3001.5501 ❤ 网络的瓶颈效应 网络瓶颈,指的是影响网络传输性能及稳定性的一些相关因素,如网络拓扑结构,网线࿰…...

【C++进阶】四、红黑树(三)
目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入 五、红黑树的验证 六、红黑树与AVL树的比较 七、完整代码 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可…...

Spring——AOP切入点表达式和AOP通知类型
切入点:要进行增强的方法 切入点表达式:要进行增强的方法的描述式 第一种方法的本质是基于接口实现的动态代理(jdk) 第二种是基于cglib实现的动态代理 AOP切入点表达式 而需要加载多个切入点时,不可能每个切入点都写一个切入点表达式 例子 下面的代理描述的是匹配…...

Hadoop学习:Yarn
1.YARN介绍 一个通用的资源管理系统和调度平台 YARN不分配磁盘,由HDFS分配 相当于一个分布式的操作系统平台,为上层MR等计算程序提供运算所需要的资源(内存、CPU等) 2.YARN三大组件 不要忘记AppMaster,他是程序内部…...

Spring Data JPA
文章目录一、Spring Data基础概念二、JPA与JDBC的相同与不同之处三、Hibernate & JPA快速搭建1.添加依赖2.实体类3.hibernate的配置文件 ——hibernate.cfg.xml四、测试——基于hibernate的持久化(单独使用)五、测试——基于JPA的持久化(…...
java List报错Method threw ‘java.lang.UnsupportedOperationException‘ exception. 解决
问题描述:List使用Arrays.asList()初始化后,再add对象时报错:Method threw java.lang.UnsupportedOperationException exception.错误示例如下: List<ExportListVO.ExportSheet> sheetVOList Arrays.asList(new ExportList…...

数据结构-用栈实现队列
前言: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int…...
第十四章 从 Windows 客户端控制 IRIS
文章目录第十四章 从 Windows 客户端控制 IRISIRISctlGetDirsSyntaxReturn ValuesIRISctlConfigStatusSyntaxReturn ValuesIRISctlControlSyntaxReturn Values第十四章 从 Windows 客户端控制 IRIS IRIS 为 Windows 客户端程序提供了一种机制来控制 IRIS 配置并启动 IRIS 进程…...

数据结构---双链表
专栏:数据结构 个人主页:HaiFan. 专栏简介:从零开始,数据结构!! 双链表前言双链表各接口的实现为要插入的值开辟一块空间BuyLN初始化LNInit和销毁LNDestory打印链表中的值LNPrint尾插LNPushBack和尾删LNPop…...

Windows 环境安装Scala详情
为了进一步学习Spark,必须先学习Scala 编程语言。首先开始Scala 环境搭建。温馨提示:本文是基于Windows 11 安装Scala 2.13.1 版本第一步:确保本机已经正确安装JDK1.8 环境第二步:Scala 官网下载我们所属scala版本文件。Scala 官网…...

C++ Qt自建网页浏览器
C Qt自建网页浏览器如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!前言这篇博客针对<<C Qt自建网页浏览器>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。文…...

Flink从入门到精通系列(四)
5、DataStream API(基础篇) Flink 有非常灵活的分层 API 设计,其中的核心层就是 DataStream/DataSet API。由于新版本已经实现了流批一体,DataSet API 将被弃用,官方推荐统一使用 DataStream API 处理流数据和批数据。…...

Nginx 配置实例-反向代理案例一
实现效果:使用nginx反向代理,访问 www.suke.com 直接跳转到本机地址127.0.0.1:8080 一、准备工作 Centos7 安装 Nginxhttps://liush.blog.csdn.net/article/details/125027693 1. 启动一个 tomcat Centos7安装JDK1.8https://liush.blog.csdn.net/arti…...

为什么北欧的顶级程序员数量远超中国?
说起北欧,很多人会想到寒冷的冬天,漫长的极夜,童话王国和圣诞老人,但是如果我罗列下诞生于北欧的计算机技术,恐怕你会惊掉下巴。Linux:世界上最流行的开源操作系统,最早的内核由Linus Torvalds开…...

vuex getters的作用和使用(求平均年龄),以及辅助函数mapGetters
getters作用:派生状态数据mapGetters作用:映射getters中的数据使用:方法名自定义,系统自动注入参数:state,每一个方法中必须有return,其return的结果被该方法名所接收。在state中声明数据listst…...

20230311给Ubuntu18.04下的GTX1080M安装驱动
20230311给Ubuntu18.04下的GTX1080M安装驱动 2023/3/11 12:50 2. 安装GTX1080驱动 安装 Nvidia 驱动 367.27 sudo add-apt-repository ppa:graphics-drivers/ppa 第一次运行出现如下的警告: Fresh drivers from upstream, currently shipping Nvidia. ## Curren…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...