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

news2025/1/15 16:45:10

文章目录

    • 一、什么是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_response
    
    app = 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 requests

def test_request():
    resp = requests.get(url="http://127.0.0.1:8080/")
    print(resp.json())
    assert resp.status_code == 200

if __name__ == '__main__':
    test_request()

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

接口测试结果

编写一个性能测试用例

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

首先,通过 pip 安装 Locust:

pip install locust

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

import locust

class 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。

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

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

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

相关文章

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注: Jaeger服务端版本为:jaegertracing/all-in-one-1.6.0 OpenTracing版本为:0.33.0,最后一个版本,停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为:jaeger-client-1.3.2。…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO(El Nio-Southern Oscillation)是全球气候系统中最显著的年际变率现象之一,对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来,深度学习技术在气象领域…

【IDEA 2024】学习笔记--文件选项卡

在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…

nginx的可视化配置工具nginxWebUI的使用

文章目录 1、nginx简介2、nginxWebUI2.1、技术解读2.2、开源版和专业版之间的区别2.3、功能解读 3、安装与使用3.1、下载镜像3.2、查看镜像3.3、启动容器3.4、使用 4、总结 1、nginx简介 Nginx 是一个高效的 HTTP 服务器和反向代理,它擅长处理静态资源、负载均衡和…

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行,这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟,但很多特性还得qt6才行,这里用qt5.14.2主要是考虑到服…

系统思考—全局思维

在一个复杂的企业中,无论是生产、营销、研发、产品还是采购,作为核心团队,大家不只关注单一的问题——需要从整体出发。企业是一个有机的整体,每一个环节都息息相关。如果只解决一个问题,却忽视了其他部分的相互作用&a…

软件设计师 - 第10章 网络与信息安全基础知识

网络概述 功能:数据通信,资源共享,管理集中化,实现分布式处理,负载均衡 分类:局域网,城域网,广域网 拓扑结构:总线型,星型,环型,树型,分布式 ISO/OSI七层模型: 应用层:提供与用户交互的界面,并支持特定应用程序的服务,FTP、Telnet、SMTP、NFS、SNMP、HTTP、…

记录一次Android Studio的下载、安装、配置

目录 一、下载和安装 Android Studio 1、搜索下载Android studio ​2、下载成功后点击安装包进行安装: 3、这里不用打勾,直接点击安装 : 4、完成安装: 5、这里点击Cancel就可以了 6、接下来 7、点击自定义安装&#xff1a…

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路 文章目录 1.前言2.思路2.1使用ELK收集日志2.1.1ELK搭建2.1.2项目中集成ELK日志收集2.1.2.1 引入依赖2.1.2.2 logback-xxx.xml配置2.1.2.3 yaml配置 2.2本文思路2.2.1书接上文--自…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量,路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了!

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们,技术图文创作很不容易…

相机SD卡照片数据不小心全部删除了怎么办?有什么方法恢复吗?

前几天,小编在后台友收到网友反馈说他在整理相机里的SD卡,原本是想把那些记录着美好瞬间的照片导出来慢慢欣赏。结果手一抖,不小心点了“删除所有照片”,等他反应过来,屏幕上已经显示“删除成功”。那一刻,…

《C++11》nullptr介绍:从NULL说起

在C11之前,我们通常使用NULL来表示空指针。然而,NULL在C中有一些问题和限制,这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中,NULL实际上是一个整数0,而不是一个真正的…

【搭建JavaEE】(2)Tomcat安装配置和第一个JavaEE程序

Tomcat–容器(Container) 下载 Apache Tomcat - Welcome! 下载完成 请求/响应 结构 测试 查看Jdk版本 改端口号localhost8080–>8099 学学人家以后牛逼了可以用自己名字当文件夹名 配置端口8099 找到server文件 用记事本打开 再打开另一个logging文件 ”乱码解决“步骤&…

​​​​​​​​​​​​​​★3.3 事件处理

★3.3.1 ※MouseArea Item <-- MouseArea 属性 acceptedButtons : Qt::MouseButtons containsMouse : bool 【书】只读属性。表明当前鼠标光标是否在MouseArea上&#xff0c;默认只有鼠标的一个按钮处于按下状态时才可以被检测到。 containsPress : bool curs…

【C】初阶数据结构3 -- 单链表

之前在顺序表那一篇文章中&#xff0c;提到顺序表具有的缺点&#xff0c;比如头插&#xff0c;头删时间复杂度为O(n)&#xff0c;realloc增容有消耗等。而在链表中&#xff0c;这些问题将得到解决。所以在这一篇文章里&#xff0c;我们将会讲解链表的定义与性质&#xff0c;以及…

Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)

一、函数基础 1.1、函数的用法和底层分析 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;更能实现代码的一致性。一致性指的是&#xff0c;只要修改函数的代码&#xff0c;则所有调用该函数的地方都能得到体现。 在编写函数时&#xf…

《leetcode-runner》如何手搓一个debug调试器——架构

本文主要聚焦leetcode-runner对于debug功能的整体设计&#xff0c;并讲述设计原因以及存在的难点 设计引入 让我们来思考一下&#xff0c;一个最简单的调试器需要哪些内容 首先&#xff0c;它能够接受用户的输入 其次&#xff0c;它能够读懂用户想让调试器干嘛&#xff0c;…

食堂采购系统源码:基于PHP的校园食堂供应链管理平台开发全解析

传统的食堂采购管理普遍存在信息不透明、流程繁琐、效率低下等问题&#xff0c;这使得开发一款高效、智能的食堂采购系统变得尤为重要。本篇文章&#xff0c;笔者将详细解析基于PHP开发的校园食堂供应链管理平台&#xff0c;从功能设计、系统架构到技术实现&#xff0c;全方位剖…

WEB 攻防-通用漏-XSS 跨站脚本攻击-反射型/存储型/DOMBEEF-XSS

XSS跨站脚本攻击技术&#xff08;一&#xff09; XSS的定义 XSS攻击&#xff0c;全称为跨站脚本攻击&#xff0c;是指攻击者通过在网页中插入恶意脚本代码&#xff0c;当用户浏览该网页时&#xff0c;恶意脚本会被执行&#xff0c;从而达到攻击目的的一种安全漏洞。这些恶意脚…