Основы Pytest

Что такое pytest?

подробнее

Pytest — это самый популярный фреймворк для тестирования на Python. Pytest появился, чтобы сделать тестирование в Python простым и приятным: меньше церемоний, больше читаемости и расширяемости. Он применяется везде — от библиотек и веб‑сервисов до ML‑проектов и инфраструктуры - и подходит как одиночным разработчикам, так и большим командам с CI/CD.

Пример простейшего теста

# src/my_func.py
def my_func(a, b):
    return a + b

# tests/test_my_func.py
def test_my_func()
    assert my_func(1, 2) == 3

Какие преимущества у pytest?

подробнее
  • Простота синтаксиса: тест — это обычная функция и обычный assert.
  • Отсутствие избыточного кода: Код тестов pytest состоит из коротких самодокументирующихся функций.
  • Лучшие сообщения об ошибках: «расшифровка» выражений в assert и наглядные tracebacks.
  • Фикстуры вместо классовой магии: декларативная система подготовки/очистки состояния без наследования.
  • Параметризация: Через @pytest.mark.parametrize можно использовать один и тот же тест с разными данными без дублирования.
  • Параллелизация: Есть возможность делать параллельные запуски тестов, делать ретраи, таймауты и бенчмарки.
  • Плагины: архитектура, которую можно расширять под любые сценарии (распараллеливание, ретраи, бенчмарки, отчеты и т. д.).

Как pytest обнаруживает тесты?

подробнее

Pytest использует автоматический механизм поиска (test discovery), основанный на именовании файлов и объектов. По умолчанию он сканирует текущую директорию и все вложенные папки, за исключением скрытых или исключенных в настройках.

Основные правила обнаружения

  • Файлы: ищет файлы с именами test_*.py или *_test.py.
  • Классы: внутри найденных файлов ищет классы, названия которых начинаются с Test*.
    Важно: у таких классов не должно быть метода __init__.
  • Функции и методы: ищет функции (вне классов) и методы (внутри тестовых классов), чьи имена начинаются с test_*.

Если запустить pytest без аргументов, поиск начнётся с текущего каталога. Затем pytest рекурсивно заходит во все подпапки. Найденные файлы импортируются как модули Python для выполнения тестов.
Изменить эти правила (например, чтобы pytest искал файлы с другим префиксом), можно в файле конфигурации pytest.ini через параметры python_files, python_classes и python_functions.