API

User class

class User(environment)

Represents a “user” which is to be hatched and attack the system that is to be load tested.

The behaviour of this user is defined by its tasks. Tasks can be declared either directly on the class by using the @task decorator on methods, or by setting the tasks attribute.

This class should usually be subclassed by a class that defines some kind of client. For example when load testing an HTTP system, you probably want to use the HttpUser class.

abstract = True

If abstract is True, the class is meant to be subclassed, and locust will not spawn users of this class during a test.

on_start()

Called when a User starts running.

on_stop()

Called when a User stops running (is killed)

tasks = []

Collection of python callables and/or TaskSet classes that the Locust user(s) will run.

If tasks is a list, the task to be performed will be picked randomly.

If tasks is a (callable,int) list of two-tuples, or a {callable:int} dict, the task to be performed will be picked randomly, but each task will be weighted according to its corresponding int value. So in the following case, ThreadPage will be fifteen times more likely to be picked than write_post:

class ForumPage(TaskSet):
    tasks = {ThreadPage:15, write_post:1}
wait()

Make the running user sleep for a duration defined by the User.wait_time function.

The user can also be killed gracefully while it’s sleeping, so calling this method within a task makes it possible for a user to be killed mid-task even if you’ve set a stop_timeout. If this behavour is not desired, you should make the user wait using gevent.sleep() instead.

wait_time = None

Method that returns the time (in seconds) between the execution of locust tasks. Can be overridden for individual TaskSets.

Example:

from locust import User, between
class MyUser(User):
    wait_time = between(3, 25)
weight = 10

Probability of user class being chosen. The higher the weight, the greater the chance of it being chosen.

HttpUser class

class HttpUser(*args, **kwargs)

Represents an HTTP “user” which is to be hatched and attack the system that is to be load tested.

The behaviour of this user is defined by its tasks. Tasks can be declared either directly on the class by using the @task decorator on methods, or by setting the tasks attribute.

This class creates a client attribute on instantiation which is an HTTP client with support for keeping a user session between requests.

abstract = True

If abstract is True, the class is meant to be subclassed, and users will not choose this locust during a test

client = None

Instance of HttpSession that is created upon instantiation of Locust. The client supports cookies, and therefore keeps the session between HTTP requests.

TaskSet class

class TaskSet(parent)

Class defining a set of tasks that a User will execute.

When a TaskSet starts running, it will pick a task from the tasks attribute, execute it, and then sleep for the number of seconds returned by its wait_time function. If no wait_time method has been declared on the TaskSet, it’ll call the wait_time function on the User by default. It will then schedule another task for execution and so on.

TaskSets can be nested, which means that a TaskSet’s tasks attribute can contain another TaskSet. If the nested TaskSet is scheduled to be executed, it will be instantiated and called from the currently executing TaskSet. Execution in the currently running TaskSet will then be handed over to the nested TaskSet which will continue to run until it throws an InterruptTaskSet exception, which is done when TaskSet.interrupt() is called. (execution will then continue in the first TaskSet).

client

Shortcut to the client client attribute of this TaskSet’s User

interrupt(reschedule=True)

Interrupt the TaskSet and hand over execution control back to the parent TaskSet.

If reschedule is True (default), the parent User will immediately re-schedule, and execute, a new task.

on_start()

Called when a User starts executing this TaskSet

on_stop()

Called when a User stops executing this TaskSet. E.g. when TaskSet.interrupt() is called or when the User is killed

parent

Parent TaskSet instance of this TaskSet (or User if this is not a nested TaskSet)

schedule_task(task_callable, first=False)

Add a task to the User’s task execution queue.

Parameters:
  • task_callable – User task to schedule.
  • args – Arguments that will be passed to the task callable.
  • kwargs – Dict of keyword arguments that will be passed to the task callable.
  • first – Optional keyword argument. If True, the task will be put first in the queue.
tasks = []

Collection of python callables and/or TaskSet classes that the User(s) will run.

If tasks is a list, the task to be performed will be picked randomly.

If tasks is a (callable,int) list of two-tuples, or a {callable:int} dict, the task to be performed will be picked randomly, but each task will be weighted according to its corresponding int value. So in the following case, ThreadPage will be fifteen times more likely to be picked than write_post:

