イナゴ-同じユーザーに対して複数のタスクセットを定義するにはどうすればよいですか?

Aug 24 2020

次のコードを検討してください。

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]

上記のコードを1人のユーザーだけで実行すると、メソッドTask2.Methodは実行されず、からのメソッドのみが実行されTask1ます。

両方のタスクのコードが同じユーザーに対して実行されるようにするにはどうすればよいですか?

プロジェクトをより適切に整理するためにタスクを異なるファイルに分割したいので、このようにしたいです。それが不可能な場合、アプリケーションモジュールごとにタスクを定義できるように、タスクをさまざまなファイルに定義するにはどうすればよいですか?

回答

1 Cyberwiz Aug 24 2020 at 22:01

最初はこれはバグだと思っていましたが、実際には意図したとおりです(なぜそのように実装されたのかはよくわかりませんが)

TaskSetについて知っておくべき重要なことの1つは、タスクの実行を停止せず、実行を親のUser / TaskSetに自分で引き渡すことです。これは、開発者がTaskSet.interrupt()メソッドを呼び出して行う必要があります。

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

継承でこの問題を解決します。共通のタスクを持つ基本のTaskSetまたはUserクラスを定義し、それをサブクラス化して、ユーザータイプ固有のタスク/コードを追加します。

基本Userクラスを定義する場合、abstract = TrueLocustでそのユーザーも実行しないように設定することを忘れないでください。

1 RafaelColucci Aug 25 2020 at 14:17

わかったと思います。この問題を解決するには、各タスクセットの最後にメソッドを追加して、タスクセットの実行を停止する必要がありました。

  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]

現在、すべてが正常に機能しているようです。