news 2026/3/2 11:03:35

全网最详细的Python Locust性能测试框架实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
全网最详细的Python Locust性能测试框架实践

Locust的介绍

Locust是一个python的性能测试工具,你可以通过写python脚本的方式来对web接口进行负载测试

Locust的安装

首先你要安装python2.6以上版本,而且有pip工具。之后打开命令行,分别安装locustio和pyzmq(命令如下):

  1. pip install locustio

  2. pip install pyzmq

之后我们就可以写性能测试脚本了。

PS:如果是python3,不能使用pip安装目前。需要在github上下载locust项目包到本地,然后在包路径下执行命令安装:

python setup.py install

Locust脚本编写

接下来我们拿两个接口做一下测试,编写脚本如下(每一步都有注释)。我来解释一下,首先我们要import进来三个类,分别是HttpLocust(用来模拟发请求的类)、TaskSet(顾名思义,任务集)、task(任务类)。额外的,为了方便观察接口测试的执行结果,我引入了json类用来解析web接口的返回值。我还引入了subprocess类用来执行一下shell命令,自启动Locust。这里有三个类,一个是UserBehavior(名字随便起,但传入TaskSet参数,说明这是一个包含了任务集的类),里面on_start函数可有可无,他会先于所有task函数运行。剩下被@task装饰器装饰的方法都是任务方法,里面包含了待请求的接口等信息,传入的参数代表了权重,如下所示两个被@task装饰的方法分别传入1和2,这意味着每3个模拟用户里有1个模拟用户执行list_header方法,2个模拟用户执行list_goods方法。这个参数你也可以不传入,那就意味着模拟用户会随机访问所有被@task装饰的方法。这里面我对于每个接口的返回值都做了一下判断,首先将返回的字符串转成json格式并获取返回字段result的值,如果不是100就用Locust自带的报错方法打印出错信息;另两个类是HttpLocust类(仍然是名字随便起但传入参数必须得是HttpLocust),是用来模拟用户的类,包含了一些模拟用户信息,其中task_set变量的值用来指定模拟用户所对应要完成的TaskSet类中包含的请求,min_wait和max_wait(最小等待时间和最大等待时间用来模拟用户每两步操作之间的间隔时间,这里也就是模拟用户每执行两个请求之间所间隔的时间)。对Locust类我们可以指定权重,对weight变量的值进行指定。如下所示,两个Locust类的权重分别为1和3,这意味着两个Locust类的模拟用户人数为1:3的关系。最后我加了一个main函数用来执行shell命令,这个shell命令也可以不再本文件中执行,如果写在脚本中的话,直接在命令行中调用该python文件即可,如果不写在脚本中(注释掉最后两行),则需要在命令行终端里对Locust项目进行启动。

from locust import HttpLocust,TaskSet,task import subprocess import json #This is the TaskSet class. class UserBehavior(TaskSet): #Execute before any task. def on_start(self): pass #the @task takes an optional weight argument. @task(1) def list_header(self): r = self.client.get("/homepage/list_header.html") if json.loads((r.content))["result"] != 100: r.failure("Got wrong response:"+r.content) @task(2) def list_goods(self): r = self.client.get("/homepage/list_goods.html") if json.loads((r.content))["result"] != 100: r.failure("Got wrong response:"+r.content) #This is one HttpLocust class. class WebUserLocust(HttpLocust): #Speicify the weight of the locust. weight = 1 #The taskset class name is the value of the task_set. task_set = UserBehavior #Wait time between the execution of tasks. min_wait = 5000 max_wait = 15000 #This is another HttpLocust class. class MobileUserLocust(HttpLocust): weight = 3 task_set = UserBehavior min_wait = 3000 max_wait = 6000 #if __name__ == '__main__': # subprocess.Popen('locust -f .\locust_test_1.py --host=http://api.g.caipiao.163.com', shell=True)

Locust的启动

对Locust项目的启动,我们可以在命令行终端中执行以下命令:

locust -f .\locust_test_1.py --host=http://api.g.caipiao.163.com

这里的“-f”指定了要执行的python文件路径,“--host”指定了模拟用户请求接口的host名。执行该命令,Locust项目就启动了。如果遇到下面的错误,注意[Errorno 10048]那行,可以看出端口8089被占用导致Locust项目启动失败,这里我们需要找到对应占用了8089端口的进程并杀掉:

为了检测占用端口的进程我写了一个PowerShell小脚本:

