イナゴ-同じユーザーに対して複数のタスクセットを定義するにはどうすればよいですか?
次のコードを検討してください。
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
ます。
両方のタスクのコードが同じユーザーに対して実行されるようにするにはどうすればよいですか?
プロジェクトをより適切に整理するためにタスクを異なるファイルに分割したいので、このようにしたいです。それが不可能な場合、アプリケーションモジュールごとにタスクを定義できるように、タスクをさまざまなファイルに定義するにはどうすればよいですか?
回答
最初はこれはバグだと思っていましたが、実際には意図したとおりです(なぜそのように実装されたのかはよくわかりませんが)
TaskSetについて知っておくべき重要なことの1つは、タスクの実行を停止せず、実行を親のUser / TaskSetに自分で引き渡すことです。これは、開発者がTaskSet.interrupt()メソッドを呼び出して行う必要があります。
https://docs.locust.io/en/stable/writing-a-locustfile.html#interrupting-a-taskset
継承でこの問題を解決します。共通のタスクを持つ基本のTaskSetまたはUserクラスを定義し、それをサブクラス化して、ユーザータイプ固有のタスク/コードを追加します。
基本Userクラスを定義する場合、abstract = True
Locustでそのユーザーも実行しないように設定することを忘れないでください。
わかったと思います。この問題を解決するには、各タスクセットの最後にメソッドを追加して、タスクセットの実行を停止する必要がありました。
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]
現在、すべてが正常に機能しているようです。