Locust性能测试入门案例及分布式压测

news2024/11/25 0:22:49

前言

大家好,我是洋子。最近好多身边人都阳了,记得保护好自己

性能测试已经成为作为测试工程师/测试开发工程师一项重要的专项能力

在抢红包、活动秒杀这种短时间内流量突增的场景,或者是健康宝这种使用用户超级多的场景,我们均需要进行压力测试,确保服务稳定可用

随着近年来测试行业的发展,业务架构越发复杂,性能测试在非功能测试场景下也成为了必要的质量保障手段,学会它早日升职加薪

工欲善其事,必先利其器,想要开展性能测试的前提,我们必须有可以利用的性能测试工具,如果所在中小型公司(公司只有我一个测试,老板还让我压测),在没有公司压测平台的辅助下,我们就得自己寻找一款性能测试工具,作为发压器帮助我们进行性能测试

对于服务端的性能测试工具,从2012年到2022年近十年的时间,有一些新的工具横空出世,如k6VegataGatlingWebLOAD等,但主流的目前依旧还是JMeterLoadrunnerLocust这三款服务端性能测试工具各占一席之地

这篇文章主要介绍Locust的使用方法,Locust是基于Python的开源性能测试工具,用于压力测试Web应用程序。它允许自定义用户行为模型(压测任务),并使用虚拟用户来模拟真实用户访问你的应用程序,Locust借助gevent库对协程的支持,以greenlet来实现对用户的模拟,在相同配置下,Locust能支持的并发用户数相比用多线程模拟用户的Jmeter更多

Locust的使用方法非常简单,能够通过编写Python性能测试脚本,快速进行性能测试,同时也支持分布式压测,使用多台机器模拟超高并发下的压测场景

Locust还可以提供有关应用程序性能的实时报告,帮助你了解如何提高应用程序的吞吐量和响应时间

Locust经过多次迭代,老版本1.0以前和最新版本2.13.2在安装和使用方法上略有不同,下面的文章所使用的Locust 版本为2022年12月9日发布的2.13.2,测试工具还是建议大家使用最新版本,修复已知的问题,性能方面更加稳定

下载安装Locust

前面说到Locust是基于Python,那运行Locust时自然就需要依赖Python环境,先安装好Python环境

(1)打开Python的官网,下载安装好Python 3.x环境

https://www.python.org/downloads/

Windows电脑:可以下载Windows installer 安装程序,根据提示一键安装 

MAC电脑:可以下载macOS 64-bit universal2 installer安装程序,根据提示一键安装 

Linux系统:可以下载Gzipper source tarball ,即gzip格式的压缩包,使用FTP上传到Linux服务器上,然后参考下面两篇安装教程进行安装

https://www.linuxprobe.com/linux-centos7-python3.html
https://blog.csdn.net/L_15156024189/article/details/84831045

(2)继续安装Locust,可以借助Python的pip安装工具,在命令行终端输入安装命令,MAC电脑使用pip工具时,命令前面还需要使用sudo获取权限

# windows电脑 pip安装命令
pip install locust 
# mac电脑 pip安装命令
sudo pip install locust 

# 注意1.0以下老版本安装命令为 pip install locustio

安装完毕后,可以使用locust --help来验证是否安装成功

Locust性能测试Demo

接下来利用Locust编写一个简单的Python性能测试脚本,来快速熟悉Locust如何使用

以下性能测试脚本我们命名为locust_file.py,文件名字可以自己随意起

from locust import HttpUser, TaskSet, task, between


class UserBehavior(TaskSet):

    def on_start(self):
        """
        Called when a User starts executing this TaskSet
        """
        pass

    def on_stop(self):
        """
        Called when a User stops executing this TaskSet. E.g. when TaskSet.interrupt() is called
        or when the User is killed
        """
        pass

    @task(1)
    def baidu_homepage(self):
        self.client.get("/")

    @task(2)
    def baidu_search(self):

        with self.client.get("/s?wd=chatgpt", catch_response=True) as response:

            if response.status_code != 200:
                response.success()
            else:
                response.failure("请求失败")

            if response.json()["param1"] != "xx":
                response.failure("请求失败,No data")

            # 支持断言检查 assert response.json()['param1'] == 100,"数据返回错误"

        # Post请求例子 res = self.client.post("/login", json={"username": "foo", "password": "bar"})


