性能测试【Locust】基本使用介绍

一.前言

Locust是一款易于使用的分布式负载测试工具,基于事件驱动,使用轻量级执行单元(如协程)来实现高并发。

二.基本使用

以下是Locust性能测试使用的一个基础Demo示例,该示例有安装Locust、编写测试脚本、启动测试以及监控测试结果。

1. 安装Locust

首先,你需要在你的机器上安装Locust。最简单的方式是使用pip命令进行安装:

pip install locust

如果你打算在多个进程或机器上分布式运行Locust,建议也安装pyzmq库:

pip install pyzmq

2. 编写测试脚本

编写一个Locust测试脚本。Locust测试脚本通常包含至少两个类:一个继承自TaskSet的类用于定义用户行为,另一个继承自HttpLocust(或Locust,如果你不使用HTTP)的类用于设置用户属性和任务集。

以下是一个简单的Locust测试脚本示例,它模拟了用户访问网站首页和关于页面的行为:

import osfrom locust import task, between, TaskSet, HttpUserclass WebsiteTasks(TaskSet):token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.eyJza2V5IjoiZmQ2MTZiYjJjYTBlMmEwOGM5YTEwNmFlYzViYzY2ZGM0MmYxNmIzNDAyMzg3MzhhNzVhYmIzYjkwZjg0MmI1OSIsIm53X3VpZCI6ImUwZjBjMDZjLTdmMmYtNDRhMi1hZjQzLTU5YmEyYmY1MDU3YiJ9.Ip_iP_ZQwcsuigTTMKxlYVEbdC84oqsNzE-c1lPkcVA"@taskdef query_user_data(self):payload = {"conditions": {"keyword": "","sort": {"name": "create_time","order_by": "desc"},"start_time": "2024-06-01 00:00:00","end_time": "2025-05-26 00:00:00"},"page": 1,"pagesize": 10,"skey": ""}headers = {"Authorization": self.token,# 其他可能的请求头}# 发送POST请求到登录API,并设置name以便在报告中区分self.client.post("http://localhost:8080/user/search",json=payload,headers=headers,name="user")# @task# def query_answer(self):#     payload = {#         "query": "什么是年度?",#         "task_ids": ["ae62cf79-5870-49f0-94ca-6580b94b6e05"],#         "top_k": 3,#         "score_threshold": 0.5,#         "answer_source": ""#     }#     # headers = {#     #     "Authorization": self.token,#     #     # 其他可能的请求头#     # }#     # 发送POST请求到登录API,并设置name以便在报告中区分#     self.client.post("http://localhost:8080/search_answer",#                      json=payload,#                      name="query_answer")# 定义用户类
class WebsiteUser(HttpUser):tasks = [WebsiteTasks]  # 将用户行为关联到用户类wait_time = between(1, 2)  # 设置用户执行任务的等待时间# 注意:
# 1. 每个@task装饰的方法都代表一个用户可能执行的任务。
# 2. self.client是一个HttpSession实例,你可以使用它来发送HTTP请求。
# 3. name参数是可选的,但它对于Locust生成的报告非常有用,因为它允许你区分不同类型的请求。
# 4. weight参数用于调整任务之间的执行比例(默认是1)。# 运行Locust压测
# 1. 保存上述脚本为locustfile.py(或任何你喜欢的名字)。
# 2. 打开命令行或终端,导航到包含该脚本的目录。
# 3. 运行`locust -f locustfile.py`来启动Locust的Web界面。
# 4. 在浏览器中打开Locust的Web界面(默认是http://localhost:8089),设置用户数和孵化率,然后开始压测。

3. 启动Locust

安装并编写好测试脚本后,你可以通过命令行启动Locust。在命令行中,使用以下命令启动Locust的Web界面:

locust -f locustfile.py

