Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Locust: нагрузочное тестирование на Python
DevOps / Мониторинг·8 тем·71 вопрос·уровень Middle

Locust: нагрузочное тестирование на Python

Практический курс по нагрузочному тестированию с Locust. Охватывает создание сценариев на Python, настройку HttpUser и TaskSet, профили нагрузки LoadTestShape, распределённое тестирование в режиме master/worker, кастомные клиенты для WebSocket и gRPC, систему событий и хуков, а также интеграцию в CI/CD. Курс подходит backend-разработчикам и QA-инженерам, которые хотят перейти от ручного тестирования к автоматизированным нагрузочным сценариям на Python.

Начать курс

Locust: нагрузочное тестирование на Python

Сценарий в Locust — обычный класс на Python: методы с декоратором @task, HTTP-клиент внутри. Отсюда главное отличие от инструментов, настраиваемых конфигом: виртуальный пользователь может залогиниться, разобрать ответ, взять оттуда идентификатор, пойти дальше по своей ветке. То есть вести себя как человек, а не как обстрел одного URL.

Восемь тем. Установка, структура locustfile, запуск через веб-интерфейс и из командной строки. Затем HttpUser: задачи и их веса, паузы между действиями, и отдельно — catch_response, без которого ответ с кодом 500 попадает в отчёт как успешный, и график выглядит прекрасно при полностью сломанном сервисе.

Дальше сложные сценарии через TaskSet и SequentialTaskSet — когда порядок действий важен и пользователь проходит воронку. Профили нагрузки: LoadTestShape со ступенями, всплесками и плавным набором — вместо одного постоянного числа пользователей.

Затем распределённый запуск: архитектура master/worker, несколько процессов на машину (один упирается в GIL раньше, чем в сеть), Docker Compose для стенда. Кастомные клиенты: FastHttpUser, когда узким местом становится сам Locust, и свои клиенты для WebSocket и gRPC через request_meta.

Предпоследняя тема — система событий: слушатели, плагины, собственные метрики и выгрузка результатов куда нужно. Финал — CI: headless-режим, отчёты в CSV и HTML, критерии прохождения по перцентилям и доле ошибок, запуск в GitHub Actions и GitLab CI.

Для backend-разработчиков и QA. Нужен Python и понимание HTTP.

  1. 1

    Основы Locust: установка, первый тест, Web UI

    Что такое Locust, зачем он нужен. Установка, структура locustfile, запуск через CLI и Web UI.

    10 вопросов
  2. 2

    HttpUser: задачи, веса, паузы, валидация ответов

    Класс HttpUser, декоратор @task, веса задач, wait_time, self.client, catch_response и валидация.

    10 вопросов
  3. 3

    TaskSet и SequentialTaskSet: сложные сценарии

    Организация задач через TaskSet, прерывание сценария, SequentialTaskSet, вложенные наборы задач.

    9 вопросов
  4. 4

    LoadTestShape: профили нагрузки и spike-тесты

    Кастомные профили нагрузки через LoadTestShape.tick(), step load, spike, ramp-up/down паттерны.

    8 вопросов
  5. 5

    Распределённое тестирование: master/worker, Docker

    Архитектура master/worker, запуск нескольких worker-процессов, Docker Compose для Locust.

    8 вопросов
  6. 6

    Кастомные клиенты: FastHttpUser, WebSocket, gRPC

    FastHttpUser vs HttpUser, создание кастомного клиента для не-HTTP протоколов, request_meta.

    8 вопросов
  7. 7

    Events API: хуки, плагины, расширение Locust

    Встроенные события Locust, добавление слушателей, создание плагинов, кастомные метрики.

    9 вопросов
  8. 8

    CI/CD интеграция: headless-режим, отчёты

    Запуск без UI, CSV/HTML-отчёты, критерии прохождения, интеграция в GitHub Actions и GitLab CI.

    9 вопросов
  9. Зачёт

    Доступен после всех тем (0 из 8)

  10. Экзамен

    Доступен после зачёта

27 / 27

Locust

Основные концепции

Инструмент нагрузочного тестирования с открытым исходным кодом, где сценарии пишутся на Python. Использует gevent для симуляции тысяч пользователей в одном процессе.

Пример

pip install locust && locust -f locustfile.py

Связанные термины

locustfile

Основные концепции

Python-файл с описанием сценария нагрузочного теста. По умолчанию называется locustfile.py. Содержит классы пользователей, унаследованные от HttpUser или User.

Пример

locust -f tests/my_scenario.py --host http://localhost:8000

Связанные термины

Greenlet

Основные концепции

Лёгкая кооперативная корутина из библиотеки gevent. Locust запускает по одному greenlet на каждого виртуального пользователя. Переключение между greenlets происходит при I/O-операциях.

