Python Locust 自定义客户端函数没有属性事件

Posted

技术标签:

【中文标题】Python Locust 自定义客户端函数没有属性事件【英文标题】:Python Locust Custom Client Function has no attribute events 【发布时间】:2021-01-26 16:24:04 【问题描述】:

我正在尝试使用 locust 编写自定义客户端,遵循此处找到的文档: https://docs.locust.io/en/stable/testing-other-systems.html

我已经完成了 90%,但无法正确触发成功和失败事件。我不断看到以下错误:

` 文件“/Users/n1531435/PycharmProjects/LoadTesting/locust_files/sgqlc_experimental.py”,第 29 行,在包装器中 self._locust_environment.events.request_success.fire( AttributeError: 'function' 对象没有属性 'events'

有问题的对象是 _locust_environment 属性,但我不明白它是如何/在哪里设置为函数值的。蝗虫文档几乎没有提供有关如何使用它的信息。当我打印 _locust_environment 时,我得到以下信息: <function SGQLCClient.__getattribute__.<locals>.wrapper at 0x10c08ab80>

如何正确设置环境以便我们可以触发和跟踪事件?

这是我的蝗虫文件:

import time
import test
from locust import task, User, between


class SGQLCClient(test.SampleSGLQCTests):
    """
    Simple, sglqc client implementation fires locust events on request_success and request_failure, so that all requests
    gets tracked in locust's statistics.
    """

    _locust_environment = None

    def __getattribute__(self, name):
        func = test.SampleSGLQCTests.__getattribute__(self, name)

        def wrapper(*args, **kwargs):
            start_at = time.monotonic()
            passing = func(*args, **kwargs)
            print(self._locust_environment)
            end_at = time.monotonic()
            final_time = end_at - start_at
            if passing:
                self._locust_environment.events.request_success.fire(
                    request_type="graphql", name="run script", response_time=final_time, response_length=0
                )
            else:
                self._locust_environment.events.request_failure.fire(
                    request_type="graphql", name="run script", response_time=final_time, response_length=0,
                    exception="testing"
                )
        return wrapper


class LocustSGQLCUser(User):
    abstract = True

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.client = SGQLCClient()
        self.client._locust_environment = self.environment


class SGQLCUser(LocustSGQLCUser):
    host = "Graphql Client"

    wait_time = between(0.1, 1)

    # the number here is weighting.  Higher numbers will run in greater proportion to lower ones
    @task(5)
    def load_test_renters_zip_codes(self):
        self.client.run_renters_zip_code()

    @task(10)
    def load_test_auto_zip_codes(self):
        self.client.run_auto_zip_code()

    @task(5)
    def load_test_small_business_zip_codes(self):
        self.client.run_small_business_zip_code()

【问题讨论】:

【参考方案1】:

我不完全确定您在此处尝试使用您的代码做什么。看来您是班上的 overwriting __getattribute__。这可能不是你想要做的。但这就是_locust_environment 返回函数的方式。由于_locust_environment 在您的班级中,因此您的__getattribute__ 被调用,并且将您的wrapper 函数作为函数返回。

【讨论】:

谢谢...我昨晚确实完成了这项工作,完全消除了蝗虫环境,只是从自身调用事件。因此我无法检测到任何问题,但我仍然不是 100% 了解它的工作原理。 好吧,我指出了问题所在。我无法告诉您如何解决它,因为我不知道您要做什么,也不知道还有什么在调用和依赖此代码。但是,是的,从不在 SGQLCClient 类中的其他地方调用事件可以解决它。

以上是关于Python Locust 自定义客户端函数没有属性事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 locust 中创建和使用自定义命令行参数

locust压测非http协议

Locust 脚本开发入门

09-Locust-自定义负载策略

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

Locust 官方文档 6:使用更快的 HTTP 客户端提高 Locust 性能