用Locust做性能测试是一种什么样的体验

01 Locust介绍

Locust 一个开源性能测试工具,使用Python代码来定义用户行为,用它可以模拟百万计的并发用户访问你的系统。

性能工具对比:

图片

LoadRunner 是非常有名的商业性能测试工具,功能非常强大。使用也比较复杂,目前大多介绍性能测试的书籍都以该工具为基础,甚至有些书整本都在介绍 LoadRunner 的使用。

Jmeter 同样是非常有名的开源性能测试工具,功能也很完善,它可以作为接口测试工具的使用。但实际上,它是一个标准的性能测试工具

Locust 同样是性能测试工具,虽然官方这样来描述它 “An open source load testing tool.” ,但其它和前面两个工具有着较大的不同。相比前面两个工具,功能上要差上不少,但它也并非优点全无。

  • Locust 完全基于 Python 编程语言,采用 Pure Python 描述测试脚本,并且 HTTP 请求完全基于 Requests 库。除了 HTTP/HTTPS 协议,Locust 也可以测试其它协议的系统,只需要采用Python调用对应的库进行请求描述即可。

  • LoadRunner 和 Jmeter 这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力。Locust 的并发机制摒弃了进程和线程,采用协程(gevent)的机制。协程避免了系统级资源调度,由此可以大幅提高单机的并发能力。

02 Locust安装

pip安装

pip install locust

源码安装

  1. git clonehttps://github.com/locustio/locust/

  2. cd locust

  3. python setup.py install

03 创建性能测试

01 编写简单脚本

  1. from locust import HttpLocust, TaskSet, task

  2. # 定义用户行为

  3. class UserBehavior(TaskSet):

  4.     # 任一测试用例执行前均会执行一次

  5.     def on_start(self):

  6.         print('开始性能测试')

  7.     @task(1)

  8.     # 表示一个用户为行,访问百度首页。使用 @ task装饰该方法为一个事务。client.get()用于指请求的路径“ / ”,因为是百度首页,所以指定为根路径。

  9.     def index(self):

  10.         self.client.get("/")

  11.     @task(2) # task()参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1。

  12.     def index2(self):

  13.         self.client.get(

  14.             "/s?wd=locust&rsv_spt=1&rsv_iqid=0xbb8514200006b7d0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=8&rsv_sug1=9&rsv_sug7=101&rsv_sug2=0&inputT=1458&rsv_sug4=1911&rsv_sug=2")

  15. # 用于设置性能测试

  16. class WebsiteUser(HttpLocust):

  17.     # 指向一个定义的用户行为类。

  18.     task_set = UserBehavior

  19.     # 执行事务之间用户等待时间的下界(单位:毫秒)。如果TaskSet类中有覆盖,以TaskSet 中的定义为准。

  20.     min_wait = 3000

  21.     # 执行事务之间用户等待时间的上界(单位:毫秒)。如果TaskSet类中有覆盖,以TaskSet中的定义为准。

  22.     max_wait= 6000

  23.     # 设置 Locust 多少秒后超时,如果为 None ,则不会超时。

  24.     stop_timeout = 5

  25.     # 一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在一个 locustfile.py 文件中可以同时定义多个 HttpLocust 子类,然后分配他们的执行权重

  26.     weight = 3

  27.     # 脚本指定host执行测试时则不在需要指定

  28.     host = "https://www.baidu.com"

02 执行测试

1、web执行

启动服务

 
  1. locust -f test.py --host=https://www.baidu.com

  2. locust -f test.py  # 如果脚本中已经指定host,则不需要再次指定

  • -f:指定性能测试脚本文件

  • –host:指定被测试应用的URL的地址,注意访问百度使用的HTTPS协议

执行测试

通过浏览器访问:http://localhost:8089(Locust启动网络监控器,默认为端口号为: 8089)

图片

Number of users to simulate 设置模拟用户数

Hatch rate(users spawned/second) 每秒产生(启动)的虚拟用户数

点击 “Start swarming” 按钮,开始运行性能测试

图片

结果说明

  • Type:请求的类型,例如GET/POST

  • Name:请求的路径。这里为百度首页,即:https://www.baidu.com/

  • request:当前请求的数量

  • fails:当前请求失败的数量

  • Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值

  • Average:平均值,单位毫秒,所有请求的平均响应时间

  • Min:请求的最小服务器响应时间,单位毫秒

  • Max:请求的最大服务器响应时间,单位毫秒

  • Content Size:单个请求的大小,单位字节

  • reqs/sec:是每秒钟请求的个数

