Python Locust性能测试框架实践
[本文出自天外归云的博客园]
Locust的介绍
Locust是一个python的性能测试工具,你可以通过写python脚本的方式来对web接口进行负载测试。
Locust的安装
首先你要安装python2.6以上版本,而且有pip工具。之后打开命令行,分别安装locustio和pyzmq(命令如下):
pip install locustio
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 ""){
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性能测试框架,去官网上看看吧。
Python Locust性能测试框架实践的更多相关文章
- Python locust性能测试框架模板
locust框架模板 from locust import HttpLocust, TaskSet, task import Queue class UserBehavior(TaskSet): de ...
- locust性能测试框架随笔
现在有很多的性能测试工具,比如说我们熟悉的loadrunner.jmeter.ab.webbench等等,这些工具如果对一个没用过的朋友来说,学习起来比较不容易,但是如果你能看懂python代码,会写 ...
- python locust 性能测试:locust安装和一些参数介绍
安装参考 https://www.cnblogs.com/fnng/p/6081798.html <虫师大大的,很详细> ps:python3.7暂不支持locust:python3安装建 ...
- Locust性能测试框架,从入门到精通
1. Locust简介 Locust是使用Python语言编写实现的开源性能测试工具,简洁.轻量.高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力. 主要特点如下: 使用普通的P ...
- Locust性能测试框架学习
1. Locust简介 Locust是使用Python语言编写实现的开源性能测试工具,简洁.轻量.高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力. 官网:https://loc ...
- python locust 性能测试:locust 关联---提取返回数据并使用
from locust import HttpLocust, TaskSet, taskimport jsonfrom common import readConfig class UserBehav ...
- python locust 性能测试:HOOKS<钩子方法>
为locust中不同类型的事件,提供的钩子方法: from locust import TaskSet, task, events, Locust from locust.clients import ...
- python locust 性能测试:嵌套
TaskSet类和TaskSequence类可用于嵌套<可以在TaskSequences中嵌套TaskSets,反之亦然>: from locust import TaskSet, tas ...
- python locust 性能测试:HttpSession
官网解释:用于在请求之间执行Web请求和保留(会话)cookie的类(以便能够登录和退出网站):记录每个请求,以便locust可以显示统计信息: from locust import TaskSet, ...
随机推荐
- 允许浏览器跨域访问web服务端的解决方案
今天和同事探讨了前后端如何真正实现隔离开发的问题,如果前端单独作为服务发布,势必会涉及到无法直接调用后端的接口的问题,因为浏览器是不允许跨域提交请求的. 所谓跨域访问,就是在浏览器窗口,和某个服务端通 ...
- geometric median
The geometric median of a discrete set of sample points in a Euclidean space is the point minimizing ...
- 使用LVM对硬盘在线扩容
初始状态: root@control:/dev/nova-volumes# vgdisplay --- Volume group --- VG Name nova-volumes System ID ...
- Codeforces Round #378 (Div. 2) C D
在实验室通宵 一边做水题一边准备随时躲起来以免被门卫大爷巡查发现..结果居然没来.. 本来以为可以加几分变个颜色..结果挂了CD...状态有点差...思维不太活跃 沉迷暴力不能自拔 D 给出n个长方体 ...
- nba技能表
球员名 主动技能名 主动技能效果 拆解技能名 拆解技能效果 巅峰-纳什 跑投三分 全队三分出手概率提高X%,但体力消耗增加Y% 稳固进攻 全队进攻增加X%,持续整场比赛 巅峰-科比 肉搏 对方全体行动 ...
- 在windows下新建maven项目
1.拷贝settings到.m2文件下 2.修改文件 3.新建Project项目 4.转换为maven项目 config下转换 5.拷贝pom文件 6.新建目录 src/main/java src/m ...
- 【C++】类型转换(学习笔记)
1. 隐式类型转换,相关联的类型(e.g.int vs double)之间可以发生隐式类型转换. 比如,在条件中,非布尔类型转为布尔类型: 初始化时,初始值变为变量类型: 赋值时,右值变成左侧的类型: ...
- java 截取pdf
最近在读一本电子书,pdf中频繁引用后文的内容(页码),必须实时的跳过去看,但是扫描版的pdf的页码往往从封面就开始计数,而且盗版还经常有一些做广告的页面,这就导致pdf reader 索引的页面并不 ...
- momentjs 求小时差异
momentjs 使用 var now1 = moment( moment().unix()*1000); //获取unix时间戳 需要*1000 var befor_time = moment(1 ...
- LeetCode Read N Characters Given Read4
原题链接在这里:https://leetcode.com/problems/read-n-characters-given-read4/ 题目: The API: int read4(char *bu ...