Locust - Come posso definire più set di attività per lo stesso utente?

Aug 24 2020

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

1 Cyberwiz Aug 24 2020 at 22:01

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.

1 RafaelColucci Aug 25 2020 at 14:17

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.