← Назад к вопросам

Что такое conftest.py в pytest?

1.3 Junior🔥 112 комментариев
#Теория тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое conhtest.py в pytest?

conftest.py в pytest — это специальный файл, предназначенный для хранения и автоматического распространения общих ресурсов, настроек и плагинов для тестов в рамках указанной директории и всех её поддиректорий. Это один из краеугольных камней организации проектов на pytest, так как он позволяет избежать дублирования кода и обеспечивает централизованное управление зависимостями.

Основное назначение conftest.py

  • Автоматическое обнаружение: pytest автоматически обнаруживает и загружает все файлы conftest.py в текущей директории и во всех родительских директориях по отношению к месту запуска тестов. Это позволяет создавать иерархию настроек.
  • Область видимости (Scope): Ресурсы, объявленные в conftest.py, доступны для всех тестовых модулей (test_*.py или *_test.py), находящихся в той же директории, что и этот файл, или в любых её поддиректориях.
  • Изоляция и переопределение: Файлы conftest.py в поддиректориях могут переопределять ресурсы из родительских файлов, обеспечивая гибкость и локализацию поведения для отдельных групп тестов.

Что обычно размещают в conftest.py?

В этом файле определяется логика, общая для многих тестов.

  1. Фикстуры (Fixtures) — самый частый случай использования. Вместо того чтобы писать одну и ту же функцию setup/teardown в каждом файле с тестами, её один раз объявляют как фикстуру в conftest.py.
    # conftest.py
    import pytest
    from my_app import create_app, db
    
    @pytest.fixture(scope="session")
    def app():
        """Создаёт экземпляр приложения для тестирования."""
        app = create_app(testing=True)
        with app.app_context():
            db.create_all()
            yield app
            db.drop_all()
    
    @pytest.fixture(scope="function")
    def client(app):
        """Предоставляет тестовый клиент для запросов к приложению."""
        return app.test_client()
    
    Теперь любые тесты в проекте могут использовать эти фикстуры, просто объявив их в параметрах тестовой функции.

  1. Хуки (Hooks) — функции для изменения поведения самого pytest.

    # conftest.py
    def pytest_configure(config):
        """Вызывается при инициализации pytest."""
        config.addinivalue_line(
            "markers",
            "slow: маркер для обозначения медленных тестов (предупреждать при запуске)."
        )
    
    def pytest_collection_modifyitems(config, items):
        """Вызывается после сбора всех тестов. Можно модифицировать список."""
        for item in items:
            if "integration" in item.nodeid:
                item.add_marker(pytest.mark.integration)
    
  2. Пользовательские параметры командной строки — можно добавить свои опции для запуска.

    # conftest.py
    def pytest_addoption(parser):
        parser.addoption(
            "--env",
            action="store",
            default="staging",
            help="Указание окружения для запуска тестов: staging или production"
        )
    
    @pytest.fixture
    def env(request):
        """Фикстура, предоставляющая значение параметра --env."""
        return request.config.getoption("--env")
    
  3. Глобальные плагины и настройки можно подключать и регистрировать здесь.

Практический пример иерархии

Представьте структуру проекта:

project/
├── conftest.py            # Фикстуры для ВСЕХ тестов (напр., сессия БД)
├── api/
│   ├── conftest.py        # Фикстуры только для API-тестов (напр., авторизованный клиент)
│   └── test_users.py
└── ui/
    ├── conftest.py        # Фикстуры только для UI-тестов (напр., браузер)
    └── test_login.py
  • Тест в test_users.py увидит фикстуры из project/conftest.py и из project/api/conftest.py.
  • Тест в test_login.py увидит фикстуры из project/conftest.py и из project/ui/conftest.py.
  • Тесты из api/ не будут иметь доступа к фикстурам из ui/conftest.py, и наоборот. Это обеспечивает чёткое разделение контекстов.

Важные принципы и выводы

  • Именование: Файл обязательно должен называться именно conftest.py.
  • Импорты не нужны: pytest делает ресурсы из conftest.py доступными автоматически, их не нужно импортировать в тестовые файлы.
  • Модуль для кода, а не для тестов: Сам conftest.py не должен содержать тестовых функций (test_*). Это служебный модуль для поддержки тестов.
  • Ключевой инструмент для масштабирования: При увеличении количества тестов и их сложности грамотное использование conftest.py становится критически важным для поддержания чистоты, модульности и ремонтопригодности тестового набора.

Таким образом, conftest.py — это механизм внедрения зависимостей и конфигурации в pytest, который превращает фреймворк из простого раннера тестов в мощную и гибкую платформу для построения сложных, хорошо организованных тестовых инфраструктур.