接口性能测试工具之Locust
Locust(俗称 蝗虫), 一个轻量级的开源压测工具,用Python编写。
常见性能测试工具:①jmeter ②loadrunner ③locust
locust优点:
基于协程,单机并发能力强
开源免费,支持二次开发
locust缺点:
不支持资源监控,结果图表简单
安装(以mac os为例)
注意:安装是需要特别注意的步骤,由于locust在2020年5月26日从0.版本正式进入1.版本时代,所以在安装方式和使用方式上都出现了较大的变化,网上的教程大多以0.版本为例进行讲解,所以安装时候一定要提前查清楚自己需要的是0.版本还是1.*版本,或者直接去官网查看相关资料。
我第一次安装locust时,参考了很多博客,大多数博主给出的安装步骤为直接运行pip install locustio,但是我在安装过程中频频出错,使用sudo pip install locustio也无济于事,查询了很多资料之后,得知最新的locust安装命令为pip install locust,也就是从0.*到1.*的版本变化中包的名字发生了变化!!!这也太坑了,说好的兼容呢?后面还有更坑的。
所以最简单的正确安装方式为:pip install locust
如果你想用0.*版本的,使用:pip install locustio=0.*(一定要指定一个版本)
还有一种安装方式为需要在github上下载locust项目包到本地,然后在包路径下执行命令安装:python setup.py install
#setup.py文件 从install_requires中能够看出locust所需要的包
setup(
name="locust",
version=version,
install_requires=[
"gevent>=20.9.0", #协程
"flask>=1.1.2", #wed服务框架
"Werkzeug>=1.0.1",
"requests>=2.9.1", #http请求
"msgpack>=0.6.2",
"pyzmq>=16.0.2", #分布式运行
"geventhttpclient>=1.4.4",
"ConfigArgParse>=1.0",
"psutil>=5.6.7",
"Flask-BasicAuth>=0.2.0",
],
test_suite="locust.test",
tests_require=[
"cryptography",
"mock",
"pyquery",
],
)
安装成功后通过locust --help命令进行验证
压测脚本编写
1.*版本压测脚本代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# locustdemo.py
from locust import TaskSet,task,HttpUser
class Testlocust(TaskSet): #任务类
@task(1) # (1)代表以下任务在本次测试中的权重为1,如果总共发30次请求,按照比例有10次会调用hello_demo
def hello_demo(self):
self.client.get("/hello",verify = False)
@task(2) # (1)代表以下任务在本次测试中的权重为2,如果总共发30次请求,按照比例有20次会调用goodbye_demo
def goodbye_demo(self):
self.client.get("/goodbye",verify = False)
class WebsiteUser(HttpUser): #虚拟用户类
tasks = [Testlocust] #执行的任务类
min_wait = 1000 #调用最小间隔时间 ms
max_wait = 5000 #调用最大间隔时间 ms
if __name__ == "__main__":
import os
os.system("locust -f locustdemo.py --host=http://127.0.0.1:80") #也可以在终端执行该命令
对应的0.*版本的脚本编写
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# locustdemo.py
from locust import TaskSet,task,HttpLocust
class Testlocust(TaskSet): #任务类
@task(1) # (1)代表以下任务在本次测试中的权重为1,如果总共发30次请求,按照比例有10次会调用hello_demo
def hello_demo(self):
self.client.get("/hello",verify = False)
@task(2) # (1)代表以下任务在本次测试中的权重为2,如果总共发30次请求,按照比例有20次会调用goodbye_demo
def goodbye_demo(self):
self.client.get("/goodbye",verify = False)
class WebsiteUser(HttpLocust): #虚拟用户类
task_set = Testlocust
min_wait = 1000 #用户执行任务之间等待时间的下界 ms
max_wait = 5000 #用户执行任务之间等待时间的上界 ms
if __name__ == "__main__":
import os
os.system("locust -f locustdemo.py --host=http://127.0.0.1:80") #也可以在终端执行该命令
1.*对比0.*版本脚本使用相关的区别可以参考文章:locust 的 ‘1’ 版本时代变化这篇文章讲解比较到位,其他的相关定义可以搜各种locust相关的博客,只要明白了0.*和1.*之间的区别,写代码就是比较简单的事情了
参数配置
运行我们写好的脚本后,打开浏览器http://0.0.0.0:8089/
我们这里设置用户并发总量为1000,每秒用户增长数量为5,压测目标按照你的目标压测应用填写,当然你的目标必须有任务中的接口,这个比较容易理解的,可以看看其他博客
报告分析
压测过程 正在测试http://www.baidu.com接口,可以看到请求总数量为165,RPS(每秒请求数量)为11.4,
Median(代表响应时间中位数)为8ms,Average(代表平均响应时间)为159ms,可以点击STOP停止测试,Download Data界面可下载测试报告
比较难理解的其实是一些报告参数,我只解释重要且比较难理解的,涉及时间单位为ms:
Request Statistics
Type 请求接口类型
Name 具体接口
Requests 发送请求总量
Fails 失败请求总量
Median 接口响应时间中位数
90%ile 正态分布的90%的接口响应时间小于以下数值
Average 接口平均响应时间
Min 接口最小响应时间
Max 接口最大响应时间
Average size 接口请求中数据交换平均值
Current RPS 当前每秒请求数量
Current Failures/s 当前每秒请求失败数量
Response Time Statistics
50%ile(ms) 正态分布的50%接口响应时间小于该数值
由于接口请求可能会存在异常,所以性能测试中,95%ile(ms)比较具有参考价值,能更好的反映接口性能
Charts
Total Requests per Seconds 随时间增长的请求总量
Response Time 按时间维度看接口响应时间变化
Number of Users 用户增长量,会随着时间增长,最终停留在我们设置的用户并发数量 关于locust还有很多值得探索的地方,这篇文章作为入门的学习记录,后续可以继续研究一下locust的源码,如何利用协程进行并发测试,locust压测脚本的编写异常灵活,大家可以多去网上找一些实战博客,多看别人的代码,locust还是非常值得学习的,如果有兴趣,也可以在它的基础上二次开发,做一个功能更加丰富的平台。