Пример

Один процесс Locust может запустить тысячи greenlets — по одному на пользователя.

Связанные термины

Spawn rate

Основные концепции

Скорость появления новых виртуальных пользователей в секунду. При users=100 и spawn_rate=10 Locust достигает максимума за 10 секунд.

Пример

locust -f locustfile.py --users 100 --spawn-rate 10

Связанные термины

Виртуальный пользователь (Virtual User)

Основные концепции

Экземпляр класса HttpUser или User, выполняющий задачи в рамках своего greenlet. Имитирует поведение реального пользователя: выполняет задачи, делает паузы, отправляет запросы.

Пример

При --users 500 Locust создаёт 500 экземпляров класса пользователя.

Связанные термины

HttpUser

Классы пользователей

Базовый класс Locust для пользователей, выполняющих HTTP-запросы. Предоставляет self.client — экземпляр HttpSession (наследник requests.Session) с автоматическим сбором статистики.

Пример

class MyUser(HttpUser): wait_time = between(1, 3) @task def browse(self): self.client.get('/')

Связанные термины

FastHttpUser

Классы пользователей

Более быстрая альтернатива HttpUser, использующая geventhttpclient вместо requests. Снижает overhead CPU на генераторе нагрузки при большом числе пользователей.

Пример

from locust.contrib.fasthttp import FastHttpUser class MyUser(FastHttpUser): ...

Связанные термины

on_start / on_stop

Классы пользователей

Методы жизненного цикла виртуального пользователя. on_start вызывается один раз при создании пользователя (до задач), on_stop — при его остановке. Используются для логина и освобождения ресурсов.

Пример

def on_start(self): self.client.post('/login', json={'user': 'test', 'pass': 'secret'})

Связанные термины

@task

Задачи и сценарии

Декоратор, помечающий метод класса пользователя как задачу. Принимает необязательный вес @task(N): чем выше N, тем чаще задача выбирается при случайном выборе.

Пример

@task(3) def browse_catalog(self): self.client.get('/catalog') # вызывается в 3 раза чаще @task(1)

Связанные термины

wait_time

Задачи и сценарии

Атрибут класса пользователя, задающий паузу между задачами. Основные варианты: between(min, max), constant(seconds), constant_throughput(rps).

Пример

wait_time = between(1, 5) # случайная пауза от 1 до 5 секунд wait_time = constant_throughput(2) # 2 задачи в секунду

Связанные термины

TaskSet

Задачи и сценарии

Класс для группировки задач в логический набор. Пользователь «входит» в TaskSet и выполняет его задачи до вызова self.interrupt(). Поддерживает вложенность.

Пример

class CatalogTasks(TaskSet): @task def browse(self): ... @task def leave(self): self.interrupt()

Связанные термины

SequentialTaskSet

Задачи и сценарии

Разновидность TaskSet, выполняющая задачи строго в порядке их определения в коде. Используется для сценариев с детерминированным порядком шагов: регистрация, оформление заказа и т.д.

Пример

class CheckoutFlow(SequentialTaskSet): @task def add_item(self): ... @task def checkout(self): ...

Связанные термины

self.interrupt()

Задачи и сценарии

Метод TaskSet для выхода из текущего набора задач обратно к родительскому уровню. Параметр reschedule=True (по умолчанию) переходит к следующей задаче сразу; reschedule=False — после wait_time.

Пример

@task def leave_section(self): self.interrupt(reschedule=False)

Связанные термины

catch_response

Задачи и сценарии

Параметр HTTP-методов, позволяющий вручную управлять статусом запроса в статистике. При catch_response=True доступны методы response.success() и response.failure(message).

Пример

with self.client.get('/health', catch_response=True) as r: if r.json().get('status') != 'ok': r.failure('Service unhealthy')

Связанные термины

LoadTestShape

Профили нагрузки

Класс для описания кастомного профиля нагрузки. Метод tick() вызывается каждую секунду и возвращает (user_count, spawn_rate) или None для остановки теста.

Пример

class StepShape(LoadTestShape): def tick(self): t = self.get_run_time() return (100 if t < 60 else 200, 10) if t < 120 else None

Связанные термины

Ramp-up

Профили нагрузки

Фаза нагрузочного теста с постепенным увеличением числа пользователей от 0 до максимума. Позволяет наблюдать поведение системы под нарастающей нагрузкой и найти точку деградации.

Пример

Ramp-up 0→200 за 2 минуты: spawn_rate=2, users=200, run-time=2m

Связанные термины

Spike test

Профили нагрузки

