Locust - Come posso definire più set di attività per lo stesso utente?
Si prega di considerare il seguente codice:
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]
Quando eseguo il codice sopra con un solo utente, il metodo Task2.Methodnon viene mai eseguito, solo il metodo da Task1.
Cosa posso fare per assicurarmi che il codice di entrambe le attività venga eseguito per lo stesso utente?
Mi piacerebbe farlo in questo modo perché voglio separare le attività in diversi file per organizzare meglio il progetto. Se ciò non è possibile, come posso avere attività definite in file diversi in modo da poter avere attività definite per ciascuno dei miei moduli applicativi?
Risposte
All'inizio ho pensato che fosse un bug, ma in realtà è proprio come previsto (anche se non capisco davvero PERCHÉ è stato implementato in quel modo)
Una cosa importante da sapere sui TaskSet è che non smetteranno mai di eseguire le loro attività e restituiranno l'esecuzione al loro Utente/TaskSet padre, da soli. Questo deve essere fatto dallo sviluppatore chiamando il metodo TaskSet.interrupt().
https://docs.locust.io/en/stable/writing-a-locustfile.html#interrupting-a-taskset
Risolverei questo problema con l'ereditarietà: definire un TaskSet di base o una classe utente che ha le attività comuni, quindi sottoclassarlo, aggiungendo le attività/il codice specifici del tipo di utente.
Se definisci una classe utente di base, ricorda di impostare abstract = Truese non vuoi che Locust esegua anche quell'utente.
Penso di aver capito. Per risolvere il problema ho dovuto aggiungere un metodo alla fine di ogni taskset per interrompere l'esecuzione del task set:
def stop(self):
self.interrupt()
Inoltre, ho dovuto modificare la classe ereditata in SequentialTaskSetmodo che tutte le attività vengano eseguite in ordine.
Questo è il codice completo:
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]
Tutto sembra funzionare bene ora.