python_locust实现http接口性能测试
python_locust实现http接口性能测试
locust官方API文档:https://docs.locust.io/en/stable/api.html
locust简介
开源
python开发
基于事件
支持分布式
Web UI 执行测试 / 结果展示
性能测试工具
locust使用的核心库
gevent:基于协程的python网络库,它使用greenlet在libev或libuv事件循环之上提供高级同步API
flask:是一个微型的Python开发的Web框架
requests:Python Http库
msgpack-python:主要提供MessagePack数据序列化及反序列化的方法
pyzmq:用来实现Locust的分布式模式运行
Locust压测组件图
主流压测工具对比
安装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’
主从模式下测试结果
no_web模式命令
locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
–no-web: 表示不使用Web界面运行测试
-c:设置虚拟用户数
-r:设置每秒启动虚拟用户数
-t:设置设置运行时间
Locust web模式的性能监控和展示的明显缺陷:
1、rps、平均响应时间波动图没有持久化存储,刷新后便丢失
2、整体统计信息只是表格的形式,不能体现波动时序
3、测试报告过于简陋且只有文字版,只能下载存档
# Locust web模式的性能监控和展示优化解决方案
Locust + Prometheus + Grafana
参考:https://testerhome.com/topics/24873
python_locust实现http接口性能测试相关教程
panolens.js实现简单的全景预览
panolens.js实现简单的全景预览 1、下载js文件 (panolens.js 和 依赖插件 three.js) 1) threejs 下载地址https://threejs.org/ 2)panolens.js 下载地址https://github.com/pchen66/panolens.js 本人百度网盘整理地址: 链接:https://pan.baidu.com/s/1lxWX
exp3-挖矿的简易实现
exp3-挖矿的简易实现 文章目录 参考 挖矿 篡改 bilibili luotuo exp1-POW的简单实现 exp2-构造简单区块链 会有一个难度值,计算符合难度值要求的哈希字符串,比如说,难度值nonce = 1,就要找前面有1个0开头的哈希字符串 class Block { constructor(data,prev
SpringBoot下使用ShardingShere实现分表操作
SpringBoot下使用ShardingShere实现分表操作 SpringBoot下使用ShardingShere实现分表操作 表结构: 因为后面使用了雪花算法保证生成的id唯一性,所以id列设置为bigInt类型 项目结构: dependency groupIdorg.springframework.boot/groupId artifactIdspring-b
python实现 感知机(Perceptron)算法
python实现 感知机(Perceptron)算法 1. 感知机简介 神经网络如下图所示: 上图中每个圆圈都是一个神经元,每条线表示神经元之间的连接。我们可以看 到,上面的神经元被分成了多层,层与层之间的神经元有连接,而层内之间的 神经元没有连接。最左边的层叫做
内核epoll的实现原理及用户态epoll的设计思路
内核epoll的实现原理及用户态epoll的设计思路 1.思考 在tcp的编程接口socket,bind,connect,listen,accpect,recv,send,close这些中,哪些动作对方能感知到可以产生回调?connect,send,close,recv 2.何时回调epoll模块 1.三次握手成功时,会有一次回
单态设计模式的实现原来是构造方法的私有化
单态设计模式的实现原来是构造方法的私有化 我们知道类的封装可以对属性,也可以对方法。当然也可以 封装构造函数 。 为什么要封装构造函数!!?耐心点看过程,最后你就知道了 单态设计模式的核心就是将类的构造方法私有化,之后在类的内部产生实例化对象,
实现两个字符串获取两个指定字符串中的最大相同子串
实现两个字符串获取两个指定字符串中的最大相同子串 Java实现两个字符串获取两个指定字符串中的最大相同子串并打印出来 思路 图 代码 思路 取长度较小的字符串,取其长度依次递减的子字符串,再判断较长的字符串中是否包含此子字符串,第一次出现便为两字符串
vue实现的后台管理系统
vue实现的后台管理系统 vue后台管理系统 记录一次后台管理系统项目,需要的朋友私聊我拿源码 vue后台管理系统 介绍 效果图 代码实现 登录 用户页 权限页 路由 总结 介绍 这是在在学校对vue进行学习后搭建的小项目。该后台管理系统为spa单页项目,前后端分离,