Нагрузочный сценарий с резким скачком нагрузки в 5–10 раз за короткое время. Проверяет устойчивость системы к внезапным пикам трафика и скорость восстановления после них.

Пример

Профиль: 50 пользователей → 500 за 5 секунд → удержание 30 секунд → возврат к 50.

Связанные термины

Step load test

Профили нагрузки

Нагрузочный сценарий, где нагрузка растёт ступенями: каждые N секунд добавляется фиксированное число пользователей. Используется для поиска точки деградации производительности.

Пример

0 → 100 → 200 → 300 пользователей с шагом каждые 60 секунд.

Связанные термины

Перцентиль (p50, p95, p99)

Метрики и статистика

Статистическая метрика латентности. p95=500ms означает, что 95% запросов выполнились быстрее 500ms. SLA обычно задаются через перцентили, а не через среднее значение.

Пример

p95 < 500ms — типичный SLA для API. p99 > 5s сигнализирует о тяжёлом хвосте.

Связанные термины

RPS (Requests Per Second)

Метрики и статистика

Пропускная способность системы в запросах в секунду. Один из ключевых показателей нагрузочного теста. В Web UI Locust отображается в колонке Requests/s.

Пример

Сервер обрабатывает 500 RPS при 100 пользователях с wait_time=between(0.1, 0.3).

Связанные термины

Латентность (Response Time / Latency)

Метрики и статистика

Время от отправки запроса до получения полного ответа, в миллисекундах. Измеряется для каждого запроса; агрегируется в статистике через перцентили.

Пример

Median=45ms, p95=210ms, p99=950ms — типичная картина с тяжёлым хвостом.

Связанные термины

SLA (Service Level Agreement)

Метрики и статистика

Соглашение об уровне обслуживания, задающее минимальные требования к производительности. В нагрузочном тестировании обычно выражается как пороги перцентилей: p95 < 500ms, error rate < 1%.

Пример

Нагрузочный тест в CI проверяет: p95 < 500ms для /api/checkout и error_rate < 0.5%.

Связанные термины

Master/Worker архитектура

Распределённое тестирование

Режим распределённого запуска Locust. Master управляет тестом и собирает статистику (не генерирует нагрузку). Workers выполняют задачи пользователей и отправляют метрики мастеру через ZeroMQ.

Пример

locust --master # один мастер locust --worker --master-host=192.168.1.10 # N воркеров

Связанные термины

--expect-workers

Распределённое тестирование

Флаг CLI, заставляющий master ждать указанное число подключённых worker'ов перед стартом теста в headless-режиме. Предотвращает запуск с неполным числом worker'ов.

Пример

locust -f locustfile.py --master --headless --users 1000 --expect-workers 4

Связанные термины

Events API

Расширяемость и интеграция

Система событий Locust для расширения поведения без изменения locustfile. Позволяет подписываться на события жизненного цикла теста: init, test_start, request, test_stop и другие.

Пример

@events.request.add_listener def on_req(name, response_time, exception, **kw): send_to_influx(name, response_time)

Связанные термины

EventHook

Расширяемость и интеграция

Объект для создания кастомных событий внутри locustfile. Другие части кода подписываются через add_listener и получают уведомления через fire().

Пример

checkout_done = EventHook() @checkout_done.add_listener def on_done(order_id, **kw): log(order_id) checkout_done.fire(order_id='123')

Связанные термины

Headless-режим

Расширяемость и интеграция

Запуск Locust без Web UI через флаг --headless. Используется в CI/CD. Требует явного указания --users, --spawn-rate и --run-time. Завершается с кодом выхода, зависящим от результатов теста.

Пример

locust -f locustfile.py --headless --users 100 --spawn-rate 10 --run-time 2m --csv=results

Связанные термины

Частые вопросы о курсе «Locust: нагрузочное тестирование на Python»

Состав курса, уровни, практика и способы проверки знаний.

Что входит в курс «Locust: нагрузочное тестирование на Python»?

Курс включает 8 тем и 71 вопрос с разбором ответа. Начать можно с первой темы курса.

Для какого уровня рассчитан курс «Locust: нагрузочное тестирование на Python»?

Маршрут охватывает уровни Middle. Темы расположены от основы к более сложным инженерным задачам, поэтому можно начать с подходящего места и не пропускать важные зависимости.

Как проверить, что материал усвоен?

После прохождения тем доступен зачёт по курсу «Locust: нагрузочное тестирование на Python» — 20 случайных вопросов с порогом 80%. После зачёта открывается экзамен с развёрнутыми ответами и автоматической оценкой, приближённый к техническому собеседованию.

Курс «Locust: нагрузочное тестирование на Python» бесплатный?

Да, курс полностью бесплатный: все 8 тем доступны без оплаты.