Locust翻译成中文就是蝗虫的意思,就像蝗虫一样对系统发起成千上万的请求。以测试系统能否在高并发下正常运行 ,它是一款python的第三方开源的性能测试库,。完全基于poython开发,并采用了基于事件的处理机制。具有明显的特点
简单易学,可以快速开发性能测试脚本
开源免费
分布式执行,在多台机器上对系统发起持续请求
基于事件驱动 与其他常用工具不同的是 Locust采用的是协程的方式 可以达到更高数量级的并发
不支持监控 需要配合其它监控工具
Locust是python的第三方库 所以可以用pip下载
>>>pip install Locust
安装完成后 可以先压测一个接口 感受 一下
这个脚本大致分为两个模块
首先 编写第一个继承自TaskSet类 先压测一个首页的接口
导入所需模块 由于headers每个接口都会用所以先定义成全局变量
TestIndex继承自TaskSet类 这个类里的方法就是要压测的接口了
getinex首页请求方法 client和requests的用法一样
三个参数分别是: 请求接口的路径 headers name参数是说明一下这个是什么接口
@task采用可选的weight参数,该参数可用于指定任务的执行率 如果一个任务是2 另一个4 那么4的执行量是2的两倍
#导入locust相关模块
from locust import HttpLocust,TaskSet,task
#定义一个任务类 继承TaskSet
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
class TestIndex(TaskSet):
@task(2)
def getindex(self):
#client是Taskset类的方法 其实就相当于requests请求
# @task加一个注解 声明是一个任务
res= self.client.post("/index/info",headers=headers,name="打开首页")
然后TaskSet就算写完了 接下来就是用户类
host:是请求url的域名
Task_set:指向当前的用户类要执行那个任务
between 指定等待时间 参数 :
min_wait :最小等待时间
max_wait:最大等待时间
class WebSite(HttpLocust):
"""该类 用于配置用户请求"""
host = "http://127.0.0.1:5000"
task_set = TestIndex
wait_time = between(1,2)
一个简单的首页接口压测就算写完了 来运行一下看看效果
DOS窗口 进入py文件所在目录 输入 如下命令开启服务
locust -f TestIndex.py --web-host="127.0.0.1"
开启成功后 在浏览器输入 127.0.0.1:8089 打开Locust的web服务页 在该页面进行一些配置
第一个输入框是配置一共生成多少个用户总数
第二个输入框配置每秒钟生成几个用户数
配置好以后 点击开始测试 这就完成了 真对首页的接口压测的脚本的开发
接下来再写一下登录接口的压测脚本
@task(2)
def test_login(self):
data = {"phone":1234567898,"password":123456 }
self.client.post("/login/login",headers=hraders,data=data,name="登录")
class WebSite(HttpLocust):
"""该类 用于配置用户请求"""
host = "http://127.0.0.1:5000"
task_set = TestIndex
wait_time = between(1,2)
开启服务和首页操作时的一样
以登录接口为 使用参数化登录不同的账户 举两个账户登录的参数化吧
首先 可以把准备要做参数化的数据放在程序里 放在list数组
也可以分离在文件里 然后再读出来
登录的password可以一样所以在测试的时候为了方便都设置成123456 只有账号不能重复 所以只需要参数化帐号就行了
@task(2)
def test_login(self):
#取出WebSite用户类中的uiserdata 调用choice进行随机取值
#locust指向的就是用户类 WebSite
userinfo = choice(self.locust.userdata)
data = {"phone":userinfo,"password":123456 }
res = self.client.post("/login/login",headers=hraders,data=data,name="登录")
assert res.status_code == 200
class WebSite(HttpLocust):
"""该类 用于配置用户请求"""
host = "http://127.0.0.1:5000"
task_set = TestIndex
wait_time = between(1,2)
userdata = [12345678987,13242432452]
然后执行
也可以帐号和密码都写在文件里 一个帐号密码卸载一行 中间用逗号分割
在当前路径下新建一个文件夹 data 用于存放数据 在data文件夹内 新建一个文件 写入测试的账户数据
把txt文件内的数据读取出来 进行拼接
@task(2)
def test_login(self):
#取出WebSite用户类中的uiserdata 调用choice进行随机取值
userinfo = choice(self.locust.userdata)
username = userinfo.split(',')
data = {"phone":userinf[0],"password":username[1] }
res = self.client.post("/login/login",headers=hraders,data=data,name="登录")
assert res.status_code == 200
class WebSite(HttpLocust):
"""该类 用于配置用户请求"""
userdata = []
host = "http://qgyilingmuyan.com/api/common"
task_set = TestIndex
wait_time = between(1,2)
#读取出文件内的数据
with open("data/username.txt",'r') as file:
#每次循环遍历一行数据
for line in file.readlines():
#去掉前后空格后 追加到userdata数组里
userdata.append(line.strip())
下一个接口需要上一个接口的依赖参数才可以正常请求 在实际项目很多都是这样的接口 列如 :查看我的页面必须要登录接口的token或Cookeis才可以被访问
@task(2)
def test_login(self):
data = {"phone":12345678987,"password":123456 }
res = self.client.post("/login/login",headers=headers,data=data,name="登录")
assert res.status_code == 200
headers['token']= res.json()['data']['token']
@task(2)
def user_myinfo(self):
res = self.client.post("/user/my_info",headers=headers,name="我的")
assert res.status_code == 200
print(res.json())
如果压测电脑的CPU有四个内核 那么利用locust执行一次压测 用户数是50 locust就会在一个CPU内核中释放50个协程进行压力测试 另外三个内核是闲置的 为了达到资源利用的目的 所以可以使用分布式压测
分布式有有两种机器组成 :
控制机只能有一个 资源机可以有N个 意思就是一个控制机 带动多个资源机去压测项目
在运行脚本的时候 master是不用于脚本的 都是 slave在执行 。多个slave既可以在同一台电脑上 也可以在不同的电脑上
说完了原理后 先做一下 在同一台设备上运行 首先 需要启动maste 控制机
启动的方法 就是原有的基础的后面 加一个 --maste 就可以了
locust -f TestIndex.py --web-host="127.0.0.1" --maste
这个时候 打开浏览器的locust的 ui界面 会发现右上角就多了slaves的显示 因为还没有添加任何的slaves所以显示为0
然后如果现在输入10用户数 去跑这个脚本 是不会运行的 因为master只负责管理控制 资源机 它不执行脚本
控制机开启后 再打开一个DOS命令
locust -f TestIndex.py --slave --web-host="127.0.0.1"
这时候再打开locust的UI界面 就看到slaves变成了1
如果电脑的cpu有4个内核 每开启一个slaves服务都会在一个内核里释放一些协程 那么这台电脑除去一个控制机外 可以开3个slaves服务
在另一 台用户当作资源机的电脑上进行分布式压测 资源电脑需要安装环境 如python和locust等 (版本尽量保持一致)
DOS命令开启服务 和在同一台电脑上不同的是 需要指定master控制机的ip
locust -f TestIndex.py --slave --master-host="192.xxx.xxx"