Test de charge Locust : l'outil Python passé en revue
7 min de lecture mis à jour le
Locust est un outil de test de charge Python, gratuit et sous licence MIT, dans lequel chaque test est un programme Python, exécuté par des utilisateurs légers depuis une interface web ou la ligne de commande. Le test de charge Locust convient aux équipes qui écrivent du Python et testent surtout des services HTTP. Celles qui ont besoin de nombreux protocoles prêts à l’emploi ou d’un éditeur de tests graphique seront mieux servies par JMeter, et celles qui écrivent du JavaScript par k6.
Nous n’avons pas exécuté Locust pour cette revue. Les faits proviennent de la documentation, du dépôt et de la page PyPI de Locust, vérifiés le 9 octobre 2026, et les appréciations sont les nôtres.
| Sujet | Locust |
|---|---|
| Licence | MIT |
| Environnement | Python 3.11 ou plus récent |
| Version actuelle | 2.46.7 (4 octobre 2026) |
| Format des tests | Classes Python dans un locustfile |
| Exécution | Interface web sur le port 8089, ou headless |
| Protocoles intégrés | HTTP et HTTPS |
| Répartition | Un master et autant de workers que nécessaire |
| Résultats | Graphiques en direct, CSV, HTML, JSON, OpenTelemetry |
| CI | Code de sortie 1 dès qu’une requête échoue |
Qui développe Locust, et le projet est-il toujours maintenu ?
Lars Holmberg maintient Locust, et Microsoft sponsorise ce travail. Les versions se succèdent vite : 17 depuis le début de 2026.
Le README de Locust cite les deux. PyPI indique la 2.46.7, publiée le 4 octobre 2026, comme dernière version, avec Python 3.11 ou plus récent requis (vérifié le 9 octobre 2026).
Comment fonctionne un locustfile ?
Un locustfile est un module Python ordinaire qui contient au moins une classe d’utilisateur. Chaque utilisateur simulé exécute ses tâches l’une après l’autre et marque une pause entre deux, selon son wait_time.
D’après le guide du locustfile, HttpUser donne à chaque utilisateur un client qui encapsule python-requests, conserve les cookies et enregistre chaque requête. Les méthodes marquées @task sont tirées au hasard, pondérées par le nombre passé au décorateur, et on_start s’exécute une fois par utilisateur. Cet utilisateur se connecte, parcourt le catalogue quatre fois plus souvent qu’il ne passe commande, et lance au plus une tâche toutes les 10 secondes :
from locust import HttpUser, task, constant_pacing
class Shopper(HttpUser):
wait_time = constant_pacing(10)
def on_start(self):
self.client.post("/login", json={"user": "demo"})
@task(4)
def browse(self):
self.client.get("/products?page=2", name="/products")
@task
def checkout(self):
with self.client.post(
"/checkout", catch_response=True
) as resp:
if "order_id" not in resp.text:
resp.failure("no order id")
catch_response permet de faire échouer une requête d’après son contenu, et name regroupe les URL variables sur une seule ligne des statistiques. Les autres fonctions d’attente sont constant, between, constant_throughput et, depuis la version 2.46.6, poisson ; notre guide sur le temps de réflexion en test de charge explique comment ces pauses façonnent la charge. La documentation précise que le temps d’attente peut seulement limiter le débit et ne lance pas de nouveaux utilisateurs pour atteindre un rythme cible. Un test Locust est donc un groupe fixe d’utilisateurs : un modèle de charge fermé.
Faut-il utiliser l’interface web ou le mode headless ?
L’interface web pour explorer, le mode headless pour des exécutions reproductibles.
La commande locust lance une interface web sur le port 8089. Vous y indiquez l’hôte, le nombre d’utilisateurs et la montée en charge, suivez des graphiques en direct et modifiez la charge en cours de test. Le mode headless reprend les mêmes réglages sous forme d’options :
locust -f locustfile.py --headless -u 200 -r 10 -t 10m \
--host https://staging.example.com \
--csv results --html report.html
-u fixe le nombre d’utilisateurs, -r le nombre d’utilisateurs démarrés par seconde et -t la durée, montée en charge comprise. Les mêmes réglages peuvent aussi être définis dans locust.conf ou pyproject.toml.
Comment fonctionne le mode distribué ?
Un processus master gère l’interface web et coordonne, tandis que des processus workers exécutent les utilisateurs et lui renvoient leurs statistiques. Il faut un worker par cœur de CPU, car un processus Python ne peut pas exploiter pleinement plus d’un cœur.
D’après la documentation sur la charge distribuée, un seul processus dépasse mille requêtes par seconde sur un plan de test simple ; pour aller plus loin, on répartit la charge :
# sur la machine master
locust -f locustfile.py --master
# sur chaque machine worker, un worker par cœur
locust -f - --worker --master-host 10.0.0.5 --processes -1
-f - récupère le locustfile auprès du master. --processes repose sur fork() et ne fonctionne donc pas sous Windows, et toute modification du locustfile impose de redémarrer tous les processus. La documentation décrit aussi un opérateur Kubernetes et Azure Load Testing (vérifié le 9 octobre 2026).
LoadFocus, l’éditeur de ce site, n’exécute pas de tests Locust. Il exécute des plans de test JMeter et des scripts k6 depuis 25 régions cloud ; pour Locust, les voies ci-dessus restent donc les moyens de monter en charge.
Locust peut-il tester d’autres protocoles que HTTP ?
Oui, à condition d’apporter un client Python pour le protocole. Seuls HTTP et HTTPS sont intégrés.
La page consacrée aux autres protocoles montre comment encapsuler un client pour que chaque appel soit enregistré, avec des exemples pour XML-RPC et gRPC et des classes d’utilisateur expérimentales pour MQTT, Socket.IO et OpenAI. Le projet distinct locust-plugins ajoute des utilisateurs pour Kafka, FTP, Selenium et Playwright (vérifié le 9 octobre 2026).
Pour HTTP, il existe aussi FastHttpUser, qui s’appuie sur geventhttpclient et consomme beaucoup moins de CPU. Dans le meilleur des cas, selon la documentation, un processus atteint environ 16 000 requêtes par seconde, contre 4 000 avec HttpUser. FastHttpUser ne rend pas chaque requête plus rapide, et il ne vérifie pas les certificats TLS par défaut.
Quels rapports Locust fournit-il, et comment s’intègre-t-il à la CI ?
Vous obtenez des graphiques en direct dans l’interface web et, à la demande, des fichiers de résultats. En CI, Locust se termine avec le code 1 si une requête a échoué.
D’après la référence de configuration, --csv écrit des fichiers de statistiques, d’historique et d’échecs, --html enregistre un rapport et --json affiche les statistiques finales. --otel exporte vers un backend OpenTelemetry. La documentation du mode headless montre un listener qui fait échouer l’exécution selon le taux d’échec, le temps de réponse moyen ou le 95e percentile, et notre guide du test de charge dans GitHub Actions l’intègre à un workflow.
Quels sont les points forts de Locust, et où sont ses limites ?
Locust brille par sa logique de test et avec de nombreux utilisateurs simultanés qui attendent la plupart du temps. Il est plus faible sur le nombre de requêtes par processus et sur les protocoles qu’il faut brancher soi-même.
Comme les tests sont du Python pur, boucles, conditions, données générées et votre propre client d’API fonctionnent tous, et les tests vivent dans le contrôle de version. La page What is Locust explique que le faible coût de chaque utilisateur convient aux charges très concurrentes, tout en admettant que d’autres outils peuvent envoyer plus de requêtes par seconde sur le même matériel.
Les limites que la documentation reconnaît elle-même :
- Un processus Python n’utilise qu’un seul cœur de CPU.
- Les bibliothèques qui font leurs E/S en C bloquent le processus, sauf si gevent peut les patcher.
HttpUsern’analyse pas le HTML et ne charge pas les ressources des pages.- Le temps d’attente ne peut pas ajouter d’utilisateurs pour tenir un débit de requêtes.
Quels autres outils Python existent pour les tests de charge ?
Locust est le moteur Python activement développé. Molotov, la principale alternative, n’a publié aucune version sur PyPI depuis 2022, et Taurus exécute Locust via l’un de ses exécuteurs.
Molotov est un outil pour Python 3.8+ construit sur asyncio et aiohttp ; sa dernière version sur PyPI est la 2.6, du 21 octobre 2022, et le dernier commit de sa branche principale date de novembre 2023 (vérifié le 21 octobre 2026). Taurus exécute un locustfile, ou de simples requêtes GET et POST écrites en YAML, via son exécuteur locust. Vous installez Locust vous-même, en mode distribué Taurus ne lance que le master, et son réglage throughput n’a aucun effet avec cet exécuteur (vérifié le 21 octobre 2026).
Quand choisir plutôt k6, JMeter ou Gatling ?
Choisissez un autre outil quand son langage, ses protocoles ou son modèle de charge conviennent mieux à votre équipe.
Notre panorama des outils de test de charge open source place Locust à côté de cinq autres.
Choisissez plutôt k6 si votre équipe écrit du JavaScript, veut des critères de réussite sous forme de thresholds dans le script, ou a besoin d’un modèle de charge ouvert, que fournissent les exécuteurs arrival-rate de k6 (vérifié le 9 octobre 2026). LoadFocus exécute des scripts k6 depuis 25 régions cloud, mais lance les scénarios arrival-rate avec un nombre fixe d’utilisateurs : pour tenir un débit de requêtes, exécutez-les avec k6 lui-même.
Choisissez plutôt JMeter si vous avez besoin de JDBC, JMS, LDAP ou FTP prêts à l’emploi, comme le liste son README, ou si vos testeurs construisent leurs tests dans une interface graphique. Locust vs JMeter compare les deux en détail.
Choisissez plutôt Gatling si votre équipe travaille sur la JVM et veut des profils d’injection ouverts et fermés dans une même API (vérifié le 9 octobre 2026). Gatling vs JMeter le présente plus en détail.
FAQ
Locust est-il gratuit pour un usage commercial ? Oui. Locust est publié sous licence MIT, qui autorise l’usage commercial, la modification et la redistribution.
Quelle version de Python faut-il pour Locust ?
Python 3.11 ou plus récent, d’après ses métadonnées PyPI. Installez-le avec pip install locust, ou lancez-le dans un environnement temporaire avec uvx locust.
LoadFocus peut-il exécuter des tests Locust ? Non. LoadFocus exécute des plans de test JMeter et des scripts k6. Pour monter un test Locust en charge, utilisez son mode master et workers, l’opérateur Kubernetes ou Azure Load Testing.
À lire aussi
- Locust vs JMeter : scripts Python ou plans de test JMeter ?
- Outils de test de charge open source : six options
- k6 vs Locust : scripts JavaScript ou utilisateurs Python ?
- Gatling vs Locust : simulations JVM ou locustfiles Python ?
Les affirmations techniques de cet article n'ont pas été relues de façon indépendante.