TL;DR: Locust — это Python-фреймворк нагрузочного тестирования. Пиши сценарии пользователей как Python-классы, запускай тесты через веб-UI или CLI, масштабируй с распределённым режимом. Идеален для Python-команд, которым нужны code-based тесты производительности с интеграцией CI/CD.
Locust — это Python-based open-source фреймворк нагрузочного тестирования, позволяющий инженерам описывать сложные сценарии поведения пользователей как Python-код, а не как XML-конфигурации или GUI-воркфлоу. С более чем 24,000 звёздами на GitHub он стал предпочтительным инструментом нагрузочного тестирования для Python-ориентированных команд. По данным JetBrains Developer Ecosystem Survey 2024, Python используется 51% разработчиков для автоматизации тестирования. В отличие от потоковой модели JMeter, Locust использует greenlets (лёгкие корутины), что позволяет одной машине симулировать тысячи параллельных пользователей с минимальным потреблением памяти. Это всестороннее руководство охватывает Locust от первого теста до распределённого нагрузочного тестирования в production.
Введение в Locust
Locust — это основанный на Python инструмент нагрузочного тестирования с открытым исходным кодом, который позволяет разработчикам писать тестовые сценарии на чистом Python коде. В отличие от GUI-тяжелых инструментов вроде JMeter, Locust предоставляет подход code-first с мощными возможностями распределенного тестирования и веб-мониторингом в реальном времени.
Locust отлично подходит для тестирования производительности API и интегрируется в CI/CD пайплайны. Для понимания места нагрузочного тестирования в общей картине, ознакомьтесь с нашим руководством по стратегии автоматизации тестирования.
Базовый Нагрузочный Тест
# locustfile.py
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 3)
host = "https://api.example.com"
@task(3)
def view_products(self):
self.client.get("/api/products")
@task(1)
def view_product_detail(self):
product_id = 123
self.client.get(f"/api/products/{product_id}")
@task(2)
def add_to_cart(self):
self.client.post("/api/cart", json={
"product_id": 456,
"quantity": 1
})
Сравнение Locust vs JMeter
| Функция | Locust | JMeter |
|---|---|---|
| Язык | Python | GUI/XML |
| Кривая Обучения | Низкая (если знаком Python) | Средняя-Высокая |
| Тесты как Код | Да (нативно) | Ограниченно |
| Распределенное Тестирование | Встроенное | Встроенное |
| UI в Реальном Времени | Веб, современный | Java Swing, устаревший |
| Контроль Версий | Отличный (Python файлы) | Плохой (XML файлы) |
| Использование Ресурсов | Ниже | Выше (Java) |
| Поддержка Протоколов | HTTP/WebSocket (расширяемый) | Обширная встроенная |
Лучшие Практики
1. Реалистичная Симуляция Пользователей
from locust import HttpUser, task, between
import random
class RealisticUser(HttpUser):
wait_time = between(1, 5)
@task(10)
def browse(self):
pages = ['/products', '/about', '/contact']
self.client.get(random.choice(pages))
@task(1)
def purchase(self):
if random.random() < 0.1:
self.client.post("/api/orders", json={
"items": [{"id": random.randint(1, 100), "qty": 1}]
})
Заключение
Locust предоставляет современный подход на основе Python к нагрузочному тестированию, который превосходен в рабочих процессах code-first, интеграции с контролем версий и распределенном тестировании. Его простота и гибкость делают его идеальным для разработчиков, знакомых с Python, которые хотят определять тесты производительности как код.
Выбирайте Locust когда:
- Команда комфортно работает с Python
- Предпочтительны тесты как код
- Желателен современный веб-UI
- Нужен легкий контроль версий
- Требуется распределенное тестирование
Выбирайте JMeter когда:
- Нужна обширная поддержка протоколов
- Команда предпочитает GUI-создание тестов
- Большая существующая инфраструктура JMeter
- Интенсивно используются не-HTTP протоколы
Смотрите также
- Тестирование производительности API — Основы тестирования производительности API
- Стратегия автоматизации тестирования — Интеграция нагрузочного тестирования в общую стратегию
- Оптимизация CI/CD пайплайнов для QA команд — Автоматизация нагрузочных тестов в пайплайнах
- Непрерывное тестирование в DevOps — Практики непрерывного тестирования производительности
- Playwright: Полное руководство по фреймворку — Комплексное тестирование веб-приложений
Официальные ресурсы
“Что мне нравится в Locust — тест И ЕСТЬ документация. Хорошо написанный locustfile точно показывает, какие пользовательские воркфлоу тестировались в системе. Эта ясность бесценна, когда регрессия производительности появляется через шесть месяцев.” — Yuri Kan, Senior QA Lead
FAQ
Что такое Locust и как он работает?
Locust — это Python-фреймворк нагрузочного тестирования, где поведение пользователей определяется как Python-классы с методами задач, выполняемых параллельно через greenlets.
Locust использует библиотеку Python gevent (greenlets) для параллелизма вместо потоков, позволяя тысячам виртуальных пользователей работать на одном процессе с минимальными накладными расходами. Ты определяешь класс User с методами, декорированными @task, представляющими действия пользователей.
Как Locust сравнивается с JMeter?
Locust использует Python-код для читаемых, версионируемых тестов; JMeter использует XML с GUI. Locust выигрывает по developer experience; JMeter — по разнообразию протоколов.
Тесты Locust — это Python-классы, читаемые в PR, легко параметризуемые логикой Python. Тесты JMeter — XML (сложно для ревью) с GUI. Locust превосходит JMeter для HTTP API тестирования со сложной логикой симуляции пользователей. JMeter поддерживает больше протоколов и имеет более широкую enterprise-экосистему.
Как запустить распределённые тесты Locust?
Запусти один master-процесс и несколько worker-процессов. Workers автоматически подключаются к master и получают задачи симуляции пользователей.
Распределённая установка Locust: запусти master с locust --master -f locustfile.py, запусти workers на других машинах с locust --worker --master-host=MASTER_IP -f locustfile.py. Master равномерно распределяет пользователей между workers.
Какие метрики сообщает Locust?
Запросов/сек, перцентили времени отклика (медиана, 95-й), частота ошибок и количество пользователей. Экспортируй в CSV или интегрируй с Grafana для дашбордов.
Locust сообщает метрики по эндпоинтам и агрегированные: количество запросов, количество ошибок, время отклика (медиана, 90-й, 95-й, 99-й перцентили), запросов/сек и ошибок/сек. Веб-UI показывает графики в реальном времени. Используй --csv=results для экспорта.
