【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_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。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft

Microsoft Word目录1.目录编号与文字的间距设置2. 目录编号缩进设置 Excel函数MID(提取字符)CONCAT(组合字符串)EXACT(比较字符串) PowerPointwindows 11 恢复右键传统菜单 Word 目录 1.目录编号与文字的…

用 Python 处理 CSV 和 Excel 文件

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

JS后盾人--再一次的走进JS?

程序跑起来与避免延迟 如果你讲JS,你就不可能只讲JS 后盾人说开发就要用VScode(确实,Windows和Linux都可以跑) 然后就是第一天开发的时候装的那些插件 前端访问流程基本分析 托管到服务器上的东西,谁访问下载到谁的…

Android 调用系统服务接口获取屏幕投影(需要android.uid.system)

媒体投影 借助 Android 5(API 级别 21)中引入的 android.media.projection API,您可以将设备屏幕中的内容截取为可播放、录制或投屏到其他设备(如电视)的媒体流。 Android 14(API 级别 34)引入…

PT8M2102 触控型 8Bit MCU

1. 产品概述 PT8M2102 是一款基于 RISC 内核的 8 位 MTP 单片机,内部集成了电容式触摸感应模块、 TIMER 、 PWM、 LVR 、 LVD 、 WDT 等外设,其主要用作触摸按键开关,广泛适用于触控调光、电子玩具、消 费电子、家用电器等领域&am…

LangGraph 教程:初学者综合指南(2)

工具集成 将工具集成到 LangGraph 聊天机器人中可以显着增强其功能,使其能够按照您喜欢的方式访问和处理信息。 让我们修改上一节中创建的基本聊天机器人,以包含一个可以在网络上搜索信息的工具。我们将使用langchain_中community.tools TavilySearchR…

项目练习:若依管理系统字典功能-Vue前端部分

文章目录 一、情景说明二、若依Vue相关代码及配置1、utils代码2、components组件3、api接口代码4、main.js配置 三、使用方法1、html部分2、js部分 一、情景说明 我们在做web系统的时候,肯定会遇到一些常量选择场景。 比如,性别:男女。 状态…

oracle闪回表

文章目录 闪回表案例1:(未清理回收站时的闪回表--成功)案例2(清理回收站时的闪回表--失败)案例3:彻底删除表(不经过回收站--失败)案例4:闪回表之后重新命名新表总结1、删…

TensorFlow Quantum快速编程(基本篇)

一、TensorFlow Quantum 概述 1.1 简介 TensorFlow Quantum(TFQ)是由 Google 开发的一款具有开创性意义的开源库,它宛如一座桥梁,巧妙地将量子计算与 TensorFlow 强大的机器学习功能紧密融合。在当今科技飞速发展的时代,传统机器学习虽已取得诸多瞩目成就,然而面对日益…

K8s数据存储之详解(Detailed Explanation of K8s Data Storage)

K8s数据存储相关概念详解(临时存储,节点存储,网络存储,PV/PVC) 本篇文章分享一下存储卷和数据持久化的相关概念: 存储卷概述 临时存储卷(Ephemeral Volumes) 节点存储卷&#xff…

java求职学习day12

1 泛型机制(熟悉) 1.1 基本概念 (1)通常情况下集合中可以存放不同类型的元素,是因为将所有对象都看作Object类型放入,因此从集合中取出元素时,也是Object类型,为了表达该元素真实的…

相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化,两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的:乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于(…

Spring Boot 2 学习全攻略

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今快速发展的 Java 后端开发领域,Spring Boot 2 已然成为一股不可忽视的强大力量。它简化了 Spring 应用的初始搭建以及开发过程,让开发者能够更加专注于业务逻辑的实现&am…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法,主要考察开发经验与技术水平,回答不佳会影响面试印象。提供四个回答方向,准备其中一个方向即可。 1、设计模式应用方向 以登录为例,未…

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <1> 5分钟快速创建一个springboot web项目

快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…

【Rust自学】11.10. 集成测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.10.1. 什么是集成测试 在Rust里&#xff0c;集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样&#xff0c;这也…

JAVA实现2048小游戏(附源码)

文章目录 一、设计来源2048小游戏讲解1.1 主界面1.2 4*4难度界面1.3 5*5难度界面1.4 6*6难度界面1.5 挑战失败提示界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/a…

【自动化测试】—— Appium安装配置保姆教程(图文详解)

目录 一. 环境准备 二. JDK安装 1. 下载JDK 2. 安装JDK 3. 配置环境 4. 验证安装 三. Android SDK安装 1. 下载Android SDK 2. 安装Android SDK 3. 安装工具 4. 配置环境 5. 验证安装 四. NodeJS安装 1. 下载NodeJS 2. 安装NodeJS 3. 验证安装 4. 安装淘宝镜像…

vs2022+QT6.7.3打包程序流程

1、新建目录test 2、将项目配置为Release X64&#xff0c;生成XXX.exe 3、将XXX.exe放到test目录 4、管理员方式打开Qt 6.7.3 (MSVC 2022 64-bit)&#xff0c;进入test目录&#xff0c;执行&#xff1a;windeployqt6.exe XXX.exe 5、管理员方式打开x64 Native Tools Command…

RabbitMQ---消息确认和持久化

&#xff08;一&#xff09;消息确认 1.概念 生产者发送消息后&#xff0c;到达消费端会有以下情况&#xff1a; 1.消息处理成功 2.消息处理异常 如果RabbitMQ把消息发送给消费者后就把消息删除&#xff0c;那么就可能会导致&#xff0c;消息处理异常想要再获取这条消息的时…