蝗虫,on_start方法不适用于任务

时间:2020-09-01 22:05:35

标签: python-3.x locust

我正在尝试向HttpUser添加一些变量(例如self.boolean_flag)。 代表用户状态。此变量用于方案负载测试。

根据文档,我应该使用 on_start 初始化变量。 但是,当我使用如下所示的task = [TaskSet]时,on_start似乎不起作用。

AttributeError:“ ExampleTask”对象没有属性“ boolean_flag”:

class ExampleTask(TaskSet):
    @task
    def example_one(self):
        print(self.boolean_flag)   # AttributeError: 'ExampleTask' object has no attribute 'boolean_flag'
        make_api_request(self, "example_one")


class CustomUser(HttpUser):
    wait_time = between(
        int(os.getenv("LOCUST_MIN_WAIT", 200)), int(os.getenv("LOCUST_MAX_WAIT", 1000))
    )

    def on_start(self):
        self.boolean_flag = False

    tasks = {ExampleTask1 : 10, ExampleTask2: 5 ... }

底部可以工作:

class CustomUser(HttpUser):
    wait_time = between(
        int(os.getenv("LOCUST_MIN_WAIT", 200)), int(os.getenv("LOCUST_MAX_WAIT", 1000))
    )

    def on_start(self):
        self.boolean_flag = False

    @task
    def example_one(self):
        print(self.boolean_flag)
        make_api_request(self, "example_one")

由于我有许多重复使用许多任务集的方案,因此我需要使用Tasks = {} ..

我还尝试了子类化HttpUser并将这些变量添加到 init ()中。 但这也不适合task = {}。

class CustomUser(HttpUser):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.boolean_flag = False


class AllOfApisCallForLoadAtOneGo(CustomUser):
    wait_time = between(
    int(os.getenv("LOCUST_MIN_WAIT", 200)), int(os.getenv("LOCUST_MAX_WAIT", 1000))
)
    tasks = {ExampleTask1 : 10, ExampleTask2: 5 ... }
(loadtest-GvbsrA_X-py3.8) ➜  loadtest git:(abcd) ✗ locust -f locustfile_scenario.py first -H https://www.somehost.com
[2020-09-02 06:24:27,276] MacBook-Pro.local/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2020-09-02 06:24:27,286] MacBook-Pro.local/INFO/locust.main: Starting Locust 1.2.3
[2020-09-02 06:24:35,881] MacBook-Pro.local/INFO/locust.runners: Spawning 10 users at the rate 3 users/s (0 users already running)...
[2020-09-02 06:24:35,883] MacBook-Pro.local/ERROR/locust.user.task: You must specify the base host. Either in the host attribute in the User class, or on the command line using the --host option.
Traceback (most recent call last):
  File "/Users/poetry/virtualenvs/loadtest-GvbsrA_X-py3.8/lib/python3.8/site-packages/locust/user/task.py", line 284, in run
    self.execute_next_task()
  File "/Users/poetry/virtualenvs/loadtest-GvbsrA_X-py3.8/lib/python3.8/site-packages/locust/user/task.py", line 309, in execute_next_task
    self.execute_task(self._task_queue.pop(0))
  File "/Users/poetry/virtualenvs/loadtest-GvbsrA_X-py3.8/lib/python3.8/site-packages/locust/user/task.py", line 422, in execute_task
    task(self.user)
  File "/Users/poetry/virtualenvs/loadtest-GvbsrA_X-py3.8/lib/python3.8/site-packages/locust/user/users.py", line 224, in __init__
    raise LocustError(
locust.exception.LocustError: You must specify the base host. Either in the host attribute in the User class, or on the command line using the --host option.

1 个答案:

答案 0 :(得分:1)

似乎您假设TaskSet继承自HttpUser或以其他方式直接从self.user进行调用,事实并非如此。但是TaskSet在实例化时确实将用户传递给它。您只需要使用print(self.boolean_flag)。因此,根据您的情况,而不是print(self.user.boolean_flag),您将执行<BuildingBlocks> <ClaimsSchema> <ClaimType Id="readOnlyEmail"> <DisplayName>Email</DisplayName> <DataType>string</DataType> <UserInputType>Readonly</UserInputType> </ClaimType> <ClaimType Id="verificationCode"> <DisplayName>Secondary Verification Code</DisplayName> <DataType>string</DataType> <UserHelpText>Enter your email verification code</UserHelpText> <UserInputType>TextBox</UserInputType> </ClaimType> <!-- Other claims you have defined --> </ClaimsSchema> </BuildingBlocks>