当前位置:网站首页>Locust 1.0版本引入的变化
Locust 1.0版本引入的变化
2022-07-31 07:06:00 【小刘学安卓】
locust升级到1.0版本时,引入了毕竟大的变化,下面总结一下,引文官方文档可以参考Changelog Highlights — Locust 2.10.2.dev27 documentation 。
1、Locust类命名发生变化
1、Locust类和HttpLocust类重命名为User类和HttpUser类;
2、TaskSet类的locust属性也被重命名为user;
3、 Loust类的task_set属性被移除了,取而代之的是在User类上新增了tasks属性;
4、可以在继承User类下,直接使用@task装饰器来定义任务;
5、设置users数量的参数-c / --client 被重命名为-u / --users。
from locust import task, between, TaskSet, User
class MyTaskSet(TaskSet):
@task
def my_task1(self):
print("excuting MyTaskSet my_task1")
@task
def my_task2(self):
print("excuting MyTaskSet my_task2")
class MyUser(User):
tasks = [MyTaskSet]
wait_time = between(5, 15)
@task
def my_task3(self):
print("excuting MyUser my_task3")
2、新增了Tag任务标签
在任务上新增tag标签,在执行时可以使用-T或--tags指定标签执行、-E或--exclude-tags排除指定标签执行。
class MyTaskSet(TaskSet):
@task
@tag("tag1")
def my_task1(self):
print("excuting MyTaskSet my_task1")
@task
@tag("tag1", "tag2")
def my_task2(self):
print("excuting MyTaskSet my_task2")
class MyTaskSet2(TaskSet):
@task
def my_task1(self):
print("excuting MyTaskSet2 my_task1")
@task
@tag("tag2")
def my_task2(self):
print("excuting MyTaskSet2 my_task2")
class MyUser(User):
tasks = [MyTaskSet, MyTaskSet2]
wait_time = between(5, 15)
@task
def userTask(self):
for task in self.tasks:
print(task)
print("excuting MyUser userTask")
执行locust的命令为
locust -f locustTest.py --host=https://www.baidu.com --tags tag1 tag2
3、环境变量发生变化
LOCUST_MASTER 重命名为 LOCUST_MODE_MASTER
LOCUST_SLAVE 重命名为 LOCUST_MODE_WORKER
LOCUST_MASTER_PORT 重命名为 LOCUST_MASTER_NODE_PORT
LOCSUT_MASTER_HOST 重命名为 LOCUST_MASTER_NODE_HOST
CSVFILEBASE 重命名为 LOCUST_CSV
4、其他变化
1、master/slave 机制被改变成master/worker。因此执行命令的--slave、--expect-slaves变成了--worker和--expeted-workers;
2、执行命令中关于--no-web的可选参数变成了--headless;
3、 移除了 Locust.setup、 Locust.teardown、 TaskSet.setup、 TaskSet.teardown,改用 test_start、test_stop事件监听;
from locust import events
@events.test_start.add_listener
def on_test_start(**kw):
print("test is starting")
@events.test_stop.add_listener
def on_test_start(**kw):
print("test is stopping")
4、任务顺序类TaskSequence和顺序装饰器@seq_task被替换为 SequentialTaskSet,SequentialTaskSet将忽略任务的权重,任务的执行顺序以任务声明的顺序来执行。
5、运行数据记录,csv文件,表头发生变化,增加统计,使表头意思更清晰明了;
6、控制台日志,不在用标准输出stdout(或标准错误输出stderr),要输出日志,可以直接用print()进行输出,也可以用logging模块,定义日志。print()现在仅仅用来输出到标准输出stdout中,logging可以输出到log文件
import logging
logging.info("custom logging message)
来看一个脚本模板
import random
from locust import HttpUser, task, between, SequentialTaskSet, tag
# 定义一个任务类,这个类名称自己随便定义,
# 类继承SequentialTaskSet 或 TaskSet类,所以要从locust中,引入SequentialTaskSet或TaskSet
# 当类里面的任务请求有先后顺序时,
# 继承SequentialTaskSet类, 没有先后顺序,可以使用继承TaskSet类
class MyTaskCase(SequentialTaskSet):
# 初始化方法,相当于 setup
def on_start(self):
pass
# @task python中的装饰器,告诉下面的方法是一个任务,
# 这个装饰器和下面的方法被复制多次,改动一下,就能写出多个接口
# 装饰器后面带上(数字)代表在所有任务中,执行比例
# 要用这个装饰器,需要头部引入 从locust中,引入 task
@task
@tag("leave_1")
def regist_(self): # 一个方法, 方法名称可以自己改
url = '/erp/regist' # 接口请求的URL地址
# 定义请求头为类变量,这样其他任务也可以调用该变量
self.headers = {"Content-Type": "application/json"}
self.username = "locust_" + str(random.randint(10000, 100000))
self.pwd = '1234567890'
# post请求的 请求体
data = {"name": self.username, "pwd": self.pwd}
# 使用self.client发起请求,请求的方法根据接口实际选,
# catch_response 值为True 允许为失败 ,
# name 设置任务标签名称 -----可选参数
with self.client.post(url,
json=data,
headers=self.headers,
catch_response=True) as rsp:
if rsp.status_code > 400:
print(rsp.text)
rsp.failure('regist_ 接口失败!')
@task # 装饰器,说明下面是一个任务
def login_(self):
url = '/erp/loginIn' # 接口请求的URL地址
data = {"name": self.username, "pwd": self.pwd}
with self.client.post(url,
json=data,
headers=self.headers,
catch_response=True) as rsp:
# 提取响应json 中的信息,定义为 类变量
self.token = rsp.json()['token']
if rsp.status_code < 400 \
and rsp.json()['code'] == "200":
rsp.success()
else:
rsp.failure('login_ 接口失败!')
@task # 装饰器,说明下面是一个任务
def getuser_(self):
url = '/erp/user' # 接口请求的URL地址
# 引用上一个任务的 类变量值 实现参数关联
headers = {"Token": self.token}
# 使用self.client发起请求,请求的方法 选择 get
with self.client.get(url,
headers=headers,
catch_response=True) as rsp:
if rsp.status_code < 400:
rsp.success()
else:
rsp.failure('getuser_ 接口失败!')
# 结束方法, 相当于teardown
def on_stop(self):
pass
# 定义一个运行类 继承HttpUser类, 所以要从locust中引入 HttpUser类
class UserRun(HttpUser):
tasks = [MyTaskCase]
# 设置运行过程中间隔时间 需要从locust中 引入 between
wait_time = between(0.1, 3)
'''
运行:
在终端中输入:locust -f 被执行的locust文件.py --host=http://被测服务器域名或ip端口地址
也可以不指定host
命令执行成功,会提示服务端口,如:*:8089
此时,则可通过浏览器访问机器ip:8089,看到任务测试页面
'''
边栏推荐
- @Transactional注解的失效场景
- Chapter 9 Exceptions try...except...else...finally
- 多进程全局变量失效、变量共享问题
- 金融租赁业务
- Environment_Variable_and_SetUID
- 双倍数据速率同步动态随机存储器(Double Data Rate Synchronous Dynamic Random Access Memory, DDR SDRAM)- 逻辑描述部分
- iOS大厂面试查漏补缺
- 【解决】npm ERR A complete log of this run can be found in npm ERR
- 2022.07.14_每日一题
- 深度学习通信领域相关经典论文、数据集整理分享
猜你喜欢
随机推荐
正则表达式绕过
开源|商品识别推荐系统
van-uploader uploads images, and cannot preview the image using base64 echo
interrupt and pendSV
那些破釜沉舟入局Web3.0的互联网精英都怎么样了?
Vscode:Project-tree插件
手把手教你开发微信小程序自定义底部导航栏
【第四章】详解Feign的实现原理
安装部署KubeSphere管理kubernetes
2704:寻找平面上的极大点
2022.07.15_每日一题
2022.07.24_Daily Question
电压源的电路分析知识分享
mysql插入新字段方法
科普 | “大姨太”ETH 和 “小姨太”ETC的爱恨情仇
报销流程|By天放师兄
NK-RTU980烧写裸机程序
2022.07.18 _ a day
‘vite‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
Leetcode952. 按公因数计算最大组件大小