这里的-f选项后面跟的是你的测试脚本文件名。启动后,Locust会在本地启动一个Web服务器(默认端口为8089),你可以通过浏览器访问http://127.0.0.1:8089来设置并发用户数、每秒启动的用户数等参数,并启动测试。
在这里插入图片描述

  • Number of users :压力测试的用户总量,如上面的100
  • Spawn rate:每秒增加的用户量,从10开始增加直到用户总量数停止。
  • Host:被测接口的域名或IP端口地址(带http://或者https://)

设置好参数后,点击Start按钮,开始测试,各个页面信息介绍如下。

4. 监控测试结果

在Locust的Web界面中,你可以实时看到测试的统计数据,包括每秒完成的请求数(RPS)、平均响应时间、失败率等。你可以根据这些数据来评估你的系统的性能表现。

在这里插入图片描述
顺便介绍几个概念:

  • PV是指页面被浏览的次数,比如你打开一网页,那么这个网站的PV就算加了一次;
  • TPS是每秒内的事务数,比如执行了DML操作,那么相应的TPS会增加;
  • QPS是指每秒内查询次数,比如执行了SELECT操作,相应的QPS会增加。

Charts分为三个部分,分别是:

  • Total Requests per Second: 展示随着用户的增加,TPS变化数。
  • Response Times(ms): 展示接口从开始压测,到稳定实时的响应时间,随着压力增加,一般会升高。
  • Number of Users: 展示从0开始,每秒增加10人,直到总数100后不再增加。

5. 命令行模式

除了Web界面外,Locust还支持命令行模式,允许你直接在命令行中运行测试并查看结果。例如:

locust -f locustfile.py --no-web -c 10 -r 2 -t 10m

这个命令表示以命令行模式运行测试,设置并发用户数为10,每秒启动2个用户,测试运行时间为10分钟。

三.总结

优势

  • 可编程性:Locust使用Python,这意味着你可以编写Python脚本来定义复杂的用户行为,利用Python的强大库资源。
  • 轻量级且易于安装:Locust是一个相对轻量级的工具,安装过程简单方便。
  • Web界面:提供一个易于使用的web界面用于启动测试、实时查看测试结果和统计信息。
  • 可扩展性:支持分布式测试,你可以很容易地通过增加更多的Slave节点来模拟数十万甚至数百万的并发用户。
  • 实时统计:通过Web UI,Locust能够实时展示请求统计、响应时间图表等数据,使结果分析更为直观。
  • 适用性广:可以用来测试网站、API、数据库等多种服务的性能。

局限性

  • 性能问题:虽然Locust本身是高效的,但它运行Python脚本,这可能不如一些编译语言(如C++或Go)编写的测试工具性能高。
  • 资源消耗:在模拟非常高的并发用户数时,Locust(特别是运行Locust的机器)可能会消耗大量的CPU和内存资源。
  • 学习曲线:对于那些不熟悉Python的用户来说,初学Locust可能会有一定的学习曲线。
  • 对高级负载模式的支持有限:虽然Locust非常灵活,但在一些非常特定的负载测试场景(如具有复杂的用户会话管理或定制的网络协议)中,可能需要进行相当多的自定义编码。
  • 社区和支持:尽管Locust有一个活跃的社区,但与某些更成熟的压力测试工具相比(如Jmeter),其用户基础和可用资源可能较少。

总的来说,Locust是一个功能强大且灵活的负载测试工具,特别适合那些熟悉Python并希望快速构建和执行实时监控负载测试的开发者和测试人员。然而,每个工具都有其优势和局限性,选择合适的工具应基于具体的测试需求和场景。
以上就是Locust性能测试使用的一个基础Demo示例。Locust的强大之处在于它的易用性和高并发能力,使得性能测试变得更加简单和高效。你可以根据自己的需求编写更复杂的测试脚本,以模拟更多的用户行为和场景。希望对你有所帮助!

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

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

相关文章

王者荣耀改重复名(java源码)

王者荣耀改重复名 项目简介 “王者荣耀改重复名”是一个基于 Spring Boot 的应用程序,用于生成王者荣耀游戏中的唯一名称。通过简单的接口和前端页面,用户可以输入旧名称并获得一个新的、不重复的名称。 功能特点 生成新名称:提供一个接口…

【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】

目录 引言软件要求启动虚拟机环境设置禁用地址空间布局随机化(ASLR)设置编译器标志以禁用安全功能 概述BOF.ctestShellCode.ccreateBadfile.c 开始利用漏洞在堆栈上查找返回地址 实验2的作业 之前有写过一个 博客,大家可以先看看栈溢出基础。…

redis的基础数据结构-list列表

文章目录 1. redis的list数据结构1.1. list结构的特性1.2. 常用命令 2. 常见业务场景2.1 消息队列案例讲解背景优势解决方案代码实现 2.2 排行榜案例讲解背景优势解决方案代码实现 3. 注意事项: 1. redis的list数据结构 参考链接:https://mp.weixin.qq.…

Java面试篇基础部分-Java创建线程详解

导语   多线程的方式能够在操作系统的多核配置上更好的利用服务器的多个CPU的资源,这样的操作可以使得程序运行起来更加高效。Java中多线程机制提供了在一个进程内并发去执行多个线程,并且每个线程都并行的去执行属于线程处理的自己的任务,这样可以提高程序的执行效率,让…

【算法】-单调队列

目录 什么是单调队列 区域内最大值 区域内最小值 什么是单调队列 说到单调队列,其实就是一个双端队列, 顾名思义,单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增(或递减)。「队列」指…

2.5 ADC模数转换

文章目录 ADC(Analog-Digital Converter)模拟-数字转换器AD转换的步骤 与 时间stm32ADC的转换模式 ADC框图stm32的ADC引脚配置stm32ADC的步骤 ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转…

c#引用同一命名空间下的其他类

总体结构 Class1的内容 using System.Windows.Forms; namespace demo1 {internal class Class1{public class HelperClass{public void DoSomething(){MessageBox.Show("Doing something useful..."); } }} }Class2的内容 using System.W…

【C++ Primer Plus习题】16.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> #inc…

基于YOLO V8的学生上课行为检测系统【python源码+Pyqt5界面+数据集+训练代码】有报告

目的是利用YOLOV8这一先进的深度学习技术&#xff0c;开发一个自动化的学生上课行为检测系统。通过对上课行为数据集进行深入分析和标注&#xff0c;我们训练了YOLOV8模型&#xff0c;使其能够精确识别学生在课堂上的各种行为状态。这一系统能够实时监控并分析学生的行为&#…

Ruoyi Cloud K8s 部署

参考 https://blog.csdn.net/Equent/article/details/137779505 https://blog.csdn.net/weixin_48711696/article/details/138117392 https://zhuanlan.zhihu.com/p/470647732 https://gitee.com/y_project/RuoYi-Cloud https://blog.csdn.net/morecccc/article/details/1…

北大领衔:多智能体研究登上Nature子刊

这篇笔记可以作为接EoT那篇笔记内容中某种思想内涵的延伸和实践&#xff0c;即均是将智能体之间的关系描述为一种拓扑连接结构下的网络化关系进行研究&#xff08;贴近物理世界更加真实、自然、客观的拓扑结构&#xff09;&#xff0c;在这项研究中&#xff0c;更多的扩展到大规…

关于 vue/cli 脚手架实现项目编译运行的源码解析

1.vue项目运行命令解析 在日常开发中&#xff0c;vue 项目通过vue-cli-service脚手架包将项目运行起来&#xff0c;常用的命令例如&#xff1a; npm run serve npm run build 上述执行命令实际一般对应为项目中 package.json 文件的 scripts属性中编写的脚本命令&#xff0c;在…

解码3D数字人及AIGC产品,如何赋能医美行业全场景业务增长

9月13日&#xff0c;第六届“医美小小聚”暨医美信息与服务创新发展大会在热烈的氛围中拉开帷幕。此次盛会汇聚了医美行业的顶尖精英与前瞻者&#xff0c;他们围绕“聚焦营销&#xff0c;合规增长&#xff0c;融合共创”的主题&#xff0c;深入剖析了行业的新趋势、新机遇与新挑…

【JUC并发编程系列】深入理解Java并发机制:Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)1. 虚拟机环境2. 基本数据类型占多少字节3. JVM对象头3.1 Klass Pointer3.2 实例属性3.3 对齐填充3.4 查看Java对象布局3.5 论证压缩效…