class WebsiteUser(HttpUser):
    tasks = [UserBehavior]
    host = "https://www.baidu.com"

    # 等待响应时间在3-7s内,超时处理策略
    wait_time = between(3, 7)

解读一下这个脚本的内容,一共有两个类组成,分别是UserBehavior类和TaskSet

UserBehavior类

UserBehavior类继承于TaskSet类,这个类的作用是定义压测相关的任务(说白了就是我们要压测的接口),以及压测过程当中的前后操作

UserBehavior类定义了一组任务,在本例中有两个任务,一个是访问根路径/,另外一个是访问/s路径。用@task() 装饰的方法为一个任务,1表示一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在本例子中任务baidu_homepage的权重就小于任务baidu_search

UserBehavior类的父类TaskSet类当中有个属性为self.client 是 HttpSession 的一个实例,可用于向我们要进行负载测试的目标系统发出 HTTP请求,支持发送GET、POST等HTTP请求,就跟使用Python里面requests库用法一样,因为UserBehavior类是TaskSet类的子类,所以可以直接使用父类的属性self.client

我们最好再对接口返回的响应结果状态以及返回的结果进行逻辑验证,如响应状态码不是200,接口返回的JSON串(假定该接口返回响应是JSON格式)当中的某个字段不符合预期,这两种情况就判定为请求失败,也可以实际接口的返回数据自行修改请求成功与失败的判定逻辑

with self.client.get("/s?wd=chatgpt", catch_response=True) as response:

	if response.status_code != 200:
		response.failure("请求失败")
	if response.json()["param1"] != "xx":
		response.failure("请求失败,No data")

返回结果验证的目的是为了避免压测时接口因传参等错误导致接口返回值不正常,及时感知接口的请求情况,别到时候因为自己的性能测试脚本当中接口定义参数有问题,压完了才发现接口一直在报错,无法起到真正的压测效果

on_start方法可以定义压测前的前置步骤,如登陆操作获取Cookie,on_stop方法则可定义压测完成的后置处理,如删除压测数据

WebsiteUser类

WebsiteUser类继承于HttpUser类,定义了一个模拟用户,它会向设置的host地址(这里设置的是百度官网),发起HTTP请求,并执行UserBehavior中定义的任务。UserBehavior类中定义了 wait_time 属性表示模拟用户在执行任务之间等待的最小和最大时间区间

locust运行命令

要运行这个locust实例,可以在命令行中使用以下命令:

locust -f locust_file.py

要是不想在脚本当中写死host地址,我们可以在locust_file.py性能测试脚本当中可以去掉 WebsiteUser类的host字段,这样就可以在启动locust时灵活指定要压测的host地址

locust -f locust_file.py --host=http://example.com

该命令会在本地启动locust的Web服务,然后你就可以在浏览器中访问http://0.0.0.0:8089,使用locust的Web界面来控制模拟用户的数量和执行任务

接下来进行性能测试前的配置,设置好 并发的用户数(number of users),以及每秒产生(启动)的用户数(Spawn rate),要压测的Host地址也能进行修改。设置完成后,点击Start swarming开始压测在压测过程当中,可以实时监控压测的状态,Requests请求总数,Fails失败总数,99%和90%的请求响应时间,Average平均响应时间等指标细心的同学能发现Requests数据项有点意思,压测时我们设置了两个任务,一个是访问根路径/,另一个是访问/s,为什么同时压测两者的Requests数据是1:2不是1:1呢,这是因为我们设置的task权重,一个权重是1,另外一个权重是2,权重为2的任务请求会更加频繁,刚好就是1:2的关系

同时支持查看曲线图,有一个值得注意的性能指标RPS(Requests Per Second),RPS和QPS(Queries Per Second)等效,指每秒能处理完的请求数目做过性能测试的小伙伴可能还会想到一个指标叫TPS(Transactions Per Second),每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分

