La première partie:
Comment s'assurer que plusieurs utilisateurs (threads) suivent une certaine séquence lors de l'exécution de plusieurs tâches de test sous la pression du trafic, plutôt que d'un phénomène aléatoire. Cette exigence est également réalisable dans Locust, l'ensemble de tâches peut être hérité de la sous-classe SequentialTaskSet de TaskSet. Prenons un exemple pour illustrer cette utilisation:
from locust import User,SequentialTaskSet,task,between
def function_task(l):
print("This is the function task")
class MyUser(User):
wait_time = between(5,9)
@task
class SequenceOfTasks(SequentialTaskSet):
@task
def first_task(self):
print("this is the first task")
tasks = [function_task]
@task
def second_task(self):
print("this is the second task")
@task
def third_task(self):
print("this is the third task")
Dans l'exemple de code ci-dessus, la classe SequeneOfTasks est incorporée dans la classe MyUser. D'après la signification du paramètre SequentialTaskSet, l'ordre d'exécution des tâches de cet exemple doit être le suivant:
-
first_task
-
fonction_tâche
-
deuxième_tâche
- troisième_tâche
Exécuté par script, la sortie de la console est la suivante:
All users hatched: MyUser: 1 (0 already running)
this is the first task
This is the function task
this is the second task
this is the third task
this is the first task
This is the function task
this is the second task
this is the third task
this is the first task
This is the function task
...
Partie 2:
Comment configurer le bloc de code que l'utilisateur virtuel exécutera au début et à la fin? Nous savons que dans l'outil précédent LoadRunner, lr_start et lr_end peuvent être définis. Ensuite, c'est également possible dans Locust. Il existe deux manières d'expliquer ici, l'une est le niveau de la classe User, l'autre est le niveau du module. Ces deux méthodes seront décrites en détail par la suite.
1> niveau de classe d'utilisateur
D'abord sur le code:
from locust import User,task,between
class MyUser(User):
wait_time = between(5,8)
def on_start(self):
print("A test will start...")
def on_stop(self):
print("A test is ending...")
@task
def task_1(self):
print("it is task1")
@task
def task_2(self):
print("it is task2")
Comme le montre le code ci-dessus, tous les utilisateurs virtuels exécuteront la fonction on_start lors de la configuration et exécuteront la fonction on_stop pendant le démontage. À partir des résultats en cours d'exécution (5 utilisateurs virtuels exécutant des scénarios pendant 20 secondes), la sortie de la console est la suivante:
Hatching and swarming 5 users at the rate 5 users/s (0 users already running)...
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
A test will start...
it is task1
A test will start...
it is task1
A test will start...
it is task2
A test will start...
it is task2
[2020-11-20 08:52:18,681] jasondeMacBook-Pro.local/INFO/locust.runners: All users hatched: MyUser: 5 (0 already running)
A test will start...
it is task2
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
it is task1
it is task2
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
it is task1
it is task2
it is task2
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
it is task1
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
it is task2
it is task2
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
it is task1
it is task2
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
it is task2
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
it is task2
it is task2
it is task1
[2020-11-20 08:52:37,696] jasondeMacBook-Pro.local/INFO/locust.main: Time limit reached. Stopping Locust.
A test is ending...
A test is ending...
A test is ending...
A test is ending...
A test is ending...
[2020-11-20 08:52:37,697] jasondeMacBook-Pro.local/INFO/locust.main: Running teardowns...
[2020-11-20 08:52:37,698] jasondeMacBook-Pro.local/INFO/locust.main: Shutting down (exit code 0), bye.
[2020-11-20 08:52:37,698] jasondeMacBook-Pro.local/INFO/locust.main: Cleaning up runner...
Name # reqs # fails Avg Min Max | Median req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
Aggregated 0 0(0.00%) 0 0 0 | 0 0.00 0.00
Percentage of the requests completed within given times
Type Name # reqs 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100%
------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------
2> Niveau du module.
Que faire s'il y a plusieurs classes dans le fichier module / locust? Vous pouvez réduire la quantité de code en définissant on_start et on_stop au niveau du module. Le code ci-dessus est également réécrit comme l'original. La version réécrite est la suivante, mais veuillez noter que ⚠️: on_start et on_stop here ne seront exécutés qu'une seule fois, quel que soit le nombre d'utilisateurs virtuels, veuillez donc choisir un mode différent en fonction de vos besoins. Où l'étiquette dans ce modèle
@ events.test_stop.add_listener est la clé.
from locust import events,User,task,between
@events.test_start.add_listener
def on_start(**kwargs):
print("A test will start...")
@events.test_stop.add_listener
def on_stop(**kwargs):
print("A test is ending...")
class MyUser(User):
wait_time = between(5,8)
@task
def task_1(self):
print("it is task1")
@task
def task_2(self):
print("it is task2")