LeetCode 热题 100 回顾13

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

通信工程学习:什么是TDMA时分多址

TDMA时分多址 TDMA&#xff08;Time Division Multiple Access&#xff0c;时分多址&#xff09;是一种在无线通信中广泛使用的多址接入技术。它通过将时间划分为不重叠的时间帧&#xff0c;并将每个时间帧进一步划分为多个时隙&#xff0c;每个时隙分配给不同的用户或通信系统…

第J3周:DenseNet算法实战与解析(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f4cc; 本周任务&#xff1a; ●1.请根据本文 Pytorch 代码&#xff0c;编写出相应的 TensorFlow 代码&#xff08;建议使用…

Apple M3编译MAVSDK安卓平台SO库

1.克隆MAVSDK源码: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编写Shell脚本用于生成Android平台makefile: 生成前,先编译并安装OpenSSL: Apple M3编译OpenSSL安卓平台SO库-CSDN博客 注释掉openssl自动编译,位于third_party/CMakeLists.txt下

自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(七、CILQR约束条件下的ILQR求解)

&#xff08;七&#xff09;CILQR约束条件下的ILQR求解 CILQR&#xff08;(Constrained Iterative Linear Quadratic Regulator)&#xff09; 是为了在 iLQR 基础上扩展处理控制输入和状态约束的问题。在这种情况下&#xff0c;系统不仅要优化控制输入以最小化代价函数&#x…

GD32F4开发 -- FreeRTOS移植

之前讲过FreeRTOS&#xff0c;参看&#xff1a;FreeRTOS学习 – 再识 讲解了什么是FreeRTOS、FreeRTOS的特点、源码下载和目录文件介绍。 这里就不做更多讲解了&#xff0c;直接介绍怎么移植。 一、下载 官网&#xff1a; https://www.freertos.org/zh-cn-cmn-s/ 源码下载&a…