TPS与QPS之间的区别

(1)若在一秒内,用户请求了百度首页并看到了首页全貌,这样就完成了一个事务(TPS=1),但其实向服务端发起了N多次HTTP请求,或者是存在只发了一次HTTP请求某个接口,但该接口下游还请求了其他接口(QPS=N),这两种情况属于一个事务包含了多个HTTP请求,此时TPS不等于QPS(2)若在一秒内,我们请求一个查询接口,且这个接口内部不会再去请求其它接口,即一个事务只有1个HTTP请求,此时TPS等于QPS

压测完毕后可以点击Download Data下载压测报告

Locust分布式压测

Locust 默认情况下是以单进程模式运行,在这种模式下,所有的虚拟并发用户均运行在单个Python进程中, 由于单进程的原因,并不能完全发挥压力机所有CPU处理器的能力

Locust还支持多进程分布式压测模式,可以在同一台计算机或者多台计算机当中进行分布式压测

不管是单机多进程分布式压测还是多机分布式压测,运行方式都是先运行一个master节点负责分发和统计,再启动work节点负责并发执行,如果是使用多台机器压测,需要先在所有机器上安装好locust,以及部署好完全一致的性能测试脚本,注意work节点和master节点需要在同一局域网内,能够互相通信

master节点启动命令

locust -f locust_file.py --master --master-bind-port=8089 (端口可以自己改)

work节点启动命令

locust -f locust_file.py --worker --master-host=<locust_master_machine_ip> --master-port=8089 (端口与master机器保持一致)

<locust_master_machine_ip>填写的是机器的网卡IP,我这里同时启动了两个work节点,打开Web页面,可以看到Workers的数量变成为2。在单机上进行分布式压测,Web访问页面为http://localhost:8089/

点击New test即可开始分布式压测

有小伙伴可能会说了,如果work节点数量非常多,手动部署推送性能脚本到服务器上好低效,有没有办法自动部署呢?

在单机分布式压测的情况下,我们可以编写一键启动shell脚本,同时启动locust master与work节点

echo "start master..."
nohup locust -f locust_file.py --master --master-bind-port=8089 > main.log 2>&1 &

workerNum=2
echo "start worker, size=${workerNum}..."
for i in $( seq 1 ${workerNum})
do
  nohup locust -f locust_file.py --worker --master-host=<locust_master_machine_ip> --master-port=8089  worker${i}.log 2>&1 &
  echo "output worker${i}.log"
done

echo "end..."

如果在多台机器上要同时启动压测脚本或者一键推送修改后的压测脚本,则需要自动登录远程登陆主机,Linuxscp命令推送文件,可以使用shell中except脚本实现,具体代码逻辑这里不再展开

在查找资料的时候发现网上有个大佬编写Python的脚本也实现了多台机器测性能测试脚本自动部署,可参考 https://blog.csdn.net/weixin_39394499/article/details/74231675

最后一小点补充,locust分布式压测通信利用到ZMQ (ZeroMQ)网络通信库,ZMQ提供了在进程内、进程间、TCP和多播等各种传输中传递原子消息的套接字(socket),支持多种传输(TCP、进程内、进程间、多播、WebSocket等)上的通用消息传递模式

因此需要使用分布式压测依赖pyzmq库,在我们使用pip install locust安装好locust会自动安装此库

附录

  1. locust官方文档(强烈推荐):https://docs.locust.io/en/stable/index.html

  2. 关于locust的命令其他使用,可以locust --help查看(强烈推荐)

  3. 词表的多种使用脚本参考:https://debugtalk.com/post/head-first-locust-advanced-script

  4. 关于Python协程官方文档:https://docs.python.org/zh-cn/3.7/library/asyncio-task.html

  5. 性能测试工具使用汇总: https://www.cnblogs.com/fnng/archive/2012/08/17/2644878.html

结束语

本文为大家介绍了用Locust编写Python性能测试脚本,以及如何使用分布式压测,不得不说使用Locust做性能测试真的很方便,当然测试工具只是性能测试当中的小小一环,可以从下方表格获取到性能测试各流程

