This is an internal project for performing load testing on KoboToolbox components (kpi, enketo, openrosa).
docker compose build
docker compose uppoetry install
poetry shell
locust-
Copy the provided
.env.samplefile:cp .env.sample .env
-
Open the
assets/directory and locate the provided XLSX form file. -
On the KoboToolbox instance you want to test, create a new project by importing this XLSX form and deploy it.
-
After deployment, locate the
project_uidin the URL:https://[your-kpi-domain]/#/forms/<project_uid>/landing
From a Django shell on the instance (e.g. ./manage.py shell_plus), run:
import os
a = Asset.objects.get(uid='<project_uid>')
print('# Project unique identifiers')
print(f'PROJECT_UID={a.uid}')
print(f'VERSION_UID={a.latest_deployed_version.uid}')
print(f'FORM_UUID={a.deployment.xform.uuid}')
print(f"ENKETO_FORM_UID={a.deployment.get_enketo_survey_links()['url'].split('/')[-1]}")
print('\n# Auth')
print(f'API_TOKEN={Token.objects.get(user=a.owner).key}')
print('DIGEST_USER=')
print('DIGEST_PASS=')
print('\n# URLs')
print(f"ENKETO_SUBDOMAIN={os.getenv('ENKETO_EXPRESS_PUBLIC_SUBDOMAIN')}")
print(f"KC_SUBDOMAIN={os.getenv('KOBOCAT_PUBLIC_SUBDOMAIN')}")
print(f"KPI_SUBDOMAIN={os.getenv('KOBOFORM_PUBLIC_SUBDOMAIN')}")
print(f"SCHEME={os.getenv('PUBLIC_REQUEST_SCHEME')}")
print(f"DOMAIN_NAME={os.getenv('PUBLIC_DOMAIN_NAME')}")-
Paste the output into your
.envfile (replacing the placeholders). -
Then, edit the following values at the bottom of
.envto match your test configuration:
# Locust
MASTER_IP=1.2.3.4
LOCUST_TAGS=tag1,tag2,tag3
This project is preconfigured to run Locust in distributed mode using Docker Compose.
The docker-compose.yml file includes two services:
master: runs the Locust web interface and coordinates test executionworker: executes user tasks and sends results back to the master
The master instance runs Locust’s web interface and tells the workers when to spawn/stop users.
The worker instances run your users and send statistics back to the master.
The master instance itself does not run any users.
Source: https://docs.locust.io/en/stable/running-distributed.html
- The machine running the
mastermust have the following ports open:8089: for accessing the Locust web interface5557: for communication between master and workers
If you need additional load generation capacity:
- Clone this repository on each worker machine
- Use the same
.envfile as the master - Start only the
workerservice on the remote machine:
docker compose up locust-workerDue to Python’s Global Interpreter Lock (GIL), a single worker process can only use one CPU core effectively.
To fully utilize multi-core systems, you should run one worker per CPU core.
To scale workers on a multi-core machine, use:
docker compose up --scale locust-worker=<desired_number>For example, on a 4-core machine:
docker compose up --scale worker=4all: Run all tests.enketo: Run all tests simulating data collection with Enketo Express.simple: Run tests simulating data collection without attachments (Enketo).attachments: Run tests with attachments (via Enketo or OpenRosa).slow: Run tests simulating slow data collection with attachments (Enketo).normal: Run standard Enketo data collection tests.kpi: Run tests simulating KPI UI usage (e.g. data exports, submission deletions).openrosa: Run tests that POST submissions directly to the OpenRosa API.
Submitting data with Digest Auth doesn't currently work.
The first request correctly waits for a 401 response, but the second attempt uses Token Auth instead.
-
Start the server:
docker compose up
-
Open the Locust web UI: http://0.0.0.0:8089
Using an IDE is recommended. The VS Code debugger should work out of the box, thanks to the .vscode/launch.json file.
See Locust Issue #613 for more information.