Расширенные возможности
Управление выполнением
подробнее
Существуют инструменты для динамического управления тестом прямо во время его выполнения (внутри тела функции или фикстуры), в отличие от маркеров, которые задаются статически до запуска.
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.htmlpytest-cov(Покрытие кодом)
Показывает, какой процент твоего исходного кода (src) покрыт тестами.
Флаг:pytest --cov=srcpytest-ordering(Порядок тестов)
Позволяет вручную задать очередность выполнения (хотя в идеале тесты должны быть независимы). Маркер:@pytest.mark.run(order=1)
Зачем: Если логика теста А строго требует, чтобы сначала прошел тест Б.pytest-dependency(Зависимости)
Пропускает тест, если другой (зависимый) тест упал.
Пример: Если тестtest_loginупал, тоtest_post_commentдаже не запустится (статус Skipped).pytest-check(Мягкие ассерты / Soft Asserts)
Позволяет проводить несколько проверок в одном тесте, даже если первые из них провалились.
Использование: Через фикстуруcheckpytest-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=shorttestpaths- Указывает, в каких папках искать тесты.
Пример:testpaths = testspython_files- Шаблон имен файлов с тестами.
Пример:python_files = test_*.pymarkers- Регистрация кастомных маркеров.
Пример:markers = smoke: critical testsxfail_strict- Делаетstrict=Trueдля всехxfail.
Пример:xfail_strict = truefilterwarnings- Игнорирует или выводит предупреждения.
Пример:filterwarnings = ignore::DeprecationWarning
Пример pytest.ini
[pytest]
addopts = -v --lf --strict-markers
testpaths = tests
markers =
smoke: быстрые проверки
api: тесты бэкенда
xfail_strict = true