Что такое Locust, зачем он нужен. Установка, структура locustfile, запуск через CLI и Web UI.
Locust — нагрузочный инструмент, где сценарии пишутся на чистом Python. Вместо XML-конфигов вы описываете поведение пользователя обычным кодом, а инструмент симулирует тысячи таких пользователей одновременно.
Нагрузочное тестирование отвечает на вопрос: что произойдёт с приложением, когда к нему одновременно обратятся сотни или тысячи пользователей? Без такого теста вы узнаете ответ только в production — в момент пикового трафика или при вирусном росте.
Locust позволяет:
Locust устанавливается через pip. Рекомендуется использовать виртуальное окружение, чтобы не засорять глобальный интерпретатор:
python -m venv .venv
source .venv/bin/activate # Linux/macOS
# или .venv\Scripts\activate # Windows
pip install locustПосле установки проверьте версию:
locust --version
# Locust 2.x.xДля продвинутых сценариев с высокой производительностью HTTP-запросов устанавливают дополнительный пакет geventhttpclient:
pip install locust[geventhttpclient]Это даёт доступ к FastHttpUser, который значительно быстрее стандартного HttpUser при большом числе пользователей.
Весь сценарий описывается в файле locustfile.py. Минимальная структура — класс-наследник HttpUser с хотя бы одной задачей, помеченной декоратором @task:
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 3) # пауза между задачами: от 1 до 3 секунд
@task
def browse_homepage(self):
self.client.get("/")
@task(3)
def browse_catalog(self):
self.client.get("/catalog")Разберём каждый элемент:
HttpUser — базовый класс для пользователя, который отправляет HTTP-запросы. Предоставляет self.client — сессию requests с автоматическим сбором статистики.wait_time = between(1, 3) — случайная пауза между выполнением задач. Имитирует реальное поведение: люди не кликают мгновенно.@task — помечает метод как задачу Locust. Число в @task(3) — относительный вес: browse_catalog вызывается в 3 раза чаще, чем browse_homepage.Чтобы запустить тест с Web UI:
locust -f locustfile.pyLocust откроет веб-интерфейс по адресу http://localhost:8089. Там вы укажете:
http://localhost:8000)Можно передать параметры сразу в командной строке, минуя форму в UI:
locust -f locustfile.py \
--host http://localhost:8000 \
--users 100 \
--spawn-rate 10После запуска теста Web UI показывает несколько ключевых вкладок.
На вкладке Statistics — таблица с метриками по каждому эндпоинту:
На вкладке Charts — графики в реальном времени: RPS, время отклика, число активных пользователей.
На вкладке Failures — список упавших запросов с кодами ошибок и сообщениями.
Перцентили (p95, p99) важнее среднего значения. Среднее скрывает выбросы: если 99% запросов отвечают за 50ms, а 1% — за 30 секунд, среднее будет обманчиво низким.
User (виртуальный пользователь) — экземпляр вашего класса. Locust запускает столько greenlet-потоков (через gevent), сколько пользователей указано. Greenlets — это лёгкие корутины, поэтому можно симулировать тысячи пользователей на одном ядре.
Task — единица работы одного пользователя. После выполнения задачи пользователь ждёт wait_time и выбирает следующую задачу случайно с учётом весов.
Spawn rate — скорость появления новых пользователей. Если --users 1000 --spawn-rate 10, то система будет раскручиваться 100 секунд, что даёт возможность наблюдать поведение системы под нарастающей нагрузкой.
Host — базовый URL. Все относительные пути в self.client.get("/path") разворачиваются относительно него.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.