function checkPid($result,$port){ $port = $port.split(":")[1] if(($result.split())[6].split(":")[($result.split())[6].split(":").Count-1] -eq $port){ $tPid = ($result.split())[($result.split()).count-1] if($tPid -ne "0"){ Write-Host "您查询的端口被以下程序占用:" -ForegroundColor Red $target = tasklist|findstr $tPid Write-Host $target $sig = $true }else{ $sig = $false } }else{ $sig = $false } $sig } function checkPort($port){ $port = ":" + $port $results = netstat -ano|findstr $port if($results.count -gt 0){ if($results.count -eq 1){ $sig = checkPid $results $port if($sig -eq $false){ Write-Host "您所查询的端口未被占用!" -ForegroundColor Green } }else{ foreach($result in $results){ if($result){ $sig = checkPid $result $port if($sig -eq $true){ break } } } if($sig -eq $false){ Write-Host "您所查询的端口未被占用!" -ForegroundColor Green } } }else{ Write-Host "您所查询的端口未被占用!" -ForegroundColor Green } } $port = $null while($port -ne "exit()"){ $port = Read-Host "请输入要查询的端口号" if($port -eq "exit()"){ break } checkPort $port }

运行该脚本,输入端口号8089我们可以看出python.exe进程占用了该端口号:

然后我们在PowerShell中杀掉该进程,再启动Locust项目,就成功了(如下):

接下来就可以在浏览器中访问我们的locust页面来完成负载测试了,如果不想通过浏览器来设置完成负载测试,纯粹命令行模式也是支持的,输入以下命令:

locust -f .\locust_test_1.py --host='http://api.winyyg.com' --no-web -c 1000 -r 10 -n 1000

接下来负载测试就会自动执行,按“ctrl+c”结束负载测试:

对于命令行中的参数的解释:--no-web是用来选择无浏览器模式,-c后面接的是模拟用户数,-r后面接的每秒模拟用户并发数,-n后面接的是模拟请求数。

Locust负载测试

在浏览器中输入“http://localhost:8089/”访问,会看到如下页面:

这里我们按提示输入要模拟的用户总数和每秒钟并发的用户数量,点击“Start swarming”就可以运行负载测试了:

点击“STOP”按钮停止负载测试,现在STATUS为“STOPPED”,点击“New test”可以进行一个新的测试:

从上图可以看出在Statistics标签下列出了一些性能相关的测试结果,比如总的请求数量、请求失败的个数、每秒钟的请求数、最小\最大响应时间、平均响应时间等。右上角显示了请求失败率和总的RPS(每秒钟请求数)。对应在Statistic右侧的Failures、Exceptions、Download Data标签下我们分别可以查看失败的请求、捕获的异常以及下载测试结果。这里不做过多介绍了,可以实际应用看一下。如果想深入的了解Locust性能测试框架,去官网上看看吧。

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 23:01:29

QCMA:跨平台PS Vita数据管理的终极解决方案

QCMA:跨平台PS Vita数据管理的终极解决方案 【免费下载链接】qcma Cross-platform content manager assistant for the PS Vita (No longer maintained) 项目地址: https://gitcode.com/gh_mirrors/qc/qcma 还在为PS Vita繁琐的数据备份和传输而烦恼吗&#…

作者头像 李华
网站建设 2026/2/27 2:23:02

DBeaver数据库驱动一站式解决方案:告别重复下载的终极指南

还在为DBeaver缺少数据库驱动而烦恼吗?每次连接新数据库都要手动下载驱动包,不仅耗时耗力,还容易遇到版本兼容性问题。现在,有了DBeaver驱动整合项目,您将拥有一个包含30数据库驱动的完整资源库,真正实现&q…

作者头像 李华
网站建设 2026/2/28 20:35:37

新闻聚合收听:每天定时用IndexTTS 2.0播报热点资讯

新闻聚合收听:每天定时用IndexTTS 2.0播报热点资讯 在信息爆炸的时代,每天刷完热搜、翻遍公众号、听完播客——这一套“早间仪式”成了不少人的日常。但你有没有想过,这些内容其实可以不用“看”,而是由一个声音清晰、语调自然的“…

作者头像 李华
网站建设 2026/2/27 20:35:31

IndexTTS 2.0情感控制四路径大比拼:哪种最适合你的应用场景?

IndexTTS 2.0情感控制四路径大比拼:哪种最适合你的应用场景? 在短视频、虚拟人和AIGC内容爆发的今天,语音合成早已不再是“能说话就行”的初级工具。用户期待的是有情绪、有个性、能与画面严丝合缝对齐的声音表现——而这正是传统TTS系统的软…

作者头像 李华
网站建设 2026/3/1 12:21:23

VR视频转换完整指南:如何将3D VR内容轻松转为2D格式

VR视频转换完整指南:如何将3D VR内容轻松转为2D格式 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.com/gh_mirr…

作者头像 李华
网站建设 2026/3/2 8:19:20

Boss-Key老板键终极指南:5步简单设置打造完美办公隐私保护

Boss-Key老板键终极指南:5步简单设置打造完美办公隐私保护 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 还在为突如其来的工…

作者头像 李华