Aller au contenu
Korben, roi d’internet, logo bébé avec des lunettes en mode thug life

Testez la montée en charge de votre serveur avec Locust

Si vous voulez tester la résistance de votre serveur et l’évolution de ses performances lors d’une augmentation du trafic, rien de mieux qu’un outil de test de montée en charge.

Et c’est pourquoi je vous présente aujourd’hui Locust.

Locust est un outil de test de charge facile à utiliser qui vous permet d’écrire et de jouer des scénarios de test en Python. Ainsi, avec un peu de code, vous pouvez simuler des comportements utilisateurs, qui bouclent ou qui prennent des chemins conditionnels différents.

En passant, je ne sais pas si vous avez vu mais l’hébergeur Hostinger propose des offres super intéressantes en matière d’hébergement web. C’est pas trop cher pour démarrer et s’auto-héberger. (Lien affilié)

Locust est également distribué, ce qui signifie que vous pouvez lancer des tests de charges répartis sur plusieurs machines, ce qui permet de simuler des milliers d’utilisateurs simultanés.

Ce qui est sympa également, c’est que Locust possède une interface graphique qui vous affichera la progression de votre test en temps réel. Vous pourrez même modifier la charge pendant l’exécution du test et comme il peut également fonctionner en ligne de commandes, vous pouvez l’intégrer à vos process CI/CD.

Ne pensez pas non plus que Locust soit uniquement dédié à du test de site web. En écrivant un client spécifique, vous pourrez ainsi tester d’autres systèmes ou protocoles.

Pour installer Locust, il vous faudra Python >= 3.6 et lancer la commande suivante :

pip3 install locust

Vous aurez également besoin d’écrire un premier scénario de test. Voici un exemple :

import time
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 2.5)

    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

    @task(3)
    def view_items(self):
        for item_id in range(10):
            self.client.get(f"/item?id={item_id}", name="/item")
            time.sleep(1)

    def on_start(self):
        self.client.post("/login", json={"username":"foo", "password":"bar"})

Si vous regardez le code, vous pouvez voir qu’il y a 2 @task.

Ce sont les tâches qui seront effectuées par les utilisateurs simulés. Lorsque le QuickstartUser s’exécutera, il choisira au hasard l’une des tâches déclarées. Notez que la @task(3) a une pondération plus élevée, donc il y a 3 fois plus de chances que ce soit celle-ci qui soit choisie.

Ensuite, le reste n’est qu’une histoire de post et de get sur différents endpoints de votre site.

Bref, sauvegardez ce script sous la nom de fichier :

locustfile.py

Puis lancez locust :

locust -f locustfile.py

L’outil se lancera et vous donnera une URL à laquelle accéder avec votre ordinateur. Ensuite y’a plus qu’à mettre vos paramètres et à lancer le test.

Capture d'écran d'une interface graphique montrant les résultats de tests de charge avec Locust

Le test commencera alors en vrai. J’espère que votre serveur tiendra le coup 🙂

Code Python utilisant Locust pour réaliser des tests de charge sur un serveur

Et vous pourrez voir de beaux graphiques en temps réel, les erreurs rencontrées et bien sûr récupérer toutes les données pour les exploiter ensuite dans d’autres outils.

Schéma illustrant le fonctionnement de Locust pour réaliser des tests de charge

Locust est distribué sous licence libre et vous pouvez trouver son code en vous rendant sur le github.

Je vous invite également à lire la documentation ici.


Les articles du moment