蝗虫-如何为同一用户定义多个任务集?

问题描述

请考虑以下代码

class Task1(TaskSet):
    @task
    def task1_method(self):
        pass


class Task2(TaskSet):
    @task
    def task2_method(self):
        pass


class UserBehavIoUr(TaskSet):
    tasks = [Task1,Task2]


class LoggedInUser(HttpUser):
    host = "http://localhost"
    wait_time = between(1,5)
    tasks = [UserBehavIoUr]

当我仅与一个用户一起执行上述代码时,方法Task2.Method永远不会执行,只有Task1中的方法才能执行。

我该怎么做才能确保两个任务的代码都针对同一用户执行?

我想这样做,因为我想将任务分成不同的文件,以更好地组织项目。如果不可能,那么如何以可以为应用程序模块的每个对象定义任务的方式将任务定义到不同的文件中?

解决方法

起初我以为这是一个错误,但实际上是预期的错误(尽管我不太了解为什么要以这种方式实现)

关于TaskSet的重要一件事是它们永远不会 停止执行任务,并将执行移交给他们 父User / TaskSet本身。这必须由 开发人员,方法是调用TaskSet.interrupt()方法。

https://docs.locust.io/en/stable/writing-a-locustfile.html#interrupting-a-taskset

我将通过继承解决此问题:定义具有常见任务的基本TaskSet或User类,然后对其进行子类化,添加特定于用户类型的任务/代码。

如果定义基类User,请记住如果不想让Locust也运行该用户,请设置abstract = True

,

我想我明白了。为了解决该问题,我必须在每个任务集的末尾添加一个方法来停止任务集的执行:

  def stop(self):
    self.interrupt()

除此之外,我还必须将继承的类更改为SequentialTaskSet,以便按顺序执行所有任务。

这是完整的代码:

class Task1(SequentialTaskSet):
    @task
    def task1_method(self):
        pass
    @task
    def stop(self):
        self.interrupt()


class Task2(SequentialTaskSet):
    @task
    def task2_method(self):
        pass
    @task
    def stop(self):
        self.interrupt()


class UserBehaviour(SequentialTaskSet):
    tasks = [Task1,Task2]


class LoggedInUser(HttpUser):
    host = "http://localhost"
    wait_time = between(1,5)
    tasks = [UserBehaviour]

一切似乎都正常了。