2、no-web执行

  1. locust -f test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m

  2. locust -f test.py --no-web -c 10 -r 2 -t 1m # 如果脚本中已经指定host,则不需要再次指定

  • –no-web:表示不使用Web界面运行测试

  • -c:设置虚拟用户数

  • -r:设置每秒启动虚拟用户数

  • -t:设置设置运行时间

关闭服务可直接Ctrl+C

03 分布式运行

一旦单台机器不够模拟足够多的用户时,Locust支持运行在多台机器中进行压力测试。

为了实现这个,你应该在 master 模式中使用–master标记来启用一个 Locust 实例。这个实例将会运行你启动测试的 Locust 交互网站并查看实时统计数据。master 节点的机器自身不会模拟任何用户。相反,你必须使用 --slave 标记启动一台到多台 Locustslave 机器节点,与标记 --master-host 一起使用(指出master机器的IP/hostname)。

常用的做法是在一台独立的机器中运行master,在slave机器中每个处理器内核运行一个slave实例。

注意:master 和每一台 slave 机器,在运行分布式测试时都必须要有 locust 的测试文件

 
  1. 在 master 模式下启动 Locust:

  2. locust -f my_loucstfile.py --master

  3. 在每个 slave 中执行(192.168.0.14 替换为你 master 的IP):

  4. locust -f my_locustfile.py --slave --master-host=192.168.0.14

