LocustFile编写

LocustFile编写

编写LocustFile 可以使得我们的性能测试功能更加强大实现我们自定义的测试路径及判断错误等方法!

LocustFile Demo

来自 LousctFile 官网例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
wait_time = between(1, 5)

@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")

@task(3)
def view_items(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="/item")
time.sleep(1)

def on_start(self):
self.client.post("/login", json={"username":"foo", "password":"bar"})

这里我想还是采用官网的例子介绍,为了防止我讲的不够清晰 大家也可以访问下面的链接去官网查看

https://docs.locust.io/en/stable/writing-a-locustfile.html

解释(我的理解)

其实从中可以看到这个案例和我们平常写的类好像没什么区别,除了继承了HttpUser,以及用例@task 装饰器

那么首先来看一下具体实现了什么功能呢?

on_start()

这个类实现了一个性能测试脚本,在每个模拟用户启动时,都会调用此名称的方法 会先运行 on_start这个函数,然后进行了请求这里的host 可以在shell中指定也可以在web ui的那个界面中输入,可以看到进行了一个post请求,路径是 /login, 请求体是一个json对象

然后会在继续执行 这里的@task 着重讲一下

task 装饰器

@task 装饰器 表明当前方法是一个任务

@task 是locust文件的核心。对于每个正在运行的用户,Locust 都会创建一个greenlet(协程或“微线程”),然后进行请求,要注意此时不是并发请求,是在/hello 响应返回后才会继续请求/world

@task(3) 其中3是指权重,虽然程序运行是随机选择任务单是你给予了更大的权重的话运行的次数会更加多

wait_time

wait_time 方法在每次任务执行后引入延迟。如果没有指定wait_time,则下一个任务将在上一个任务完成后立即执行。

有四个函数 分别是:constant、 bettwen、 constant_throughput、constant_pacing

constant: 在固定的时间内

让每个用户每次执行固定的时间 1秒:

1
wait_time = constant(0.5, 10)

bettwen: 在最小值和最大值之间的随机时间

让每个用户在每次执行任务之间等待 1 到 4 :

1
wait_time = between(0.5, 10)

constant_throughput:返回一个跟踪任务运行时间的函数,每次调用时,它将返回一个等待时间,该等待时间将尝试使每秒执行的任务运行次数等于 task_runs_per_second 参数指定的时间

也就是说:以恒定的速率执行任务。它允许用户设置每秒或每分钟需要执行的任务数,以确保性能测试的稳定性。

应用场景:

在性能测试中,可能需要模拟不同的用户行为,如登录、搜索、购买等。constant_throughput 可以确保这些任务以恒定的速率执行,从而更准确地评估系统的性能和稳定性。

在生产环境中,有时需要根据客户的需求设置应用的吞吐量。constant_throughput 可以帮助确保应用能够满足用户的需求,同时保持系统的稳定性。

也是 constant_pacing 的倒数

无论任务执行时间如何,任务将始终每 10 秒执行一次:

1
wait_time = constant_throughput(0.1)

constant_pacing:返回一个跟踪任务运行时间的函数,每次调用时它将返回一个等待时间,该等待时间将尝试使任务执行之间的总时间等于 wait_time 参数指定的时间。

应用场景:

模拟真实用户行为:

当进行性能测试时,有时需要模拟真实用户的操作行为。这些用户行为可能不是均匀分布的,但某些特定行为(如定期查询、定时任务等)需要按照

固定的时间间隔来执行。使用 constant_pacing 可以确保这些任务按照预定的时间间隔执行,从而更准确地模拟真实用户的行为。

系统稳定性测试:

在测试系统的稳定性时,可能需要长时间运行任务,并观察系统在不同负载下的表现。使用 constant_pacing 可以确保任务以恒定的间隔执行,从

而持续向系统施加稳定的负载,帮助发现潜在的稳定性和性能问题。

资源分配和限制:

在某些场景下,可能需要限制系统资源的使用,以确保不会超出特定的限制。例如,在测试一个API接口时,可能需要限制每分钟的请求数以避免对

后端服务造成过大的压力。虽然 constant_throughput 可以用来控制每秒的请求数,但 constant_pacing 可以提供更细粒度的控制,确保请求

按照特定的时间间隔发送,从而更有效地管理资源使用。

定时任务的性能测试:

许多系统都包含定时任务,这些任务需要按照预定的时间间隔执行。在进行这些定时任务的性能测试时,可以使用 constant_pacing 来模拟定时任

务的执行间隔,并评估系统在不同负载下的性能表现。

实时数据收集和处理:

对于需要实时收集和处理数据的系统(如监控系统、日志分析系统等),可能需要按照固定的时间间隔来执行数据收集和处理任务。使用

constant_pacing 可以确保这些任务按照预定的时间间隔执行,从而确保数据的准确性和实时性。

总的来说,constant_pacing 适用于那些需要精确控制任务执行间隔的场景,无论是在性能测试、资源分配还是实时数据处理中都可以发挥其独特的作用。

可以理解为:就像一个定时器一样 他不关心你具体返回了没有 到了点就要执行

无论任务执行时间如何,任务将始终每 10 秒执行一次:

1
wait_time = constant_pacing(10)

HttpUser

HttpUser每个用户提供一个client属性,即 的一个实例HttpSession,可用于向我们想要加载测试的目标系统发出 HTTP 请求。

HttpUser里面也是封装了一系列的请求方式,例如 POST, GET , DELETE, PUT 等。


LocustFile编写
https://dreamshao.github.io/2024/06/27/locustfile编写/
作者
Yun Shao
发布于
2024年6月27日
许可协议