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

前言

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

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

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

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

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

对于服务端的性能测试工具,从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, betweenclass UserBehavior(TaskSet):def on_start(self):"""Called when a User starts executing this TaskSet"""passdef on_stop(self):"""Called when a User stops executing this TaskSet. E.g. when TaskSet.interrupt() is calledor 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})
donohup 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"
doneecho "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.rhkb.cn/news/56022.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】Hawkes Process:超详细带示例的讲解

最近准备学Hawkes Process&#xff0c; 但是找遍了百度&#xff0c;b站&#xff0c;谷歌和youtube&#xff0c;都没有找到通俗易懂的讲解。今天终于在拆老师&#xff08;ChatGPT&#xff09;的帮助下搞懂了&#xff01;关于使用ChatGPT进行自学的Prompt可以看之前的笔记&#x…

用月壤实现太阳能发电,人类离「定居月球」又近一步 | 来自贝索斯蓝色起源...

Alex 发自 凹非寺量子位 | 公众号 QbitAI 用月球表面土壤搞太阳能发电&#xff1f;&#xff01; 你没听错&#xff0c;有人用这种材料做出了太阳能电池&#xff0c;人类朝“在月亮上搞基建”又前进一步。 这个“幕后使者”&#xff0c;既非马斯克的SpaceX&#xff0c;也非NASA&…

python调用oepnai API

目录 apiAI官网介绍&#xff08;[Introduction](https://platform.openai.com/docs/api-reference/introduction)&#xff09;安装官方SDK认证&#xff08;Authentication&#xff09;申请API KEY请求组织&#xff08;Requesting organization&#xff09; 发送请求关于chat to…

在线作图|2分钟在线绘制三维PCOA图

三维PCoA PCoA(Principal Co-ordinates Analysis)分析即主坐标分析&#xff0c;可呈现研究数据相似性或差异性的可视化坐标&#xff0c;是一种非约束性的数据降维分析方法&#xff0c;可用来研究样本群落组成的相似性或相异性。它与PCA类似&#xff0c;通过一系列的特征值和特…

python绘制3D图表

pyecharts绘制3D图表 参数配置和说明 Grid3DOpts、Axis3DOpts为3D图标需要配置项 Grid3DOpts&#xff1a;三位坐标系配置项 class pyecharts.options.Grid3DOpts class Grid3DOpts(# 三维笛卡尔坐标系组件在三维场景中的宽度width: Numeric 200,# 三维笛卡尔坐标系组件在三维…

在线作图|2分钟在线绘制三维CCA图

​三维CCA 典型相关分析&#xff08;Canonical Correlation Analysis&#xff09;是研究两组变量之间相关关系的一种多元统计方法&#xff0c;它能够揭示出两组变量之间的内在联系。冗余分析&#xff08;redundancy analysis, RDA&#xff09;或者典范对应分析&#xff08;can…

在线作图|2分钟绘制三维PCA图

三维PCA 主成分分析算法&#xff08;PCA&#xff09;是最常用的线性降维方法。PCA降维为了在尽量保证“信息量不丢失”的情况下&#xff0c;对原始特征进行降维&#xff0c;也就是尽可能将原始特征往具有最大投影信息量的维度上进行投影。将原特征投影到这些维度上&#xff0c…

Tikz 作图教程:pgfplots 宏包三维数据的可视化绘图

前一篇推文讲解了使用pgfplots 宏包导入二维数据和可视化绘图的方法。今天我们来介绍一下科研工作者常常用到的三维数据的导入与绘图的方法。 当一个函数关系式中出现了两个自变量时&#xff0c;我们需要用空间曲面来呈现其图像。 编辑之谈(知名origin 绘图公众号)最近一篇推…

plotly绘制3D图技巧

简介 Plotly 是一个非常强大的开源数据可视化框架&#xff0c;它通过构建基于 HTML 的交互式图表来显示信息&#xff0c;可创建各种形式的精美图表。本文所说的 Plotly 指的是 Plotly.js 的 Python 封装&#xff0c;plotly本身是个生态非常复杂的绘图工具&#xff0c;它对很多…

使用VoceChat 为自己的网站和社群搭建聊天机器人

使用VoceChat搭建一个自己的机器人 最近想要把AnyGPT的社群做起来&#xff0c;但是微信群的效率实在太低了&#xff0c;很多公共的问题会一遍又一遍的回答。还有就是&#xff0c;一直想在群里用GPT搭个机器人&#xff0c;但是在微信里面搭建机器人本身是不合法的&#xff0c;有…

学习Python可以做哪些副业,不看错过了一个亿,普通人可复制的暴利副业攻略

人生苦短&#xff0c;我用Python。 近年来&#xff0c;Python凭借其简洁易入门的特点受到越来越多人群的青睐。 当然这不仅仅是针对程序员来说&#xff0c;对于一些学生、职场人士也是如此。 Python为什么会大受欢迎呢&#xff1f;因为Python还被大家称为“胶水语言”&#…

ai帮你写论文,一款特别牛逼的ai对话网站

open ai 一、 open Ai 介绍二、 chat apt 演示三、 网址 一、 open Ai 介绍 OpenAI&#xff0c;在美国成立的人工智能研究公司。 公司核心宗旨在于“实现安全的通用人工智能(AGI)”&#xff0c;使其有益于人类。 chatapt超级对话模型 这一模型可以与人类进行谈话般的交互&…

ChatGLM实现本地部署类似GPT,训练自己的数据

ChatGPT最近火的不得了&#xff0c;但是注册账号&#xff0c;升级Plus非常麻烦&#xff0c;而且还要担心数据泄露&#xff0c;清华开源ChatGLM&#xff0c;实现本地部署&#xff0c;这就方便多了&#xff0c;不用魔法&#xff0c;就能本地访问&#xff0c;还可以喂一下自己行业…

如何选择一家靠谱的IT培训机构?

如何选择一家靠谱的IT培训机构&#xff1f;现在很多的人都知道工作很难找&#xff0c;如果没有一技之长就很难获取好的发展&#xff0c;如今互联网的发展前景广阔&#xff0c;很多人转型开始学习软件开发之类的技术&#xff0c;市场上的培训机构多入牛毛&#xff0c;那如何选择…

计算机培训班哪家靠谱?怎么选择

课程体系 选择一个适合自己的课程体系是最为重要的&#xff0c;课程体系的选择要考虑到自己的兴趣爱好&#xff0c;还有未来职业规划。就目前来说&#xff0c;很多人选择的目前比较好就业的课程&#xff0c;但是自己却完全没有兴趣。在这种情况下&#xff0c;人们很容易在未来…

我不是培训班的,但建议上IT培训班

目录 一、个人经历 二、有哪些IT培训班 三、学习IT上培训班的益处 四、学习IT上培训班的风险 五、就业前景 六、题外话 在学习IT技术的过程中&#xff0c;你是否也被安利过各种五花八门的技术培训班&#xff1f;这些培训班都是怎样向你宣传的&#xff0c;你又对此抱有着…

网上在线培训平台哪家好?

在21世纪的今天&#xff0c;“终身学习”已经不再是一个新颖的概念了&#xff0c;并且随着科技的进步&#xff0c;学习方式发生了变革&#xff0c;越来越多的人开始通过互联网学习知识。 网上在线学习平台的前景分析 随着科技水平的不断提升&#xff0c;在线学习saas管理系统…

软考培训机构哪家好?

无论是软考也好&#xff0c;PMP也好&#xff0c;或者是其他考试&#xff0c;培训机构都很多&#xff0c;有线上的也有线下的。只要你关注这方面的信息&#xff0c;就会看到各种说辞的广告&#xff0c;觉得哪个都好&#xff0c;无从下手.......... 下面小编就选培训机构来给大家…

pmp主流培训机构推荐,pmp培训机构哪个好?

PMP 机构选择也是我报名的时候最头疼的一个问题&#xff0c;做 PMP 培训的机构太多了&#xff0c;各执一词&#xff0c;各机构互踩的人也很多&#xff0c;看的眼花缭乱叫人头大。 下面这篇文章把几个机构的优劣都写出来了&#xff0c;比较清晰和中肯&#xff0c;个人觉得可以参…