Locust使用方法
Locust介绍
Locust是基于python的性能测试工具,优点是并发高,资源占用小,缺点是报告简陋,不支持资源监控。
Writing a locustfile
locustfile是一个普通的python文件。里面必须含有一个User类。
User
一个User类,代表一个用户或者一个locust集群。locust会为每个用户生成一个实例,User类里面可以添加自定义函数。
wait_time
User类中包含一个可选项 wait_time ,用于设置在每个task运行之后的等待时间,如果不设置wait_time,会马上执行下一个task。
它有三个内置参数:
constant :固定时长
between:在区间内随机取值
constant_pacing:每x秒运行一次
例如,在每个任务间隙。等待0.5-10秒钟:
from locust import User, task, betweenclass MyUser(User):@taskdef my_task(self):print("executing my_task")wait_time = between(0.5, 10)
也可以在user类中自定义时间函数,例如,每次运行后将休眠1秒、2秒、3秒……
class MyUser(User):last_wait_time = 0def wait_time(self):self.last_wait_time += 1return self.last_wait_time
weight
如果locustfile文件中有多个user类,可以在命令行中指定所使用的user,如果不指定,locust将为每个user分配相同的优先级
$ locust -f locust_file.py WebUser MobileUser
想要模拟多个用户,可以通过设置weight来实现优先级的设置
下面的例字中,web用户执行的概率是移动用户的三倍
class WebUser(User):weight = 3...class MobileUser(User):weight = 1...
host
host属性是一个url的前缀,通常会在locust页面或者启动命令行指定,命令行中使用的是 --host 参数
如果页面跟命令行中都未指定host,会使用user类中定义的host参数
tasks
在user类中,可以通过 @task 装饰器,将一个函数定义为task
environment
可以通过调用runner的Environment实现终止运行的目的
self.environment.runner.quit()
如果运行的是单独的locust实例,会终止整个locust的运行,如果是分布式的子节点,就只会终止这个子节点的运行
on_start 跟 on_stop
User跟TaskSets类都有 on_start 跟 on_stop 函数,
对于User类,开始时运行on_start,结束时运行on_stop
对于TaskSets类,当虚拟用户开始执行task时,运行on_start,结束时(一般是由中断 interrupt()或者结束虚拟用户进程)运行on_stop
Tasks
当开始负载测试,会为每个虚拟用户创建一个User类,占用一条线程,然后可以选择要执行的任务、休眠一段时间、执行新任务等等
这些任务是普通的python调用
@task
使用修饰器 @task ,是添加一个task的最简单的方式
from locust import User, task, constantclass MyUser(User):wait_time = constant(1)@taskdef my_task(self):print("User instance (%r) executing my_task" % self)
@task(n) n代表的是可选参数 weight ,用于指定task执行的比率,
下面例字中,task(2)执行概率是 task(1)的两倍
from locust import User, task, betweenclass MyUser(User):wait_time = between(5, 15)@task(3)def task1(self):pass@task(6)def task2(self):pass
tasks
定义用户任务的另一个方法是设置 tasks 属性
tasks 是一个task列表,或者一个task字典,task既可以是python对象,也可以是TaskSet类。如果任务是一个普通的python函数,它们会收到一个参数,即执行任务的用户实例。
下面是一个User任务被定义为python函数的例子:
from locust import User, constantdef my_task(user):passclass MyUser(User):tasks = [my_task]wait_time = constant(1)
如果tasks属性被指定为一个列表,那么每次执行任务时,都会从tasks属性中随机选择任务。
如果tasks是一个字典,将要执行的任务将被随机选择,value作为比率。
字典是这样的:
{my_task: 3, another_task: 1}
@tag
可以使用 @tag 装饰器标记任务,用来选择需要执行的任务。命令是:–tags 跟 --exclude-tags
例如:
from locust import User, constant, task, tagclass MyUser(User):wait_time = constant(1)@tag('tag1')@taskdef task1(self):pass@tag('tag1', 'tag2')@taskdef task2(self):pass@tag('tag3')@taskdef task3(self):pass@taskdef task4(self):pass
如果在启动命令中输入 --tags tag1
,只有task1跟task2会被执行
如果输入 --tags tag2 tag3
,只有task2跟task3会被执行
--exclude-tags
是不执行的意思
如果启用命令中输入 --exclude-tags tag3
,只有task1,task2跟task4会被执行
exclude优先级较高,如果一个task既有–tags 又有–exclude,则不执行。
Events
events中可以实现hooks
test_start 跟 test_stop
在测试前需要执行的代码,可以放在 test_start 中
在测试后需要执行的代码,可以放在 test_stop 中
from locust import events@events.test_start.add_listener
def on_test_start(environment, **kwargs):print("A new test is starting")@events.test_stop.add_listener
def on_test_stop(environment, **kwargs):print("A new test is ending")
当分布式运行时,他们只会在主节点运行
init
init会在locust进程开始时触发,它在分布式运行中特别有用,因为每个子节点都需要做一些初始化。
例如,所有子节点都需要引用一个全局变量
from locust import events
from locust.runners import MasterRunner@events.init.add_listener
def on_locust_init(environment, **kwargs):if isinstance(environment.runner, MasterRunner):print("I'm on master node")else:print("I'm on a worker or standalone node")
HttpUser class
httpUser类有一个cleint属性,可以用于发出HTTP请求
from locust import HttpUser, task, betweenclass MyUser(HttpUser):wait_time = between(5, 15)@task(4)def index(self):self.client.get("/")@task(1)def about(self):self.client.get("/about/")
client / HttpSession
client是 HttpSession的实例,封装了很多我们熟悉的request请求,包括:get,post,put等,可以接受响应(success/fail, response time, response length, name)
类似于requests.Session,它可以保存请求获得的cookie,便于页面登录
response = self.client.post("/login", {"username":"testuser", "password":"secret"})
print("Response status code:", response.status_code)
print("Response text:", response.text)
response = self.client.get("/my-profile")
HttpSession 捕获所有RequestException(由连接错误、超时或类似原因引起),并返回一个假响应,将其中status_code设置为0,content设置为None
Validating responses
大部分时间我们请求一个接口,希望返回请求成功的响应码,但有些场景可能需要故意请求一个错误的接口,响应码可能是404,301等等,可以通过 catch_response 、with语句、response.failure()处理失败的请求。
with self.client.get("/", catch_response=True) as response:if response.text != "Success":response.failure("Got wrong response")elif response.elapsed.total_seconds() > 0.5:response.failure("Request took too long")
可以将失败的请求,改写为成功
with self.client.get("/does_not_exist/", catch_response=True) as response:if response.status_code == 404:response.success()
可以使用with捕获异常或者抛出一个 locust exception,避免这次请求被记录到结果中
from locust.exception import RescheduleTask
...
with self.client.get("/does_not_exist/", catch_response=True) as response:if response.status_code == 404:raise RescheduleTask()
Locust使用方法相关推荐
- locust 性能测试使用教程
http://localhost:8089/#刚刚接触 locust 测试库,记录先使用的过程及问题记录: 1.在安装时建议不要使用太高的版本,这样发现问题可以有文档借鉴 使用过程: 1.安装 loc ...
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- python locust 能压测数据库_python locust 性能测试:HOOKS钩子方法
为locust中不同类型的事件,提供的钩子方法: from locust import TaskSet, task, events, Locust from locust.clients import ...
- pythonlocust使用方法_使用python的locust库进行性能测试
Locust(俗称 蝗虫), 一个轻量级的开源压测工具,用Python编写. 安装 pip3 install locust Python编写性能测试脚本 import json from locust ...
- python locust 性能测试:HOOKS钩子方法
为locust中不同类型的事件,提供的钩子方法: from locust import TaskSet, task, events, Locust from locust.clients import ...
- pythonlocust使用方法_python locust 性能测试:locust安装和一些参数介绍
安装参考 https://www.cnblogs.com/fnng/p/6081798.html ps:python3.7暂不支持locust:python3安装建议克隆github上的项目 可能需要 ...
- 深入浅出开源性能测试工具 Locust (使用篇 1)
在<[LocustPlus序]漫谈服务端性能测试>中,我对服务端性能测试的基础概念和性能测试工具的基本原理进行了介绍,并且重点推荐了Locust这一款开源性能测试工具.然而,当前在网络上针 ...
- 【转载】locust性能测试3
#coding=utf-8 from locust import HttpLocust,TaskSet,task import queue import randomclass test_taskse ...
最新文章
- 3. 什么是icmp?icmp与ip的关系_「2020.12.3」黄俊捷热搜被爆料?郭俊辰交往女朋友?为什么三只跨年不合体?郝富申和王俊凯关系?Naomi和alracco?...
- 决策树 prepruning_数据挖掘入门系列教程(三点五)之决策树
- PHP入门04 -- 面向对象程序设计
- shell 删除了hdfs 文件_从零开始学大数据(三) Shell操作HDFS文件系统-中
- 介绍两款WordPress文章转移插件
- 找不到该项目,请确认该项目的位置的解决办法
- IDEA使用@Data注解,类调用get、set方法标红的解决办法
- jmeter学习总结
- 面向太阳,不问春暖花开
- python正版软件多少钱_多款正版软件 + 付费教程迎来史低价,少数派「双十一」活动全面开始...
- 想自学单片机,各位有什么书和板子值得推荐的吗?
- Docker技术之容器与外部相连
- 自动文本摘要任务背景调研
- 微信群活码生成系统,群活码、客服活码、一套非常棒的免费开源群活码系统
- 解决vue中父组件传图片路径src给子组件却无法正常显示图片的原因
- 一线城市与三线城市的IT生活——从《机器灵 砍菜刀》说开去
- 酷鲨商城后台管理界面
- php artisan怎么用,php artisan常用方法
- 基本上都是基本语言知识
- mysql 批量更新和单条更新(循环)
热门文章
- 一位散户高手的炒股心得
- Python实现SSA智能麻雀搜索算法优化支持向量机回归模型(SVR算法)项目实战
- ubuntu虚拟化技术OpenVZ
- 【流畅的Python学习笔记】2023.4.22
- [转载]打工辛酸路:我是一朵飘零的花之22
- oracle 监听起不来的解决方法
- 广西民族大学相思湖学院计算机考试,广西民族大学相思湖学院教务处,教务管理系统...
- Vue自定义表单生成器,通过Json生成表单
- layui laydate 渲染失效问题,lay-key导致动态生成代码二次渲染失败
- Postman报错:Error: NETERR: getaddrinfo ENOTFOUND localhost