class ForumPage(TaskSet):
    tasks = {ThreadPage:15, write_post:1}
user

User instance that this TaskSet was created by

wait()

Make the running user sleep for a duration defined by the Locust.wait_time function (or TaskSet.wait_time function if it’s been defined).

The user can also be killed gracefully while it’s sleeping, so calling this method within a task makes it possible for a user to be killed mid-task, even if you’ve set a stop_timeout. If this behavour is not desired you should make the user wait using gevent.sleep() instead.

wait_time()

Method that returns the time (in seconds) between the execution of tasks.

Example:

from locust import TaskSet, between
class Tasks(TaskSet):
    wait_time = between(3, 25)

task decorator

task(weight=1)

Used as a convenience decorator to be able to declare tasks for a User or a TaskSet inline in the class. Example:

class ForumPage(TaskSet):
    @task(100)
    def read_thread(self):
        pass
    
    @task(7)
    def create_thread(self):
        pass

tag decorator

tag(*tags)

Decorator for tagging tasks and TaskSets with the given tag name. You can then limit the test to only execute tasks that are tagged with any of the tags provided by the –tags command-line argument. Example:

class ForumPage(TaskSet):
    @tag('thread')
    @task(100)
    def read_thread(self):
        pass

    @tag('thread')
    @tag('post')
    @task(7)
    def create_thread(self):
        pass

    @tag('post')
    @task(11)
    def comment(self):
        pass

SequentialTaskSet class

class SequentialTaskSet(*args, **kwargs)

Class defining a sequence of tasks that a User will execute.

Works like TaskSet, but task weight is ignored, and all tasks are executed in order. Tasks can either be specified by setting the tasks attribute to a list of tasks, or by declaring tasks as methods using the @task decorator. The order of declaration decides the order of execution.

It’s possible to combine a task list in the tasks attribute, with some tasks declared using the @task decorator. The order of declaration is respected also in that case.

client

Shortcut to the client client attribute of this TaskSet’s User

interrupt(reschedule=True)

Interrupt the TaskSet and hand over execution control back to the parent TaskSet.

If reschedule is True (default), the parent User will immediately re-schedule, and execute, a new task.

on_start()

Called when a User starts executing this TaskSet

on_stop()

Called when a User stops executing this TaskSet. E.g. when TaskSet.interrupt() is called or when the User is killed

parent

Parent TaskSet instance of this TaskSet (or User if this is not a nested TaskSet)

schedule_task(task_callable, first=False)

Add a task to the User’s task execution queue.

Parameters:
  • task_callable – User task to schedule.
  • args – Arguments that will be passed to the task callable.
  • kwargs – Dict of keyword arguments that will be passed to the task callable.
  • first – Optional keyword argument. If True, the task will be put first in the queue.
user

User instance that this TaskSet was created by

wait_time()

Method that returns the time (in seconds) between the execution of tasks.

Example:

from locust import TaskSet, between
class Tasks(TaskSet):
    wait_time = between(3, 25)

Built in wait_time functions

between(min_wait, max_wait)

Returns a function that will return a random number between min_wait and max_wait.

Example:

class MyUser(User):
    # wait between 3.0 and 10.5 seconds after each task
    wait_time = between(3.0, 10.5)
constant(wait_time)

Returns a function that just returns the number specified by the wait_time argument

Example:

class MyUser(User):
    wait_time = constant(3)
constant_pacing(wait_time)

Returns a function that will track the run time of the tasks, and for each time it’s called it will return a wait time that will try to make the total time between task execution equal to the time specified by the wait_time argument.

In the following example the task will always be executed once every second, no matter the task execution time:

class MyUser(User):
    wait_time = constant_pacing(1)
    @task
    def my_task(self):
        time.sleep(random.random())

If a task execution exceeds the specified wait_time, the wait will be 0 before starting the next task.

HttpSession class

class HttpSession(base_url, request_success, request_failure, *args, **kwargs)

Class for performing web requests and holding (session-) cookies between requests (in order to be able to log in and out of websites). Each request is logged so that locust can display statistics.

