I'm impressed not more people talk about locust (http://locust.io/). The thing is awesome :) Shoutout too the guys from ESN :)

Armin Ronacher Author of Flask, Jinja2 & more

it’s become a mandatory part of the development of any large scale HTTP service built at DICE at this point.

Joakim Bodin Lead Software Engineer at EA/DICE

locust.io is pretty fantastic, wish it had a bit more in the way of docs for non-HTTP stuff though

Alex Gaynor Django & PyPy core developer
from locust import HttpUser, between, task

class WebsiteUser(HttpUser):
    wait_time = between(5, 15)
    def on_start(self):
        self.client.post("/login", {
            "username": "test_user",
            "password": ""
    def index(self):
    def about(self):
# This locust test script example will simulate a user 
# browsing the Locust documentation on https://docs.locust.io

import random
from locust import HttpUser, between, task
from pyquery import PyQuery

class AwesomeUser(HttpUser):
    host = "https://docs.locust.io/en/latest/"
    # we assume someone who is browsing the Locust docs, 
    # generally has a quite long waiting time (between 
    # 10 and 600 seconds), since there's a bunch of text 
    # on each page
    wait_time = between(10, 600)
    def on_start(self):
        # start by waiting so that the simulated users 
        # won't all arrive at the same time
        # assume all users arrive at the index page
        self.urls_on_current_page = self.toc_urls
    def index_page(self):
        r = self.client.get("")
        pq = PyQuery(r.content)
        link_elements = pq(".toctree-wrapper a.internal")
        self.toc_urls = [
            l.attrib["href"] for l in link_elements
    def load_page(self):
        url = random.choice(self.toc_urls)
        r = self.client.get(url)
        pq = PyQuery(r.content)
        link_elements = pq("a.internal")
        self.urls_on_current_page = [
            l.attrib["href"] for l in link_elements
    def load_sub_page(self):
        url = random.choice(self.urls_on_current_page)
        r = self.client.get(url)
# An example on how to use and nest TaskSets

from locust import HttpUser, TaskSet, task, between

class ForumThread(TaskSet):

class ForumPage(TaskSet):
    # wait_time can be overridden for individual TaskSets
    wait_time = between(10, 300)
    # TaskSets can be nested multiple levels
    tasks = {
    def forum_index(self):
    def stop(self):

class AboutPage(TaskSet):

class WebsiteUser(HttpUser):
    wait_time = between(5, 15)
    # We can specify sub TaskSets using the tasks dict
    tasks = {
        ForumPage: 20,
        AboutPage: 10,
    # We can use the @task decorator as well as the  
    # tasks dict in the same Locust/TaskSet
    def index(self):
$ locust -f locustfile.py

Example code

A fundamental feature of Locust is that you describe all your test in Python code. No need for clunky UIs or bloated XML, just plain code.

Select example

Used by


The easiest way to install Locust is from PyPI, using pip:

> pip install locust

Read more detailed installations instructions in the documentation.

Get the source code at Github.

Maintainers & Contributors

And more than 100 additional awesome contributors!

Original Authors