当前位置: 首页 > news >正文

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

文章目录

    • 一、什么是Locust
    • 二、Locust 架构组成
    • 三、实战 Demo
      • 准备一个可调用的接口
      • 编写一个接口测试用例
      • 编写一个性能测试用例
      • 执行性能测试用例代码
        • 1、通过 Web UI 执行(GUI模式)
        • 2、通过命令行执行(非GUI模式)
    • 小知识:工具对比

连续文章教学,链接如下

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

【Python】Python之locust压测教程+从0到1demo:高阶轻量级压测实战+常用参数详解(2)

一、什么是Locust

Locust 是一个开源的、基于 Python 的分布式负载测试工具,用于测试网站、Web 应用程序和API的性能和可扩展性。它通过模拟大量并发用户访问目标系统,帮助开发者和测试人员识别系统在高负载下的表现和潜在瓶颈。

Python之locust官方文档:https://docs.locust.io/

二、Locust 架构组成

  1. 纯 Python 编写:Locust 使用 Python 编写测试用例,灵活且易于维护。
  2. HTTP 请求:它是基于 requests 库发送 HTTP 请求。
  3. 协程运行:locust是使用协成运行的,用更低的成本实现更多的并发。并且是基于gevent实现的。
  4. 分布式支持:支持分布式,支持更多的压力测试
  5. Web UI:内置了 Web UI,可通过浏览器进行控制和监控。
  6. 插件扩展:我们可以用第三方的插件,进行扩展。

结论:如果你使用 Python 进行接口测试(尤其是使用 requests 进行接口测试的),那么就优先考虑使用 Locust 进行接口性能测试,因为更方便。

三、实战 Demo

我实现的demo是从0到1的。所以是从接口测试用例,转变成性能测试用例的一个过程。请注意看下面的内容。

准备一个可调用的接口

如果有可调用的接口,那么可以忽略这一步。

  1. 安装 Flask:

    pip install flask
    
  2. 编写并运行以下代码,创建一个简单的登录接口:

    from flask import Flask, make_responseapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])
    def run():res = {'code': 0,'msg': "OK",'data': {'test': '测试页面'}}return make_response(res)if __name__ == '__main__':app.run(host='0.0.0.0', port=8080, debug=False, threaded=True)
    

运行后,将生成一个可访问的接口。下面我们将会用这个接口去进行接口性能测试。

接口运行截图

编写一个接口测试用例

使用 requests 调用刚才创建的接口,并编写一个简单的测试用例:

import requestsdef test_request():resp = requests.get(url="http://127.0.0.1:8080/")print(resp.json())assert resp.status_code == 200if __name__ == '__main__':test_request()

运行测试用例,如果没有报错,说明接口正常。

接口测试结果

编写一个性能测试用例

为了更好的演示和理解,所以我们准备将上面的接口测试用例,转换成locust的性能测试用例,如下:

首先,通过 pip 安装 Locust:

pip install locust

将上述测试用例转换为 Locust 的性能测试用例如下:

import locustclass MyUser(locust.HttpUser):  # 1、在类中继承locust.HttpUser的子类,也就是创建这个子类# 4、添加locust给我们提供的函数between,里面1和2的值代表着每个task间隔1到2秒wait_time = locust.between(1, 2)@locust.task  # 2、添加一个装饰器,表明这是性能测试用例def test_request(self):resp = self.client.get(url="http://127.0.0.1:8080/")  # 3、使用self.client去发送请求print(resp.json())assert resp.status_code == 200

转变步骤说明

  1. 创建一个类,继承 locust.HttpUser
  2. 使用 @locust.task 装饰器标识性能测试用例。
  3. 使用 self.client.get或者post 发送请求。
  4. 设置 wait_time = locust.between(1, 2) 添加locust给我们提供的函数between,里面1和2的值代表着每个task间隔1到2秒,相当于每个测试用例的间隔

执行性能测试用例代码

执行性能测试用例,有两种执行方式:

1、通过 Web UI 执行(GUI模式)