This is a slightly extended version of python-request’s requests.Session class and mostly this class works exactly the same. However the methods for making requests (get, post, delete, put, head, options, patch, request) can now take a url argument that’s only the path part of the URL, in which case the host part of the URL will be prepended with the HttpSession.base_url which is normally inherited from a User class’ host property.

Each of the methods for making requests also takes two additional optional arguments which are Locust specific and doesn’t exist in python-requests. These are:

Parameters:
  • name – (optional) An argument that can be specified to use as label in Locust’s statistics instead of the URL path. This can be used to group different URL’s that are requested into a single entry in Locust’s statistics.
  • catch_response – (optional) Boolean argument that, if set, can be used to make a request return a context manager to work as argument to a with statement. This will allow the request to be marked as a fail based on the content of the response, even if the response code is ok (2xx). The opposite also works, one can use catch_response to catch a request and then mark it as successful even if the response code was not (i.e 500 or 404).
__init__(base_url, request_success, request_failure, *args, **kwargs)

Initialize self. See help(type(self)) for accurate signature.

delete(url, **kwargs)

Sends a DELETE request. Returns Response object.

Parameters:
  • url – URL for the new Request object.
  • **kwargs – Optional arguments that request takes.
Return type:

requests.Response

get(url, **kwargs)

Sends a GET request. Returns Response object.

Parameters:
  • url – URL for the new Request object.
  • **kwargs – Optional arguments that request takes.
Return type:

requests.Response

head(url, **kwargs)

Sends a HEAD request. Returns Response object.

Parameters:
  • url – URL for the new Request object.
  • **kwargs – Optional arguments that request takes.
Return type:

requests.Response

options(url, **kwargs)

Sends a OPTIONS request. Returns Response object.

Parameters:
  • url – URL for the new Request object.
  • **kwargs – Optional arguments that request takes.
Return type:

requests.Response

patch(url, data=None, **kwargs)

Sends a PATCH request. Returns Response object.

