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

ФункцияLocustJMeter
ЯзыкPythonGUI/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 протоколы

Смотрите также

Официальные ресурсы

“Что мне нравится в 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 для экспорта.