参数说明

  1. --master  设置 Locust 为 master 模式。网页交互会在这台节点机器中运行。

  2. --slave  设置 Locust 为 slave 模式。

  3. --master-host=X.X.X.X  可选项,与 --slave 一起结合使用,用于设置 master 模式下的 master 机器的IP/hostname(默认设置为127.0.0.1)

  4. --master-port=5557  可选项,与 --slave 一起结合使用,用于设置 master 模式下的 master 机器中 Locust 的端口(默认为5557)。注意,locust 将会使用这个指定的端口号,同时指定端口+1的号也会被占用。因此,5557 会被使用,Locust将会使用 5557 和 5558。

  5. --master-bind-host=X.X.X.X`  可选项,与 --master 一起结合使用。决定在 master 模式下将会绑定什么网络接口。默认设置为*(所有可用的接口)。

  6. --master-bind-port=5557  可选项,与 --master 一起结合使用。决定哪个网络端口 master 模式将会监听。默认设置为 5557。注意 Locust 会使用指定的端口号,同时指定端口+1的号也会被占用。因此,5557 会被使用,Locust 将会使用 5557 和 5558。

  7. --expect-slaves=X  在 no-web 模式下启动 master 时使用。master 将等待X连接节点在测试开始之前连接。

04 权重分配

Locust支持同一脚本中使用权重的方式达到用例被执行频率不同的问题(例如用户流失,浏览用户100人,注册只有50人),不同于Jmeter、LandRunner权重分配方式并不是标准的比例。

权重1 - task

 
  1. # -*- coding: utf-8 -

  2. from locust import HttpLocust, TaskSet, task

  3. class TestLocust(TaskSet):

  4.     def on_start(self):

  5.         print('开始性能测试')

  6.     @task(1)

  7.     def test_demo_get1(self):

  8.        self.client.get(url="/mock_server/configs/info")

  9.     @task(2)

  10.     def test_demo_get2(self):

  11.         self.client.get("/mock_server/mock/show_lists")

  12. class Query(HttpLocust):

  13.     task_set = TestLocust

  14.     min_wait = 1000

  15.     max_wait = 3000

  16.     host = http://localhost:5000

方法的参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1。

权重2 - weight

 
  1. # -*- coding: utf-8 -

  2. from locust import HttpLocust, TaskSet, task

  3. class TestLocust(TaskSet):

  4.     def on_start(self):

  5.         print('开始性能测试')

  6.     @task

  7.     def test_demo_get(self):

  8.         self.runLocust(demoGet.demo_get())

  9. class TestLocust2(TaskSet):

  10.     def on_start(self):

  11.         print('开始性能测试')

  12.     @task

  13.     def test_demo_post(self):

  14.         page_num, num = 10, 1

  15.         self.runLocust(demoPost.demo_post(page_num, num))

  16. class QueryOne(HttpLocust):

  17.     task_set = TestLocust

  18.     min_wait = 1000

  19.     max_wait =3000

  20.     weight = 1

  21.     host = http://localhost:5000

  22. class QueryTwo(HttpLocust):

  23.     task_set = TestLocust2

  24.     min_wait = 1000

  25.    max_wait = 3000

  26.     weight = 3

  27.     host = http://localhost:5000

执行语句不同

locust -f test.py QueryOne QueryTwo

weight

一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在一个 locustfile.py 文件中可以同时定义多个 HttpLocust 子类,然后分配他们的执行权重

图片

05 参数化

参数化首先需要清楚locust的执行逻辑,定义的用户行为下带有task装饰器的函数才会被协程不断的执行

  1. from locust import HttpLocust, TaskSet, task

  2. from random import randint

  3. data1 = randint(1, 3)

  4. # 定义用户行为

  5. class UserBehavior(TaskSet):

  6.     def on_start(self):

  7.         print('开始性能测试')

  8.     @task(1)

  9.     def index(self):

  10.         print(data1)

  11.         self.client.get("/")

  12.     @task(2)

  13.     def index2(self):

  14.         data2 = randint(1, 3)

  15.         print(data2)

  16.         self.client.get(

  17.             "/s?wd=locust&rsv_spt=1&rsv_iqid=0xbb8514200006b7d0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=8&rsv_sug1=9&rsv_sug7=101&rsv_sug2=0&inputT=1458&rsv_sug4=1911&rsv_sug=2")

  18. class WebsiteUser(HttpLocust):

  19.     task_set = UserBehavior

  20.     min_wait = 3000

  21.     max_wait = 6000

  22.     stop_timeout = 5

  23.     weight = 3

  24.     host = "https://www.baidu.com"

图片

根据打印的结果就可以看出,data1被设为了全局变量,无论怎么多次执行值都不会变;data2被设为函数变量,因为每次执行该函数(接口进行一次请求),该变量都会重新执行发生变化。

因此,如果接口需要参数不重复,将该参数的生成方法写在执行函数中即可;如果接口需要的参数保持不变,将该参数写为全局变量即可

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 632880530,里面有各种测试开发资料和技术可以一起交流哦。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】在这里插入图片描述
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【软考中级备考笔记】数据的表示和校验码

2024/2/18 – 数据的表示和校验码 天气:阴雨 春节假期结束后第一个工作日,开始备考中级软件工程师。 希望在今年5月底的软考中取得中级证书 视频地址:https://www.bilibili.com/video/BV1Qc411G7fB 1. 计算机的总体架构 从下图中可以看出&am…

【网站项目】155在线考试与学习交流网页平台

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

RocketMQ订阅关系不一致和不能消费时如何排查?

订阅关系不一致 调整任意一个实例的订阅关系和另一个保持一致 消费者不能消费消息 它是最常见的问题之一,也是每个消息队列服务都会遇到的问题 1.确认哪个消息未消费。在这时消费者至少需要手机消息id、消息key、消息发送时间段三者之一 2.确认消息是否发送成功…

6.s081 学习实验记录(九)lock parallelism

文章目录 一、Memory allocator简介提示实验代码实验结果 二、Buffer cache简介提示实验代码实验结果 该实验将重构某些代码以提高并发度。 首先切换到lock分支: git fetchgit checkout lockmake clean 一、Memory allocator 简介 user/kalloctest 这个程序会对…

安装 Windows 7

1.镜像安装 镜像安装:安装Windows 7 2.安装过程(直接以图的形式呈现) 等待安装成功即可

2.18作业

通过字符设备驱动分步注册过程实现LED驱动的编写,编写应用程序测试 头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio…

Jetpack Compose 第 1 课:可组合函数

点击查看:Jetpack Compose 教程 点击查看:Composetutorial 代码 简介 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发。 在本教程中&a…

视觉开发板—K210自学笔记(五)--按键控制LED

本期我们来遵循其他单片机的学习路线开始去用板子上的按键控制点亮LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的,需要查看第二节的文档,看看开发板原理图到底是按键是跟哪个IO连在一起。然后再建立输入按键和GPIO的映射就可以开始变成了。 …

Instagram 账号被封怎么办?如何申诉拿回账号?

不知道各位在玩转海外社媒平台时有没有遇到过Instagram账号异常的情况,比如会出现账号受限、帖子发不出去、账号被封号等情况?Instagram账号如果被封不用马上弃用,我们可以先尝试一下申诉,看看能不能把账号解封。所以今天将会出一篇Instagra…

综合布线实训室建设方案2024

综合布线实训室概述 随着智慧城市的发展,人工智能、物联网、云计算、大数据等新鲜行业的兴起,网络布线系统是现代智慧城市、智慧社区、智能建筑、智能家居、智能工厂和现代服务业的基础设施和神经网络,实践表明网络系统的故障 70%发生在布线…

生成式 AI - Diffusion 模型的数学原理(4)

来自 论文《 Denoising Diffusion Probabilistic Model》(DDPM) 论文链接: https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 文章目录 一、 q ( x t ∣ x t − 1 ) q(x_{t} \mid x_{t-1} &#xff…

JVM常见问题笔记分享

文章目录 1 JVM组成1.1 JVM由那些部分组成,运行流程是什么?1.2 什么是程序计数器?1.3 你能给我详细的介绍Java堆吗?元空间(MetaSpace)介绍 1.4 什么是虚拟机栈1.5 堆和栈的区别1.6 能不能解释一下方法区?1.5.1 概述1.5.2 常量池1…

C++题目打卡2.18

从今天开始我们又将讲4天题目。 题目列表 1.分配T4 2.组合T5 #分配T4 这里很明显是&#xff08;200 110&#xff09; - 330的差值最小。 我们先想到了一个想法就是输入时哪个堆大,加那个。 #include <bits/stdc.h> using namespace std; int main(){int n, ans1 0, …

Win11家庭版,鸿蒙DevEco 模拟器启动失败,成功解决了

本人电脑系统&#xff1a;Windows 11 家庭版 正常安装模拟器后&#xff0c;启动失败&#xff0c;查了各种方法&#xff0c;最终发现是电脑虚拟机未启动导致的。 官方给出的解决方法&#xff08;对我无效&#xff01;&#xff01;&#xff01;&#xff09;&#xff1a; 我的…

MySQL之select查询

华子目录 SQL简介SQL语句分类SQL语句的书写规范SQL注释单行注释多行注释 select语句简单的select语句select的算数运算select 要查询的信息 from 表名;查询表字段查询常量查询表达式查询函数 查询定义别名as安全等于<>去重distinct连接字段concat 模糊查询运算符比较运算…

Linux网络----防火墙

一、安全技术和防火墙 1、安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安…

代码随想录第33天|● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

文章目录 1005.K次取反后最大化的数组和贪心思路&#xff1a;代码&#xff1a; 34. 加油站思路一&#xff1a;全局贪心代码&#xff1a; 思路二&#xff1a;代码&#xff1a; 135. 分发糖果思路&#xff1a;两边考虑代码&#xff1a; 1005.K次取反后最大化的数组和 贪心思路&am…

Stackoverflow(1)-根据RequestBody的内容来区分使用哪个资源

如果使用Spring&#xff0c;可以通过RequestBody将请求体的json转换为Java对象&#xff0c;但如果URI相同&#xff0c;而请求体的内容不同&#xff0c;应该怎么办&#xff1f;问题来源(stackoverflow)&#xff1a;Spring RequestBody without using a pojo?稍微研究了一下&…

手把手一起开发SV4E-I3C设备(三)

JEDEC DDR5 SPD Hub Devices例程 为进一步方便程序开发&#xff0c;使用vscode开发程序&#xff0c;IntrospectESP_23.3.0软件调用运行&#xff0c;如图所示&#xff0c;双击UTILITY区域的PythonModule&#xff0c;自动生成一个py文件&#xff0c;可以给该模块重命名。例如重命…

重学Java 16.面向对象.4.对象数组

一、对象数组 1.需求&#xff1a;定义一个长度为3的数组&#xff0c;存储3个person对象&#xff0c;遍历数组&#xff0c;将三个person对象中的属性值获取出来 public class Person {private String name;private int age;public Person(String name,int age) {this.name name…