通过webUI来执行主要就是简洁方便,可以出具绘制图表来展示。但webUI也有一个小弊端,那就是制作的图表会浪费一些性能,因为制作图表的时候会实时获取数据,这也是浪费性能的原因。

  1. 在终端运行 Locust 命令:

    locust -f 用例名称.py
    

    Locust 启动截图

  2. 打开浏览器访问 Web UI(通常为 http://0.0.0.0:8089)。

    Locust Web UI

  3. 配置测试参数:

    • Number of users (peak concurrency):模拟的并发用户数,例如 1000。
    • Ramp up (users spawned/second):用户启动速率。比如:我们选择了1000个用户,如果我们这里填写10,也就代表着每秒有10个用户在调用 。
    • Host:做过接口测试的同学都知道,就是填写接口的url。但是我们在性能测试用例中已经写了URL,那么这个就无所谓了。写不写都可以,所以我们就随便写个1(写1的原因是因为这个为空的话会报错,也算是一个bug)
    • Run time:测试运行时间,例如 120s 表示运行2分钟。如果要一直运行那就不写。

    配置参数

  4. 我们可以在 STATISTICS里面看到测试结果。
    在这里插入图片描述

性能测试结果分析
(1)请求总数与失败数:
总请求数为 29293,失败请求数为 18071,失败率较高,为62%。这表明接口在高负载下的稳定性较差,需要开发去调查失败的原因。
(2)响应时间:
中位数响应时间为 70 ms,平均响应时间为 802.74 ms。中位数响应时间相对较低,说明大部分请求的响应时间较快,但平均响应时间较高,可能是因为有少数请求的响应时间过长导致的。
95% 和 99% 的响应时间分别为 6300 ms 和 8900 ms,表明有 5% 和 1% 的请求响应时间超过了这些阈值,可能影响用户体验。
(3)最小值与最大值:
最小响应时间为 2 ms,最大响应时间为 10134 ms,最大响应时间的差异较大,说明在某些情况下,接口的响应时间会非常慢。
(4)数据大小与吞吐量:
平均数据大小为 24.9 字节,当前每秒请求数 (RPS) 为 300.1,当前故障数为 300.1。吞吐量表现良好,但由于高失败率,实际可用的吞吐量是受到影响的。

性能参数描述
Type请求类型,如Get/Post
Name请求路径
Requests当前请求数量
Failes请求失败数量
Median中间值毫秒,一半的服务器响应低于该值,还有一半高于该值
95%95%的请求响应时间
Average平均值,单位毫秒,所有请求平均响应时间
Min请求的服务器最小响应时间
Max请求的服务器最大响应时间
Average size单个请求大小,字节
RPS每秒能处理的请求数目
  1. 运行测试后,可以在 CHARTS 页面查看实时数据。

    测试结果

    RPS(吞吐量):349.7
    最大用户数:600

    结论:通过这个数据我们可以看到,如果每秒有600用户去访问我们的接口。那么我们的服务器是承载不了的,也就是说我们可以让600人同时在线。但是我们无法让349.7个用户,不能在同一时间都得到结果。

  2. 异常信息:测试接口拒绝连接,表明服务器崩溃。
    故障率

  3. 代码异常:这代表接口用例执行失败抛出的异常。我们可以在后台看到,也可以在webUI内看到。
    异常信息

2、通过命令行执行(非GUI模式)

使用命令行来执行,就不会有页面和图表出现。所以会充分利用性能来进行测试接口。

常用的启动命令+参数

locust -f 性能接口测试用例.py --headless -u 1000 -r 10 --host=1 --run-time 120s

locust -f 性能接口测试用例.py:启动命令
--headless:无头参数,非GUI模式
-u 1000:代表1000个用户
-r 10:代表每秒10个用户递增
--host=1:就是填写的url,因为我们代码内置了,所以就随便写个1(为什么写1,是因为不写会报错)
-t或者--run-time 120s:就是运行的时长,运行120秒

启动之后的结果如下(我改成了5秒直接看结果):
在这里插入图片描述

小知识:工具对比

工具区别
JMeter需要在 UI 界面上通过选择组件来“编写”脚本,模拟的负载是线程绑定的,意味着每个用户需要一个单独的线程。单台负载机可模拟的负载数有限。
Locust通过编写简单易读的代码完成测试脚本,基于事件驱动,同样配置下,单台负载机可模拟的负载数远超 JMeter。

如果您觉得本文对您有帮助,欢迎点赞、收藏和分享!有任何疑问或建议,欢迎在评论区留言讨论。

相关文章:

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

文章目录 一、什么是Locust二、Locust 架构组成三、实战 Demo准备一个可调用的接口编写一个接口测试用例编写一个性能测试用例执行性能测试用例代码1、通过 Web UI 执行(GUI模式)2、通过命令行执行(非GUI模式) 小知识:…...

【JavaScript】基础内容,HTML如何引用JavaScript, JS 常用的数据类型

HTML 嵌入 Javascript 的方式 引入外部 js 文件 <head> <script Language "javaScript" src"index.js"/> </head>内部声明 <head> <script language"javascript">function hello(){alert("hello word&qu…...

vue使用自动化导入api插件unplugin-auto-import,避免频繁手动导入

‌unplugin-auto-import‌是一个现代的自动导入插件&#xff0c;旨在简化前端开发中的导入过程&#xff0c;减少手动导入的繁琐工作&#xff0c;提升开发效率。它支持多种构建工具&#xff0c;包括Vite、Webpack、Rollup和esbuild&#xff0c;并且可以与TypeScript配合使用&…...

在 C# 中的Lambda 表达式

在 C# 中&#xff0c;Lambda 表达式是用来定义匿名函数的一种简洁方式&#xff0c;通常用于简化代码&#xff0c;尤其是在 LINQ 查询、事件处理或方法作为参数的场景中。Lambda 表达式的语法如下&#xff1a; 基本语法 (parameters) > expression_or_statement_blockparam…...

奉加微PHY6230兼容性:部分手机不兼容

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

32单片机综合应用案例——基于GPS的车辆追踪器(三)(内附详细代码讲解!!!)

困难不会永远存在&#xff0c;只要你勇于面对&#xff0c;坚持努力&#xff0c;就一定能够战胜一切困难。每一次挑战都是一次成长的机会&#xff0c;不要害怕失败&#xff0c;失败是成功之母。只有经历过失败&#xff0c;你才能更加明白自己的不足&#xff0c;并不断改进自己&a…...

45_Lua模块与包

Lua中的模块系统是该语言的一个重要特性,它允许开发者将代码分割成更小、更易于管理的部分。通过使用模块,你可以创建可重用的代码片段,并且可以降低代码间的耦合度。下面我将详细介绍Lua模块的基本概念、语法以及一些实际案例。 1.Lua模块 1.1 模块的基本概念 从Lua 5.1…...

深度学习电影推荐-CNN算法

文章目录 前言视频演示效果1.数据集环境配置安装教程与资源说明1.1 ML-1M 数据集概述1.1.1数据集内容1.1.2. 数据集规模1.1.3. 数据特点1.1.4. 文件格式1.1.5. 应用场景 2.模型架构3.推荐实现3.1 用户数据3.2 电影数据3.3 评分数据3.4 数据预处理3.5实现数据预处理3.6 加载数据…...

【Git 】探索 Git 的魔法——git am 与补丁文件的故事

在日常的开发协作中&#xff0c;你可能会遇到这样的场景&#xff1a;某位热心的小伙伴发来一份 .patch 文件&#xff0c;让你把某个问题修复合并到项目中。如果你不知道如何优雅地接收并应用这份补丁&#xff0c;那么这篇文章就是为你准备的&#xff01;让我们一起揭开 Git 的“…...

G1原理—5.G1垃圾回收过程之Mixed GC

大纲 1.Mixed GC混合回收是什么 2.YGC可作为Mixed GC的初始标记阶段 3.Mixed GC并发标记算法详解(一) 4.Mixed GC并发标记算法详解(二) 5.Mixed GC并发标记算法详解(三) 6.并发标记的三色标记法 7.三色标记法如何解决错标漏标问题 8.SATB如何解决错标漏标问题 9.重新梳…...

机器人传动力系统介绍

电驱动系统 无框力矩电机减速器&#xff1a;优点是功率密度高&#xff0c;可在有限空间产生大扭矩&#xff0c;使机器人关节运动有力灵活&#xff0c;如人形机器人四肢运动。缺点是系统复杂&#xff0c;成本高&#xff0c;减速器会降低传动效率.空心杯电机行星滚柱丝杆&#x…...

1161 Merging Linked Lists (25)

Given two singly linked lists L1​a1​→a2​→⋯→an−1​→an​ and L2​b1​→b2​→⋯→bm−1​→bm​. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1​→a2​→bm​→a3​→a4​→bm−1​⋯. For ex…...

内联变量(inline variables):在多个文件中共享全局常量

在 C17 中&#xff0c;引入了 内联变量&#xff08;inline variables&#xff09; 的概念&#xff0c;可以用于在多个文件中共享全局常量。内联变量允许在头文件中定义变量&#xff0c;而不会导致链接错误&#xff08;如重复定义&#xff09;。这种方式非常适合用于定义跨多个文…...

Jmeter进行http接口并发测试

目录&#xff1a; 1、Jmeter设置&#xff08;1&#xff09;设置请求并发数&#xff08;2&#xff09;设置请求地址以及参数&#xff08;3&#xff09;添加结果数 2、启动看结果 1、Jmeter设置 &#xff08;1&#xff09;设置请求并发数 &#xff08;2&#xff09;设置请求地址…...

力扣解题汇总_JAVA

文章目录 数学_简单13_罗马数字转整数66_ 加一9_回文数70_爬楼梯69_x的平方根509_斐波那契数列2235_两整数相加67_二进制求和415_字符串相加2413_最小偶倍数2469_温度转换704_二分查找(重点) 数组_简单1_两数之和88_合并两个有序数组 链表_简单21_合并两个有序链表203_移除链表…...

ubuntu下安装编译cmake,grpc与protobuf

文章目录 install cmakeinstall grpcinstall protobuf注 install cmake sudo apt-get install -y g make libssl-devcd third_party/cmake-3.17.2./configuresudo make && make installcmake --version install grpc $ sudo apt-get install -y build-essential auto…...

SQL Prompt 插件

SQL Prompt 插件 注&#xff1a;SQL Prompt插件提供智能代码补全、SQL格式化、代码自动提示和快捷输入等功能&#xff0c;非常方便&#xff0c;可以自行去尝试体会。 1、问题 SSMS&#xff08;SQL Server Management Studio&#xff09;是SQL Server自带的管理工具&#xff0c…...

知识图谱抽取分析中,如何做好实体对齐?

在知识图谱抽取分析中&#xff0c;实体对齐是将不同知识图谱中的相同实体映射到同一表示空间的关键步骤。为了做好实体对齐&#xff0c;可以参考以下方法和策略&#xff1a; 基于表示学习的方法&#xff1a; 使用知识图谱嵌入技术&#xff0c;如TransE、GCN等&#xff0c;将实体…...

【Python通过UDP协议传输视频数据】(界面识别)

提示&#xff1a;界面识别项目 前言 随着网络通信技术的发展&#xff0c;视频数据的实时传输在各种场景中得到了广泛应用。UDP&#xff08;User Datagram Protocol&#xff09;作为一种无连接的协议&#xff0c;凭借其低延迟、高效率的特性&#xff0c;在实时性要求较高的视频…...

【伪随机数】关于排序算法自测如何生成随机数而引发的……

以 Random 开始 可能一开始&#xff0c;你只是写到了排序算法如何生成随机数 public static void main(String[] args) {Random random new Random();int[] nums new int[10];for (int i 0; i < nums.length; i) {nums[i] random.nextInt(100);}System.out.println(&q…...

核密度估计(Kernel Density Estimation, KDE)是一种非参数统计方法

一、核密度估计 核密度估计&#xff08;Kernel Density Estimation, KDE&#xff09;是一种非参数统计方法&#xff0c;用于估计随机变量的概率密度函数。它通过将每个数据点周围的核函数叠加&#xff0c;生成平滑的密度曲线。以下是其核心要点&#xff1a; 1. 基本概念 非参…...

【k8s面试题2025】2、练气初期

在练气初期&#xff0c;灵气还比较稀薄&#xff0c;只能勉强在体内运转几个周天。 文章目录 简述k8s静态pod为 Kubernetes 集群移除新节点&#xff1a;为 K8s 集群添加新节点Kubernetes 中 Pod 的调度流程 简述k8s静态pod 定义 静态Pod是一种特殊类型的Pod&#xff0c;它是由ku…...

栈溢出原理

文章目录 前言一、基本示例二、分析栈1. 先不考虑gets函数的栈情况2. 分析gets函数的栈区情况 三、利用栈1. 构造字符串2. 利用漏洞 前言 栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数&#xff0c;因而导致与其相邻的栈中的变量的值被改变。…...

Jmeter如何进行多服务器远程测试

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单…...

2.slf4j入口

文章目录 一、故事引入二、原理探究三、SLF4JServiceProvider四、总结 一、故事引入 故事要从下面这段代码说起 public class App {private static final Logger logger LoggerFactory.getLogger(App.class);public static void main( String[] args ) throws Exception {lo…...

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…...

软件测试—接口测试面试题及jmeter面试题

一&#xff0c;接口面试题 1.接口的作用 实现前后端的交互&#xff0c;实现数据的传输 2.什么是接口测试 接口测试就是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换、传递和控制管理过程&#xff0c;以及相互逻辑关系 3.接口测试必要性 1.可以发现很…...

图论的起点——七桥问题

普瑞格尔河从古堡哥尼斯堡市中心流过&#xff0c;河中有小岛两座&#xff0c;筑有7座古桥&#xff0c;哥尼斯堡人杰地灵&#xff0c;市民普遍爱好数学。1736年&#xff0c;该市一名市民向大数学家Euler提出如下的所谓“七桥问题”&#xff1a; 从家里出发&#xff0c;7座桥每桥…...

嵌入式开发通讯协议大全(在写中)

目录 modbus RTU通讯协议&#xff1a; pmbus通讯协议&#xff1a; modbus RTU通讯协议&#xff1a; 主要应用功能&#xff1a; 规范了软件变量&#xff0c;访问功能码&#xff0c;给不同工程师开发的不同产品有统一的通讯标准 帧结构简单&#xff0c;占用带宽少&#xff0c…...

webpack 4 升级 webpack 5

升级至最新的 webpack 和 webpack-cli npm run build 报错&#xff0c; unknown option -p 解决方案&#xff1a; 改成 --mode production npm run build 报错 unknown option --hide-modules 解决方案&#xff1a;直接移除 npm run build 报错&#xff1a;TypeError: Cannot a…...