关于自定义负载,然后使用复杂的负载 —小试牛刀
须知:有关负载形状, 是需要结合业务和自己需要的测试类型进行生成的, 提前做好测试内容,和计划安排才能更合适的进行这一块的测试, 发现性能上的问题。
自定义负载形状示例
下面是一个示例自定义负载形状,它会在测试中每100个用户增加一次,并在10分钟后停止测试。同时,我还会展示如何定义 UserA
和 UserB
类,并在负载形状中使用它们。
定义用户类
在你的 Locust 文件中,首先定义 UserA
和 UserB
类。这些类继承自 HttpUser
并定义了用户的行为,比如访问某个 URL 或提交表单等。
from locust import HttpUser, task
class UserA(HttpUser):
host = "<http://example.com>"
@task
def task_a(self):
self.client.get("/endpoint_a")
class UserB(HttpUser):
host = "<http://example.com>"
@task
def task_b(self):
self.client.get("/endpoint_b")
定义负载形状类
接下来,定义一个自定义的负载形状类,用于控制测试中的用户数量和生成速率。这个类会在不同阶段使用不同的用户类。
from locust import LoadTestShape
class StagesShapeWithCustomUsers(LoadTestShape):
stages = [
{"duration": 10, "users": 10, "spawn_rate": 10, "user_classes": [UserA]},
{"duration": 30, "users": 50, "spawn_rate": 10, "user_classes": [UserA, UserB]},
{"duration": 60, "users": 100, "spawn_rate": 10, "user_classes": [UserB]},
{"duration": 120, "users": 100, "spawn_rate": 10, "user_classes": [UserA, UserB]},
]
def tick(self):
run_time = self.get_run_time() # 获取当前测试运行时间
for stage in self.stages:
if run_time < stage["duration"]:
try:
return (stage["users"], stage["spawn_rate"], stage["user_classes"])
except:
return (stage["users"], stage["spawn_rate"])
return None # 超过所有阶段的持续时间后停止测试
完整的 Locust 文件示例
将用户类和负载形状类放在同一个 Locust 文件中,以便于管理和执行:
from locust import HttpUser, task, LoadTestShape
# 定义用户类
class UserA(HttpUser):
host = "<http://example.com>"
@task
def task_a(self):
self.client.get("/endpoint_a")
class UserB(HttpUser):
host = "<http://example.com>"
@task
def task_b(self):
self.client.get("/endpoint_b")
# 定义负载形状类
class StagesShapeWithCustomUsers(LoadTestShape):
stages = [
{"duration": 10, "users": 10, "spawn_rate": 10, "user_classes": [UserA]},
{"duration": 30, "users": 50, "spawn_rate": 10, "user_classes": [UserA, UserB]},
{"duration": 60, "users": 100, "spawn_rate": 10, "user_classes": [UserB]},
{"duration": 120, "users": 100, "spawn_rate": 10, "user_classes": [UserA, UserB]},
]
def tick(self):
run_time = self.get_run_time()
for stage in self.stages:
if run_time < stage["duration"]:
try:
return (stage["users"], stage["spawn_rate"], stage["user_classes"])
except:
return (stage["users"], stage["spawn_rate"])
return None
解释
UserA
和UserB
:这两个类分别定义了不同的用户行为。UserA
访问/endpoint_a
,而UserB
访问/endpoint_b
。StagesShapeWithCustomUsers
:这是一个自定义负载形状类,它定义了不同阶段的负载模式,每个阶段使用不同的用户类。stages
:包含负载测试的各个阶段,每个阶段都有持续时间、用户数量、生成速率和使用的用户类。tick
方法:根据测试的运行时间,选择当前阶段的配置并返回用户数量、生成速率和用户类。
这种方式使得你可以根据不同的测试需求,灵活地定义和管理用户行为,并在测试中应用不同的负载形状。
使用的话:
locust -f [locustfile.py](<http://locustfile.py/>) --class-picker StagesShapeWithCustomUsers