Locust性能测试工具核心技术@task和@events
Tasks和Events是Locust性能测试工具的核心技术,有了它们,Locust才能称得上是一个性能工具。
Tasks
从上篇文章知道,locustfile里面必须要有一个类,继承User类,当性能测试开始后,会产生一个User类实例,这就是常说的模拟用户。这些用户会选择task执行,休眠一会,再选择新的task,不断迭代。
task是Python中的可调用对象,它是一项任务,对于Web系统来说,可以是登录、查询、下订单、支付等等。
@task装饰器
@task是定义task最简单直接的方式,比如:
from locust import User, task, constant
class MyUser(User):
wait_time = constant(1)
@task
def my_task(self):
print("User instance (%r) executing my_task" % self)
@task有一个可选参数,用来设置task的选择权重,比如:
from locust import User, task, between
class MyUser(User):
wait_time = between(5, 15)
@task(3)
def task1(self):
pass
@task(6)
def task2(self):
pass
task2比task1被选择的可能性大两倍。
tasks属性
除了@task装饰器,还可以设置User类的tasks属性来定义任务,比如:
from locust import User, constant
def my_task(user):
pass
class MyUser(User):
tasks = [my_task]
wait_time = constant(1)
注意,my_task()函数有一个参数,它是User类的实例。
tasks可以是一个列表:
tasks = [my_task1, my_task2, my_task3]
Locust会使用Python中的random.choice()从里面随机选取。
tasks也可以是一个字典:
{my_task: 3, another_task: 1}
后面的int型键值代表的是被选择权重,这个字典等价于列表:
[my_task, my_task, my_task, another_task]
@tag装饰器
@tag用来打标记,在运行时选择哪些task执行,哪些task不执行。比如:
class MyUser(User):
wait_time = constant(1)
@tag('tag1')
@task
def task1(self):
pass
@tag('tag1', 'tag2')
@task
def task2(self):
pass
@tag('tag3')
@task
def task3(self):
pass
@task
def task4(self):
pass
- 如果使用
--tags tag1
,那么只有task1和task2会被选择。 - 如果使用
--tags tag2 tag3
,那么只有task2和task3会被选择。 - 如果使用
--exclude-tags tag3
,那么只有task1、task2和task4会被选择。
注意,exclude的优先级更高,如果某个tag既包括又排除,那么会被排除。
Events
@task定义了性能测试的执行动作,@events作为补充,定义了测试开始前和测试结束后的处理。
注意,每个模拟用户开始和结束的处理是使用的User类的on_start()和on_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")
分布式执行时,它们只会在master节点生效。
init
init和test_start不同,它会在每个Locust进程开始时触发,分布式执行时,每个节点(worker进程)都会生效。
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")
Events是一项hook技术,在学习Locust高级用法时再做进一步介绍。
Locust项目结构
官方建议如下:
common/
__init__.py
auth.py
config.py
locustfile.py
或者locustfiles/
api.py
website.py
requirements.txt
FastHttpUser
从上篇文章可以知道,HttpUser类比User类更常用,它的client属性是HttpSession类(requests.Session子类)的一个实例,可以使用requests发HTTP请求:
# 使用HttpUser
from locust import HttpUser,task,constant
class MyUser(User):
wait_time = constant(1)
@task
def my_task1(self):
with self.client.get("https://www.baidu.com/", catch_response=True) as res:
if res.status_code == 200:
print("成功")
else:
print("失败")
但是requests性能是不太好的,如果要产生更高的压力,建议使用FastHttpUser,性能可以提升5到6倍:
# 使用FastHttpUser
from locust import task, constant
from locust.contrib.fasthttp import FastHttpUser
class MyUser(FastHttpUser):
wait_time = constant(1)
@task
def my_task(self):
with self.client.get("https://www.baidu.com/", catch_response=True) as response:
if response.status_code == 200:
print("成功")
else:
print("失败")
由于它们的API不一样,都有各自的适用场景,所以FastHttpUser不能完全替代HttpUser。
小结
本文严格来说是上篇文章《locustfile中的User类和HttpUser类》的下篇,介绍了核心技术Tasks和Events,并给出了官方推荐的项目结构,最后介绍了比HttpUser性能更好的FastHttpUser,如果想要更多的并发,可以考虑使用后者。经过这两篇文章的学习,已经可以开始动手实践使用Locust进行性能测试了。如果使用locust命令启动后,无法打开网页,可以试试加上参数:locust --web-host="127.0.0.1"
。
参考资料:
https://zhuanlan.zhihu.com/p/118470760
https://docs.locust.io/en/stable/writing-a-locustfile.html#tasks
https://www.axihe.com/tools/locust/increase-performance.html
Locust性能测试工具核心技术@task和@events的更多相关文章
- Locust 性能测试工具安装使用说明
1. 介绍 它是一个开源性能测试工具.使用 Python 代码来定义用户行为.用它可以模拟百万计的并发用户访问你的系统. 性能工具对比 LoadRunner 是非常有名的商业性能测试工具,功能 ...
- Locust性能测试工具的安装及实际应用
一.安装Locust 安装Locust之前先安装的库:gevent库:第三方库,gevent为python提供了比较完善的协程支持.使用gevent,可以获得极高的并发性能. pip install ...
- 开源性能测试工具Locust使用篇(二)
那如何理解Locust和TaskSet这两个类呢? class HttpLocust(Locust) 在Locust类中,具有一个client属性,它对应着虚拟用户作为客户端所具备的请求能力,也就是我 ...
- 性能测试工具Locust
An open source load testing tool. 一个开源性能测试工具. define user behaviour with python code, and swarm your ...
- 性能测试工具Locust的使用
一.写在前面 官网:https://www.locust.io/ 官方使用文档:https://docs.locust.io/en/latest/ 大并发量测试时,建议在linux系统下进行. 二.L ...
- Python3中性能测试工具Locust安装使用
Locust安装使用: 安装: python3中 ---> pip3 install locust 验证是否安装成功---> 终端中输入 locust --help ...
- 性能测试工具Locust,一个开源性能测试工具
性能测试工具Locust,一个开源性能测试工具使用Python代码来定义用户行为.用它可以模拟百万计的并发用户访问你的系统.1.它与目前主流的LoadRunner和Jmeter玩法都不一样.2.它完全 ...
- 性能测试工具Locust的介绍和使用
内容来自网络 https://www.w3xue.com/exp/article/20191/16707.html https://blog.csdn.net/qq_36255988/article/ ...
- 基于python的性能测试工具–locust
现在有很多的性能测试工具,比如说我们熟悉的loadrunner.jmeter.ab.webbench等等,这些工具如果对一个没用过的朋友来说,学习起来比较不容易,但是如果你能看懂python代码,会写 ...
随机推荐
- jasypt在springboot项目中遇到异常:Error creating bean with name 'enableEncryptablePropertySourcesPostProcessor' defined in class path resource
背景 在使用jasypt对spring boot的配置文件中的敏感信息进行加密处理时,使用stater直接启动时,遇到了一个异常 <dependency> <groupId>c ...
- python 匿名函数,内置函数
一 :匿名函数 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使 ...
- 使用docker快速安装软件
安装mysql mkdir /opt/mysql /opt/mysql/etc /opt/mysql/data docker run -itd --name mariadb -e MYSQL_ROOT ...
- java语言写一个建议的五子棋
经过16天的java学习,也学得了不少关于Java方面的知识,我想分享一下我用java写的一个简单的五子棋. 游戏规则: (1)对局双方各执一色棋子.(2)空棋盘开局.(3)白先.黑后,交替下子,每次 ...
- 【SpringBoot】Spring Boot
Spring Boot是由Pribotal团队提供,设计用来简化新Spring应用的初始搭建和开发过程的开源框架. 随着Spring体系越来越庞大,各种配置也是越来越复杂,Spring Boot就是解 ...
- 逆向工程第005篇:跨越CM4验证机制的鸿沟(下)
一.前言 本文是逆向分析CM4系列的最后一篇,我会将该游戏的序列号验证机制分析完毕,进而编写出注册码生成器. 二.分析第二个验证循环 延续上一篇文章的内容,来到如下代码处: 图1 上述代码并没有特别需 ...
- 在kubernetes上运行WASM负载
在kubernetes上运行WASM负载 WASM一般用在前端业务中,但目前有扩展到后端服务的趋势.本文使用Krustlet 将WASM服务部署到kubernetes. 简介 Krustlet 是一个 ...
- apache-tomcat-7.0.92
链接:https://pan.baidu.com/s/1wnTSjTknYfaeDV_pakrC9g 提取码:see7
- PHP 下载apk文件
方式一.public function downApkFile(){ $path = Env::get('root_path')."apk/"; //路径 $file_name = ...
- Faust——python分布式流式处理框架
摘要 Faust是用python开发的一个分布式流式处理框架.在一个机器学习应用中,机器学习算法可能被用于数据流实时处理的各个环节,而不是仅仅在推理阶段,算法也不仅仅局限于常见的分类回归算法,而是会根 ...