流程阶段做法
场景分析识别瓶颈,建立数据模型,确定测试纬度
测试计划执行测试方案和测试计划,指导测试执行
环境规划规划性能测试环境(生产环境还是线下环境),避免环境瓶颈
数据 & 工具准备测试工具使用,测试数据脚本(若有),统计脚本(若有)
指标获取 & 统计执行测试 & 获取监控的性能指标数据
报告分析生成报告,反馈数据,分析数据,便于后续性能调优

如果你觉得这篇文章对你有帮助,别忘了点一下【赞】哦,后续更多性能测试干货文章等着你


资源分享【这份资料必须领取~】

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

某大厦电力运维系统的设计及应用-Susie 周

1、项目简介 某公司位于北京市大兴区&#xff0c;于2001年在大兴分局注册成立&#xff0c;该在公司多年的发展里&#xff0c;始终为终端客户提供好的产品和技术支持、健全的售后服务&#xff0c;该公司主要经营110KV及以下送电线路&#xff08;含电缆工程&#xff09;和同电压…

Springboot内置的工具类之CollectionUtils

前言 实际业务开发中&#xff0c;集合的判断和操作也是经常用到的&#xff0c;Spring也针对集合的判断和操作封装了一些方法&#xff0c;但是最令我惊讶的是&#xff0c;我在梳理这些内容的过程中发现了一些有趣的现象&#xff0c;我的第一反应是不敢相信&#xff0c;再想一想&…

交换机(Exchange)

目录一、Exchange(交换机)的作用二、Exchange(交换机)的类型1.直连交换机&#xff1a;Direct Exchange2.主题交换机&#xff1a;Topic Exchange3.扇形交换机&#xff1a;Fanout Exchange4.首部交换机&#xff1a;Headers exchange5.默认交换机6.Dead Letter Exchange&#xff0…

一文入坑【Canvas】多图与案例详解

游戏玩法 游戏主要考验玩家的空间感和记忆能力&#xff0c;玩家需要通过开局的3秒内尽可能多的记忆两个空间内相同元素的位置&#xff0c;3秒后将会翻牌把图案盖住&#xff0c;玩家需要点击卡牌来翻转牌面&#xff0c;两张相同图案的卡牌即可保留&#xff0c;游戏计时将在卡牌…

小型水库雨水情测报及大坝安全监测建设介绍

一、背景介绍 二、站点布设 布局示意图&#xff1a; 红色&#xff1a;坝轴线 兰色&#xff1a;监测横断面&#xff0c;一般不少于3个&#xff0c;300m内间距2050m&#xff0c;300m外间距5010m。黄色:监测纵断面&#xff0c;一般不少于4个。上游坝坡正常蓄水位以上应布设1个。…

ssm+Vue计算机毕业设计校园闲置物品管理系统的实现(程序+LW文档)

ssmVue计算机毕业设计校园闲置物品管理系统的实现&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

WPF TreeView拖动排序拖拽排列

底部附有Demo示例。需要的朋友可以去下载参考 一、图示 先上图&#xff0c;不知为啥&#xff0c;GIF总看起来特别卡&#xff0c;实际却很流畅。 由于录制问题&#xff0c;GIF动画只会播放一次&#xff0c;需要重复观看的&#xff0c;请将网页关闭后重新打开再观看 WPF的资料…

自动化运维与普通运维有什么区别?

本文首发于知乎&#xff0c;由嘉为蓝鲸原创。 商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 01. 何为自动化运维&普通运维&#xff1f; 在了解两者的区别前&#xff0c;我们得先明确对二者的定义&#xff0c;总的来说运维工作的目的都是为了保障企业业…

Gateway简介

文档&#xff1a;Spring Cloud Gateway 小结&#xff1a; nacos &#xff1a;注册中心&#xff0c;解决服务的注册与发现 nacos &#xff1a;配置中心&#xff0c;配置文件中心化管理 Ribbon&#xff1a;客户端负载均衡器&#xff0c;解决微服务集群负载均衡的问题 Openfeign…

