Locust 负载测试:如何在所有其他 API 中为一个特定 API 分配单个用户

Posted

技术标签:

【中文标题】Locust 负载测试:如何在所有其他 API 中为一个特定 API 分配单个用户【英文标题】:Locust load testing : How to allocate single user for one particular API among all other APIs 【发布时间】:2021-09-15 15:16:30 【问题描述】:

我需要使用 locust 测试具有以下场景的 API 集。

    有 8 个 HTTP GET API,如下所示。
    1. "/v1/api_1"
    2. "/v1/api_2"
    3. "/v1/api_3"
    4. "/v1/api_4"
    5. "/v1/api_5"
    6. "/v1/api_6"
    7. "/v1/api_7"
    8. "/v1/api_8"
    我需要分配 3 个用户,这 3 个用户应该调用前五个 API 这 5 个 API 应该在 15 秒的等待时间和给定的权重下调用。 我需要为最后 3 个 API 分配另外 3 个用户,并且一个用户应该负责 1 个 API。 最后 3 个 API 中的每一个都应每 5 秒调用一次。

详情请看下图

我应该如何使用 locust 实现上述场景。

下面是我的代码。

class API_User(TaskSet):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    @task(10)
    def get_api_1(self):
        print(f"/v1/api_1")
        time.sleep(15)

    @task(50)
    def get_api_2(self):
        print(f"/v1/api_2")
        time.sleep(15)

    @task(20)
    def get_api_3(self):
        print(f"/v1/api_3")
        time.sleep(15)

    @task(10)
    def get_api_4(self):
        print(f"/v1/api_4")
        time.sleep(5)

    @task(10)
    def get_api_5(self):
        print(f"/v1/api_5")
        time.sleep(5)

    @task
    def get_api_6(self):
        print(f"/v1/api_6")
        time.sleep(5)

    @task
    def get_api_7(self):
        print(f"/v1/api_7")
        time.sleep(5)

    @task
    def get_api_8(self):
        print(f"/v1/api_8")
        time.sleep(5)

class API_User_Test(User):
    tasks = API_User

【问题讨论】:

【参考方案1】:

你把它弄得太复杂了。每个单独的 http 调用不必是它自己的任务。您可以将任务设置为一堆调用以及介于两者之间的事情。为您需要运行的每个不同场景(如您所说的“用户”)制定一个任务。这意味着使用适当的睡眠时间调用前五个 API 的单个任务。适当地加权任务,然后启动要运行的 Locust 用户数量。使用您的示例代码:

class API_User(TaskSet):

    @task(3)
    def get_api_1(self):
        print(f"/v1/api_1")
        time.sleep(15)
        print(f"/v1/api_2")
        time.sleep(15)
        print(f"/v1/api_3")
        time.sleep(15)
        print(f"/v1/api_4")
        time.sleep(5)
        print(f"/v1/api_5")
        time.sleep(5)

    @task(1)
    def get_api_6(self):
        print(f"/v1/api_6")
        time.sleep(5)

    @task(1)
    def get_api_7(self):
        print(f"/v1/api_7")
        time.sleep(5)

    @task(1)
    def get_api_8(self):
        print(f"/v1/api_8")
        time.sleep(5)

 class API_User_Test(User):
    tasks = API_User

另外,如果你在__init__ 中除了调用 super 的 init 之外没有做任何其他事情,那么你不需要这样做。

【讨论】:

你能举个例子吗 编辑了我的答案以添加示例

以上是关于Locust 负载测试:如何在所有其他 API 中为一个特定 API 分配单个用户的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 locust 的 pythons 请求模块来加载测试一堆 api

如何在 Locust 负载测试工具中获得详细的错误报告?

如何在 Locust 负载测试工具中计算每秒的实际请求

基于python的性能负载测试Locust-1 简介

locust性能测试安装

使用 xlsx 文件对 Locust 进行负载测试