Parameters:
  • url – URL for the new Request object.
  • data – (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the Request.
  • **kwargs – Optional arguments that request takes.
Return type:

requests.Response

post(url, data=None, json=None, **kwargs)

Sends a POST request. Returns Response object.

Parameters:
  • url – URL for the new Request object.
  • data – (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the Request.
  • json – (optional) json to send in the body of the Request.
  • **kwargs – Optional arguments that request takes.
Return type:

requests.Response

put(url, data=None, **kwargs)

Sends a PUT request. Returns Response object.

Parameters:
  • url – URL for the new Request object.
  • data – (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the Request.
  • **kwargs – Optional arguments that request takes.
Return type:

requests.Response

request(method, url, name=None, catch_response=False, **kwargs)

Constructs and sends a requests.Request. Returns requests.Response object.

Parameters:
  • method – method for the new Request object.
  • url – URL for the new Request object.
  • name – (optional) An argument that can be specified to use as label in Locust’s statistics instead of the URL path. This can be used to group different URL’s that are requested into a single entry in Locust’s statistics.
  • catch_response – (optional) Boolean argument that, if set, can be used to make a request return a context manager to work as argument to a with statement. This will allow the request to be marked as a fail based on the content of the response, even if the response code is ok (2xx). The opposite also works, one can use catch_response to catch a request and then mark it as successful even if the response code was not (i.e 500 or 404).
  • params – (optional) Dictionary or bytes to be sent in the query string for the Request.
  • data – (optional) Dictionary or bytes to send in the body of the Request.
  • headers – (optional) Dictionary of HTTP Headers to send with the Request.
  • cookies – (optional) Dict or CookieJar object to send with the Request.
  • files – (optional) Dictionary of 'filename': file-like-objects for multipart encoding upload.
  • auth – (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth.
  • timeout (float or tuple) – (optional) How long in seconds to wait for the server to send data before giving up, as a float, or a (connect timeout, read timeout) tuple.
  • allow_redirects (bool) – (optional) Set to True by default.
  • proxies – (optional) Dictionary mapping protocol to the URL of the proxy.
  • stream – (optional) whether to immediately download the response content. Defaults to False.
  • verify – (optional) if True, the SSL cert will be verified. A CA_BUNDLE path can also be provided.
  • cert – (optional) if String, path to ssl client cert file (.pem). If Tuple, (‘cert’, ‘key’) pair.

Response class

This class actually resides in the python-requests library, since that’s what Locust is using to make HTTP requests, but it’s included in the API docs for locust since it’s so central when writing locust load tests. You can also look at the Response class at the requests documentation.

class Response

The Response object, which contains a server’s response to an HTTP request.

apparent_encoding

The apparent encoding, provided by the chardet library.

close()

Releases the connection back to the pool. Once this method has been called the underlying raw object must not be accessed again.

Note: Should not normally need to be called explicitly.

content

Content of the response, in bytes.

cookies = None

A CookieJar of Cookies the server sent back.

elapsed = None

The amount of time elapsed between sending the request and the arrival of the response (as a timedelta). This property specifically measures the time taken between sending the first byte of the request and finishing parsing the headers. It is therefore unaffected by consuming the response content or the value of the stream keyword argument.

encoding = None

Encoding to decode with when accessing r.text.

headers = None

Case-insensitive Dictionary of Response Headers. For example, headers['content-encoding'] will return the value of a 'Content-Encoding' response header.

history = None

A list of Response objects from the history of the Request. Any redirect responses will end up here. The list is sorted from the oldest to the most recent request.

is_permanent_redirect

True if this Response one of the permanent versions of redirect.

is_redirect

True if this Response is a well-formed HTTP redirect that could have been processed automatically (by Session.resolve_redirects()).

iter_content(chunk_size=1, decode_unicode=False)

Iterates over the response data. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. The chunk size is the number of bytes it should read into memory. This is not necessarily the length of each item returned as decoding can take place.

chunk_size must be of type int or None. A value of None will function differently depending on the value of stream. stream=True will read data as it arrives in whatever size the chunks are received. If stream=False, data is returned as a single chunk.

If decode_unicode is True, content will be decoded using the best available encoding based on the response.

iter_lines(chunk_size=512, decode_unicode=False, delimiter=None)

Iterates over the response data, one line at a time. When stream=True is set on the request, this avoids reading the content at once into memory for large responses.

Note

This method is not reentrant safe.

json(**kwargs)

Returns the json-encoded content of a response, if any.

Parameters:**kwargs – Optional arguments that json.loads takes.
Raises:ValueError – If the response body does not contain valid json.
links

Returns the parsed header links of the response, if any.

next

Returns a PreparedRequest for the next request in a redirect chain, if there is one.

ok

Returns True if status_code is less than 400, False if not.

This attribute checks if the status code of the response is between 400 and 600 to see if there was a client error or a server error. If the status code is between 200 and 400, this will return True. This is not a check to see if the response code is 200 OK.

raise_for_status()

Raises stored HTTPError, if one occurred.

raw = None

File-like object representation of response (for advanced usage). Use of raw requires that stream=True be set on the request. This requirement does not apply for use internally to Requests.

reason = None

Textual reason of responded HTTP Status, e.g. “Not Found” or “OK”.

request = None

The PreparedRequest object to which this is a response.

status_code = None

Integer Code of responded HTTP Status, e.g. 404 or 200.

text

Content of the response, in unicode.

If Response.encoding is None, encoding will be guessed using chardet.

The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set r.encoding appropriately before accessing this property.

url = None

Final URL location of Response.

ResponseContextManager class

class ResponseContextManager(response, request_success, request_failure)

A Response class that also acts as a context manager that provides the ability to manually control if an HTTP request should be marked as successful or a failure in Locust’s statistics

This class is a subclass of Response with two additional methods: success and failure.

failure(exc)

Report the response as a failure.

exc can be either a python exception, or a string in which case it will be wrapped inside a CatchResponseError.

Example:

with self.client.get("/", catch_response=True) as response:
    if response.content == b"":
        response.failure("No data")
success()

Report the response as successful

Example:

with self.client.get("/does/not/exist", catch_response=True) as response:
    if response.status_code == 404:
        response.success()

InterruptTaskSet Exception

exception InterruptTaskSet(reschedule=True)

Exception that will interrupt a User when thrown inside a task

Environment class

class Environment(*, user_classes=[], tags=None, exclude_tags=None, events=None, host=None, reset_stats=False, step_load=False, stop_timeout=None, catch_exceptions=True, parsed_options=None)
catch_exceptions = True

If True exceptions that happen within running users will be catched (and reported in UI/console). If False, exeptions will be raised.

create_local_runner()

Create a LocalRunner instance for this Environment

create_master_runner(master_bind_host='*', master_bind_port=5557)

Create a MasterRunner instance for this Environment

Parameters:
  • master_bind_host – Interface/host that the master should use for incoming worker connections. Defaults to “*” which means all interfaces.
  • master_bind_port – Port that the master should listen for incoming worker connections on
create_web_ui(host='', port=8089, auth_credentials=None, tls_cert=None, tls_key=None)

Creates a WebUI instance for this Environment and start running the web server

Parameters:
  • host – Host/interface that the web server should accept connections to. Defaults to “” which means all interfaces
  • port – Port that the web server should listen to
  • auth_credentials – If provided (in format “username:password”) basic auth will be enabled
  • tls_cert – An optional path (str) to a TLS cert. If this is provided the web UI will be served over HTTPS
  • tls_key – An optional path (str) to a TLS private key. If this is provided the web UI will be served over HTTPS
create_worker_runner(master_host, master_port)

Create a WorkerRunner instance for this Environment

Parameters:
  • master_host – Host/IP of a running master node
  • master_port – Port on master node to connect to
events = None

Event hooks used by Locust internally, as well as to extend Locust’s functionality See Event hooks for available events.

exclude_tags = None

If set, only tasks that aren’t tagged by tags in this list will be executed

host = None

Base URL of the target system

parsed_options = None

Optional reference to the parsed command line options (used to pre-populate fields in Web UI)

process_exit_code = None

If set it’ll be the exit code of the Locust process

reset_stats = False

Determines if stats should be reset once all simulated users have been spawned

runner = None

Reference to the Runner instance

stats = None

Reference to RequestStats instance

step_load = False

Determines if we’re running in step load mode

stop_timeout = None

If set, the runner will try to stop the runnning users gracefully and wait this many seconds before killing them hard.

tags = None

If set, only tasks that are tagged by tags in this list will be executed

user_classes = []

User classes that the runner will run

web_ui = None

Reference to the WebUI instance

Event hooks

Locust provide event hooks that can be used to extend Locus in various ways.

The following event hooks are available under Environment.events, and there’s also a reference to these events under locust.events that can be used at the module level of locust scripts (since the Environment instance hasn’t been created when the locustfile is imported).

class Events
hatch_complete

Fired when all simulated users has been spawned.

Event arguments:

Parameters:user_count – Number of users that was hatched

alias of EventHook

init

Fired when Locust is started, once the Environment instance and locust runner instance have been created. This hook can be used by end-users’ code to run code that requires access to the Envirionment. For example to register listeners to request_success, request_failure or other events.

Event arguments:

Parameters:environment – Environment instance

alias of EventHook

init_command_line_parser

Event that can be used to add command line options to Locust

Event arguments:

Parameters:parser – ArgumentParser instance

alias of EventHook

quitting

Fired when the locust process is exiting

Event arguments:

Parameters:environment – Environment instance

alias of EventHook

report_to_master

Used when Locust is running in –worker mode. It can be used to attach data to the dicts that are regularly sent to the master. It’s fired regularly when a report is to be sent to the master server.

Note that the keys “stats” and “errors” are used by Locust and shouldn’t be overridden.

Event arguments:

Parameters:
  • client_id – The client id of the running locust process.
  • data – Data dict that can be modified in order to attach data that should be sent to the master.

alias of EventHook

request_failure

Fired when a request fails. This event is typically used to report failed requests when writing custom clients for locust.

Event arguments:

Parameters:
  • request_type – Request type method used
  • name – Path to the URL that was called (or override name if it was used in the call to the client)
  • response_time – Time in milliseconds until exception was thrown
  • response_length – Content-length of the response
  • exception – Exception instance that was thrown

alias of EventHook

request_success

Fired when a request is completed successfully. This event is typically used to report requests when writing custom clients for locust.

Event arguments:

Parameters:
  • request_type – Request type method used
  • name – Path to the URL that was called (or override name if it was used in the call to the client)
  • response_time – Response time in milliseconds
  • response_length – Content-length of the response

alias of EventHook

test_start

Fired when a new load test is started. It’s not fired again if the number of users change during a test. When running locust distributed the event is only fired on the master node and not on each worker node.

alias of EventHook

test_stop

Fired when a load test is stopped. When running locust distributed the event is only fired on the master node and not on each worker node.

alias of EventHook

user_error

Fired when an exception occurs inside the execution of a User class.

Event arguments:

Parameters:
  • user_instance – User class instance where the exception occurred
  • exception – Exception that was thrown
  • tb – Traceback object (from sys.exc_info()[2])

alias of EventHook

worker_report

Used when Locust is running in –master mode and is fired when the master server receives a report from a Locust worker server.

This event can be used to aggregate data from the locust worker servers.

Event arguments:

Parameters:
  • client_id – Client id of the reporting worker
  • data – Data dict with the data from the worker node

alias of EventHook

EventHook class

The event hooks are instances of the locust.events.EventHook class:

class EventHook

Simple event class used to provide hooks for different types of events in Locust.

Here’s how to use the EventHook class:

my_event = EventHook()
def on_my_event(a, b, **kw):
    print("Event was fired with arguments: %s, %s" % (a, b))
my_event.add_listener(on_my_event)
my_event.fire(a="foo", b="bar")

If reverse is True, then the handlers will run in the reverse order that they were inserted

Note

It’s highly recommended that you add a wildcard keyword argument in your event listeners to prevent your code from breaking if new arguments are added in a future version.

Runner classes

class Runner(environment)

Orchestrates the load test by starting and stopping the users.

Use one of the create_local_runner, create_master_runner or create_worker_runner methods on the Environment instance to create a runner of the desired type.

quit()

Stop any running load test and kill all greenlets for the runner

start(user_count, hatch_rate, wait=False)

Start running a load test

Parameters:
  • user_count – Number of users to start
  • hatch_rate – Number of users to spawn per second
  • wait – If True calls to this method will block until all users are spawned. If False (the default), a greenlet that spawns the users will be started and the call to this method will return immediately.
stop()

Stop a running load test by stopping all running users

user_count
Returns:Number of currently running users
class LocalRunner(environment)

Runner for running single process load test

class MasterRunner(environment, master_bind_host, master_bind_port)

Runner used to run distributed load tests across multiple processes and/or machines.

MasterRunner doesn’t spawn any user greenlets itself. Instead it expects WorkerRunners to connect to it, which it will then direct to start and stop user greenlets. Stats sent back from the WorkerRunners will aggregated.

class WorkerRunner(environment, master_host, master_port)

Runner used to run distributed load tests across multiple processes and/or machines.

WorkerRunner connects to a MasterRunner from which it’ll receive instructions to start and stop user greenlets. The WorkerRunner will preiodically take the stats generated by the running users and send back to the MasterRunner.

Web UI class

class WebUI(environment, host, port, auth_credentials=None, tls_cert=None, tls_key=None)

Sets up and runs a Flask web app that can start and stop load tests using the environment.runner as well as show the load test statistics in environment.stats

app = None

Reference to the flask.Flask app. Can be used to add additional web routes and customize the Flask app in other various ways. Example:

from flask import request

@web_ui.app.route("/my_custom_route")
def my_custom_route():
    return "your IP is: %s" % request.remote_addr
auth_required_if_enabled(view_func)

Decorator that can be used on custom route methods that will turn on Basic Auth authentication if the --web-auth flag is used. Example:

@web_ui.app.route("/my_custom_route")
@web_ui.auth_required_if_enabled
def my_custom_route():
    return "custom response"
greenlet = None

Greenlet of the running web server

server = None

Reference to the pyqsgi.WSGIServer instance

stop()

Stop the running web server