PRISE EN MAIN DE LOCUST
1.Présentation
Locust est un utilitaire open-source populaire pour tester la charge et mesurer la performance des applications web. Il permet de simuler plusieurs milliers d’utilisateurs virtuels concurrents and de générer des schémas de traffic réalistes.
Cet article fait suite au précédent sur k6 pour présenter les outils de test de charge.
2.Installation
Il est conseillé d’utiliser un environnement virtuel pour python afin d’installer facilement locust.
A. Installation de l’environnement virtuel de python
-
Sous Debian
apt install python-virtualenv
-
Sous CentOs
dnf install python-virtualenv
B. Activation et mise en place de l’environnement et installation de locust
Activation de l’environnement virtuel
virtualenv locustenv
source locustenv/bin/activate
Installation de locust
pip3 install locus
C. Lancement de locust
locust -f locustfile.py
D. Monitoring en temps réel
Dans le web browser
127.0.0.1:8089
Après avoir renseigné le site à tester, le nombre d’utilisateurs virtuels (VUs) et le temps d’attente entre le lancement du test de chaque utilisateur, l’interface graphique commence à remonter les information en temps réel.
Graphique sous l'interface de Locust
Résultats des requêtes
3.Paramétrages
Le paramétrage est assez simple à comprendre et mettre en place.
Les paramétrages dans le script :
-
la fonction on_start permet de lancer toutes les actions que l’on souhaite réaliser au lancement du script.
-
la fonction on_stop quant à elle lance les actions souhaitées lorsque sont stoppés les tests sur l’interface graphique
-
les différentes adresses à tester par le script...
Les paramétrages via l’interface web:
Les paramétrages via l’interface graphique sont plus limités pour une plus grande visibilité et surtout ils permettent des ajustements en cours de test.
-
Le site web de référence (ne peut être modifié durant les tests)
-
Le nombre d’’utilisateurs virtuels (VU)
-
Le délai d’attente au démarrage du test entre chaque utilisateur virtuel
4.Les options
Dans le script:
-
@task(n) est un décorateur qui permet de donner du poids à une fonction, par exemple lancer n fois la fonction 1 pour 1 fois la fonction 2
-
time sleep définit le temps théorique que passeraitun utilisateur pour consulter une page web.
-
between(1 ,5) définit un temps aléatoire entre 1 et 5 secondes
-
et d’autres...
5.Exemple de script
Dans ce script, plusieurs utilisateurs se connectent à la page de connexion et le succès de la connexion est vérifiée et un message sur la console CLI envoyé.
Le script peut-être complexifié avec des lignes de codes en python, permettant des scénarios beaucoup plus pointus et mieux ajustés aux besoins.
import time
from locust import HttpUser, TaskSet, task, between
USER_CREDENTIALS = [
("test1", "Pa$$w0rd2023"),
("test2", "Pa$$w0rd2023"),
("test3", "Pa$$w0rd2023"),
("test4", "Pa$$w0rd2023"),
("test5", "Pa$$w0rd2023"),
]
class UserBehavior(TaskSet):
def on_start(self):
self.login()
def login(self):
if len(USER_CREDENTIALS) >0:
user, passw = USER_CREDENTIALS.pop()
response = self.client.post('/login', json={'username': user, 'password': passw})
if response.status_code == 200:
print('[+]Connection to {user} succeeded')
else:
print('[-]Connection to {user} failed')
print('[-]Error :', response.status_code)
def on_stop(self):
response = self.client.get('/logout')
if response.status_code == 200:
print('[+]Disconnection to {user} succeeded')
else:
print('[-]Disconnection to {user} failed')
print('[-]Error :', response.status_code)
@task(1)
def view_page_root(self):
self.client.get('/')
time.sleep(5)
6.Les résultats
Les résultats apparaissent en direct sur l’interface web de l’application. Sur l’onglet erreur, apparaissent les échecs d’accès et les erreurs rencontrées.
Il est possible de récupérer toutes ces informations au format JSON pour les traiter ultérieurement par exemple sur Grafana.