Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое conhtest.py в pytest?
conftest.py в pytest — это специальный файл, предназначенный для хранения и автоматического распространения общих ресурсов, настроек и плагинов для тестов в рамках указанной директории и всех её поддиректорий. Это один из краеугольных камней организации проектов на pytest, так как он позволяет избежать дублирования кода и обеспечивает централизованное управление зависимостями.
Основное назначение conftest.py
- Автоматическое обнаружение: pytest автоматически обнаруживает и загружает все файлы
conftest.pyв текущей директории и во всех родительских директориях по отношению к месту запуска тестов. Это позволяет создавать иерархию настроек. - Область видимости (Scope): Ресурсы, объявленные в
conftest.py, доступны для всех тестовых модулей (test_*.pyили*_test.py), находящихся в той же директории, что и этот файл, или в любых её поддиректориях. - Изоляция и переопределение: Файлы
conftest.pyв поддиректориях могут переопределять ресурсы из родительских файлов, обеспечивая гибкость и локализацию поведения для отдельных групп тестов.
Что обычно размещают в conftest.py?
В этом файле определяется логика, общая для многих тестов.
- Фикстуры (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()
Теперь любые тесты в проекте могут использовать эти фикстуры, просто объявив их в параметрах тестовой функции.
-
Хуки (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) -
Пользовательские параметры командной строки — можно добавить свои опции для запуска.
# 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") -
Глобальные плагины и настройки можно подключать и регистрировать здесь.
Практический пример иерархии
Представьте структуру проекта:
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, который превращает фреймворк из простого раннера тестов в мощную и гибкую платформу для построения сложных, хорошо организованных тестовых инфраструктур.