网络工程毕业设计 SSM游戏攻略资讯补丁售卖系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的游戏攻略…

容器安全——云原生中镜像容器全生命周期防护思路

文章目录容器简介容器镜像传统安全面对容器安全的表现无法匹配动态IP无法侦测到容器内的各种行为无法扫描各种分层存储的镜像文件无法适应新的容器引擎和框架镜像容器全生命周期的安全防护Build防护Ship防护Run防护容器简介 我们都知道&#xff0c;VM是通过Hypervisor虚拟化技…

没有备份电脑照片怎么恢复?分享3种找回照片方法

随着科学技术的不断发展&#xff0c;越来越多的人喜欢使用手机或相机进行拍摄&#xff0c;但是这些设备存储照片量多后&#xff0c;容易导致卡顿甚至无法拍摄的情况发生&#xff0c;对此&#xff0c;婚纱/新闻/美食/广告摄影等职业人员&#xff0c;会习惯性将这些设备上的照片导…

VR如何改变办公场所,听一听Meta的预测

近期&#xff0c;为了更好的了解人们对于元宇宙、VR的看法&#xff0c;以及这对办公场景带来的影响&#xff0c;Meta对全球2000多名企业员工和400名企业领导进行调研。调查结果显示&#xff0c;66%的受调查者认为VR有助于还原线下办公的团结感&#xff08;togetherness&#xf…

Linux系统Initramfs机制

概述 现代Linux系统都使用到了一种功能比较特殊的微型系统&#xff0c;作为Linux内核初始化完成但未进入最终系统时的过渡系统&#xff0c;主要的目的是为了将最终系统载入到根文件系统上&#xff0c;辅助内核启动最终系统&#xff0c;可以称之为“辅助系统”。 辅助系统的作…

【C语言数据结构(基础篇)】第三站:链表(一)

目录 一、动态顺序表的缺陷以及链表的引入 1.动态顺序表的缺陷&#xff0c;以及链表的引入 2. 链表的概念 3.链表的声明 4.链表的逻辑结构与物理结构 二、单链表的实现 1.单链表的创建 2.单链表的打印 3.单链表的尾插 4.单链表的头插 5.单链表的头删、尾删 6.查找链表…

WPF入门第四篇 WPF模板

WPF模板 1、ControlTemplate 上一篇已经试用过控件模板&#xff0c;我们知道WPF的控件都是继承自Control&#xff0c;在Control类中有一个Template属性&#xff0c;类型就是ControlTemplate。那么利用这个ControlTemplate就可以彻底的颠覆控件的默认外观。 <Window x:Cla…

如何使用Unity ARFoundation和XR Interaction Toolkit对Prefab进行选择、缩放、移动、和旋转操作?

本文分享一种很常见的AR体验的实现。这种AR体验即&#xff0c;手机相机检测到指定图片/平面/实物之后&#xff0c;虚拟模型随之出现&#xff0c;并允许用户在屏幕上使用手势&#xff08;例如双指捏合&#xff09;对该虚拟模型进行选择、缩放、移动、和旋转操作。 这种体验有很…

【Spring】——14、如何使用@Value注解为bean的属性赋值呢?

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

flask之g对象、flask-session使用、数据库连接池、信号

目录 g对象 flask-session的使用 数据库连接池 flask中集成mysql wtfroms使用(了解) 信号 g对象 全称global&#xff0c;是一个全局对象在此次请求过程中一直有效&#xff0c;其实就是请求的上下文从请求进来就一直存在直到请求结束&#xff0c;所以在当次请求过程中&…

华为云WeLink云空间,企业的多啦A梦「百宝袋」办公助手

我们知道&#xff0c;源自华为19万员工的数字化办公实践的华为云WeLink&#xff0c;作为新一代智能工作平台、远程办公平台、移动办公平台、协同办公软件&#xff0c;已经给成为企业数字化转型的连接器。今天&#xff0c;我们来聊一聊WeLink提供的一项优质服务——云空间。 We…