性能测试自定义负载-通篇讲解 Locust 性能测试

关于自定义负载,然后使用复杂的负载 —小试牛刀

须知:有关负载形状, 是需要结合业务和自己需要的测试类型进行生成的, 提前做好测试内容,和计划安排才能更合适的进行这一块的测试, 发现性能上的问题。

自定义负载形状示例

下面是一个示例自定义负载形状,它会在测试中每100个用户增加一次,并在10分钟后停止测试。同时,我还会展示如何定义 UserAUserB 类,并在负载形状中使用它们。

定义用户类

在你的 Locust 文件中,首先定义 UserAUserB 类。这些类继承自 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

解释

  • UserAUserB:这两个类分别定义了不同的用户行为。UserA 访问 /endpoint_a,而 UserB 访问 /endpoint_b
  • StagesShapeWithCustomUsers:这是一个自定义负载形状类,它定义了不同阶段的负载模式,每个阶段使用不同的用户类。
    • stages:包含负载测试的各个阶段,每个阶段都有持续时间、用户数量、生成速率和使用的用户类。
    • tick 方法:根据测试的运行时间,选择当前阶段的配置并返回用户数量、生成速率和用户类。

这种方式使得你可以根据不同的测试需求,灵活地定义和管理用户行为,并在测试中应用不同的负载形状。

使用的话:

locust -f [locustfile.py](<http://locustfile.py/>) --class-picker StagesShapeWithCustomUsers

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wade_Crab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值