locust官方API文档:https://docs.locust.io/en/stable/api.html
开源
python开发
基于事件
支持分布式
Web UI 执行测试 / 结果展示
性能测试工具
gevent:基于协程的python网络库,它使用greenlet在libev或libuv事件循环之上提供高级同步API
flask:是一个微型的Python开发的Web框架
requests:Python Http库
msgpack-python:主要提供MessagePack数据序列化及反序列化的方法
pyzmq:用来实现Locust的分布式模式运行
安装命令
pip install locust
查看版本命令
locust --version
打开pycharm --> 创建dept_list.py文件 --> 将以下脚本复制到文件中
from locust import HttpUser, TaskSet, task
import json
# 定义每个用户的任务集合
class DeptList(TaskSet):
# 任务A--GET示例
@task(7) # 权重 7/ 10
def t_login(self):
url = '/api/ip/ipdept/deptList'
h = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "sessionToken=2e183b7bb566461d"}
data = {'draw': '5',
'start': '0',
'length': '13',
'deptTypes': '[]',
'defunctInd': 'N',
'searchStr': 'FSK_01',
'_': '1597112917355'}
# catch_response =True:允许该请求被标记为失败
with self.client.get(url, headers=h, params=data, catch_response=True) as response:
if response.status_code == 200:
response.success()
# 任务B--POST示例
@task(3) # 权重 3/ 10
def t_query_dept(self):
url = '/api/ip/entity/save'
h = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Content-Length": "355",
"Cookie": "sessionToken=6b67c3bfd60c4008"}
entity = {"ipEntityMstrId": 7233101,
"entityCode": "BLL1",
"entityDesc": "BLL2019",
"entityDescLang1": "BLL2019#",
"shortCode": "BLL",
"seqNo": "1",
"entityNameAlias": "BL",
"entityNameAlias1": "BL#",
"addressDetail": "详细地址111"}
body = {'entityInfo': json.dumps(entity)}
with self.client.post(url, headers=h, data=body, catch_response=True) as response:
if response.status_code == 200:
response.success()
# 继承Locust类
# 生成的每一个虚拟的HTTP用户
# 用来发送请求到进行负载测试的系统
class Login(HttpUser):
tasks = [DeptList]
# 权重
weight = 1
# 执行事务之间用户最小等待时间
min_wait = 1000
# 执行事务之间用户最大等待时间
max_wait = 3000
# 超时时间
stop_timeout = 5
host = "10.227.253.226:7000"
运行脚本文件
dept_list.py对应cmd命令窗口下执行以下命令
locust -f dept_list.py --host=http://10.227.253.226:7000
1、导入HttpLocust,在运行时报
ImportError: The HttpLocust class has been renamed to HttpUser in version 1.0
解决办法:
将from locust import HttpLocust 修改成 from locust import HttpUser
2、运行时报
DeprecationWarning: Usage of User.task_set is deprecated since version 1.0. Set the tasks attribute instead (tasks = [DeptList])
解决办法:
将task_set = DeptList 修改成 tasks = [DeptList]
打开浏览器中,输入http://localhost:8089/
页面参数说明:
Number of total users to simulate:要模拟的总用户数
Hatch rate (users spawned/second):每秒生成的用户数
Host (e.g. http://www.example.com):测试服务器地址
Start swarming:开始运行性能测试
工具栏参数说明:
HOST
http://10.227.253.226:7000:被测服务器地址
STATUS
RUNNING
10 users:运行10个虚拟用户
RPS
3.7:每秒请求数
FAILURES
0%:运行失败比例
STOP:停止
Reset Stats:重置统计信息
列表参数说明:
Type: 请求的类型,例如GET/POST
Name:请求的路径
request:当前请求的数量
fails:当前请求失败的数量
Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值
Average:平均值,单位毫秒,所有请求的平均响应时间
Min:请求的最小服务器响应时间,单位毫秒
Max:请求的最大服务器响应时间,单位毫秒
Content Size:单个请求的大小,单位字节
reqs/sec:是每秒钟请求的个数
启动mastr节点:locust -f dept_list.py --master
启动worker节点:locust -f dept_list.py --worker
在其他机器上启动worker节点:locust -f dept_list.py --worker --master-host=192.168.x.xx
Host格式一定要正确,不然的话启动后会报:
raise InvalidSchema(“No connection adapters were found for ‘%s’” % url)
No connection adapters were found for ‘10.227.253.226:7000/api/ip/ipdept/deptList’
locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
–no-web: 表示不使用Web界面运行测试
-c:设置虚拟用户数
-r:设置每秒启动虚拟用户数
-t:设置设置运行时间
1、rps、平均响应时间波动图没有持久化存储,刷新后便丢失
2、整体统计信息只是表格的形式,不能体现波动时序
3、测试报告过于简陋且只有文字版,只能下载存档
Locust + Prometheus + Grafana
参考:https://testerhome.com/topics/24873