Расширенные возможности

Управление выполнением

подробнее

Существуют инструменты для динамического управления тестом прямо во время его выполнения (внутри тела функции или фикстуры), в отличие от маркеров, которые задаются статически до запуска.

  • pytest.fail("msg") - Немедленно прерывает тест со статусом Failed.
  • pytest.skip("msg") - Прерывает тест со статусом Skipped.
  • pytest.xfail("msg") - Прерывает тест со статусом XFAIL.
  • pytest.exit("msg") - Немедленно завершает всю сессию тестов.

Пример

def test_external_api(api_client):
    if not api_client.is_alive():
        pytest.skip("Внешний сервис недоступен, пропускаем.")
    assert api_client.get_data() == "OK"

Флаги запуска

подробнее

Флаги запуска — это команды, которые передаются в терминале после pytest. Они управляют скоростью, детализацией и порядком выполнения тестов.

  • Детализация вывода (Verbosity)
    • -v (verbose): Подробный вывод. Показывает названия каждого теста и статус (PASSED/FAILED)
    • -q (quiet): Минимум информации. Только точки и итоговый результат.
    • -s (shortcut для --capture=no): Позволяет видеть print() и логи прямо в консоли во время выполнения теста (по умолчанию pytest их перехватывает и скрывает).
  • Управление падениями (Failure Control)
    • -x (--exitfirst): Остановить всю сессию тестов после первого же падения.
    • --maxfail=N: Остановить сессию после N падений.
    • --lf (--last-failed): Запустить только те тесты, которые упали в прошлый раз.
    • --ff (--failed-first): Запустить все тесты, но сначала прогнать упавшие.
    • --nf (--new-first): Сначала запустить новые тесты (по дате изменения файла).
  • Фильтрация и выбор тестов
    • -m: Запуск по маркеру (например, -m smoke). Поддерживает and, or, not.
    • -k: Запуск по части имени теста или класса.
      Пример: pytest -k "login" запустит все тесты, где в названии есть login.
    • path/to/test.py: Запуск конкретного файла.
    • path/to/test.py::test_func: Запуск одной конкретной функции в файле.
  • Другие полезные флаги
    • --collect-only: Только показать список найденных тестов, но не запускать их. Удобно для проверки маркеров.
    • --durations=N: Показать топ-N самых медленных тестов. Помогает найти «тормоза» в проекте.
    • --setup-show: Показать порядок выполнения фикстур (setup/teardown) относительно тестов.
    • --tb=style: Настройка отображения Traceback (ошибки).
      --tb=short — только суть ошибки (коротко).
      --tb=no — вообще не показывать дерево ошибок.

Пример применения

pytest -v -s --lf    # «Джентльменский набор»: подробно, с принтами, только упавшие.
pytest -m "not slow" # запустить всё, кроме долгих тестов.

Плагины

подробнее

Плагины - это надстройки, которые расширяют возможности Pytest.
Все установленные плагины можно посмотреть так: pytest --trace-config

Топ плагинов

  • pytest-xdist (Параллельный запуск)
    Позволяет гонять тесты в несколько потоков (на разных ядрах процессора).
    Флаг: pytest -n auto (автоматически определит число ядер) или pytest -n 4.
  • pytest-html (Отчёты)
    Генерирует красивый визуальный отчёт в формате HTML.
    Флаг: pytest --html=report.html
  • pytest-cov (Покрытие кодом)
    Показывает, какой процент твоего исходного кода (src) покрыт тестами.
    Флаг: pytest --cov=src
  • pytest-ordering (Порядок тестов)
    Позволяет вручную задать очередность выполнения (хотя в идеале тесты должны быть независимы). Маркер: @pytest.mark.run(order=1)
    Зачем: Если логика теста А строго требует, чтобы сначала прошел тест Б.
  • pytest-dependency (Зависимости)
    Пропускает тест, если другой (зависимый) тест упал.
    Пример: Если тест test_login упал, то test_post_comment даже не запустится (статус Skipped).
  • pytest-check (Мягкие ассерты / Soft Asserts)
    Позволяет проводить несколько проверок в одном тесте, даже если первые из них провалились.
    Использование: Через фикстуру check
  • pytest-mock (Удобные моки)
    Обертка над стандартным unittest.mock. Предоставляет фикстуру mocker, которая автоматически “убирает за собой” после теста.
  • pytest-repeat (Поиск нестабильных тестов)
    Позволяет запустить один и тот же тест (или всю сессию) заданное количество раз подряд.
    Флаг: pytest --count=10
    Маркер: Можно пометить конкретный тест: @pytest.mark.repeat(5)

Как запустить тесты параллельно?

подробнее

Для этого используется плагин pytest-xdist
pytest -n auto — автоматически распределит тесты по всем ядрам процессора.
pytest -n 4 — запуск строго в 4 потока.

Конфигурация pytest.ini/pyproject.toml

подробнее

Файл конфигурации - это «центр управления» проектом. Он позволяет не вводить флаги вручную и задает общие правила для всех тестов.
В современных проектах используют либо pytest.ini (классика), либо pyproject.toml (современный стандарт для всего Python-проекта).

Основные параметры

  • addopts - Добавляет флаги запуска по умолчанию.
    Пример: addopts = -v -s --tb=short
  • testpaths - Указывает, в каких папках искать тесты.
    Пример: testpaths = tests
  • python_files - Шаблон имен файлов с тестами.
    Пример: python_files = test_*.py
  • markers - Регистрация кастомных маркеров.
    Пример: markers = smoke: critical tests
  • xfail_strict - Делает strict=True для всех xfail.
    Пример: xfail_strict = true
  • filterwarnings - Игнорирует или выводит предупреждения.
    Пример: filterwarnings = ignore::DeprecationWarning

Пример pytest.ini

[pytest]
addopts = -v --lf --strict-markers
testpaths = tests
markers =
    smoke: быстрые проверки
    api: тесты бэкенда
xfail_strict = true