> Для чего нужны фикстуры в pytest (Python)
Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: PositiveTechnologies, Сбер
Стек: Python
> Пример ответа
Короткий ответ
Фикстуры в pytest - это механизм для подготовки и очистки состояния тестового окружения. Они позволяют вынести повторяющуюся логику (создание объектов, подключение к БД, моки) в переиспользуемые функции с автоматическим управлением жизненным циклом через scope. Главная ценность - декларативность: тест просто объявляет зависимости через параметры, а pytest сам решает, когда создать фикстуру, кешировать её или разрушить.
Подробное объяснение
Фикстуры решают три задачи:
- Устранение дублирования - вместо копипасты setup/teardown кода в каждом тесте вы описываете его один раз.
- Управление областью видимости - через параметр
scope(function,class,module,package,session) контролируете, как часто создаётся ресурс: для каждого теста, для всего модуля или один раз на весь прогон. - Композиция зависимостей - фикстуры могут зависеть от других фикстур, образуя граф. pytest автоматически разрешает порядок создания и разрушения (в обратном порядке).
Ключевая особенность - использование yield вместо return для teardown-логики. Всё, что после yield, выполняется после завершения теста, даже если тест упал.
Фикстуры также поддерживают параметризацию через params и request.param, что позволяет генерировать наборы данных без дублирования тестов.
На практике
Для senior-позиции важно показать не просто знание синтаксиса, а понимание trade-off'ов:
- scope="session" экономит время, но создаёт риск утечки состояния между тестами - нужно явно сбрасывать данные.
- Автоиспользование (
autouse=True) удобно для глобальных моков, но делает тесты менее явными. - Переопределение фикстур через
conftest.pyв разных уровнях директорий - мощный механизм, но требует дисциплины, иначе легко запутаться, какая версия фикстуры активна. - Для интеграционных тестов часто комбинируют фикстуры с фабриками (когда фикстура возвращает функцию, а не объект) - это даёт гибкость в создании множества экземпляров с разными параметрами.
Пример кода
PYTHONimport pytestfrom myapp.db import Database@pytest.fixturedef db_connection():conn = Database.connect("test_db")yield connconn.close()@pytest.fixture(scope="session")def test_data():"""Тяжёлые данные, создаются один раз на сессию."""data = load_big_dataset()yield datacleanup(data)@pytest.fixturedef user_factory(db_connection):"""Фабрика для создания пользователей с разными ролями."""def _create_user(role="user", **kwargs):user = User(role=role, **kwargs)db_connection.save(user)return userreturn _create_userdef test_user_creation(user_factory, db_connection):user = user_factory(role="admin")assert db_connection.get(user.id).role == "admin"@pytest.fixture(params=["admin", "moderator", "user"])def role(request):return request.paramdef test_access_control(role, user_factory):user = user_factory(role=role)# проверка прав доступа для каждой роли
Как отвечать на собеседовании
Начните с определения, затем перечислите основные возможности (scope, yield, conftest, параметризация). Обязательно упомяните композицию фикстур и порядок разрушения. Приведите пример из реального опыта: как вы использовали фикстуры для работы с БД, внешними API или временными файлами. Покажите понимание проблем: утечка состояния, сложность отладки при глубокой вложенности, неявные зависимости через autouse. Если спросят про альтернативы (setup/teardown в unittest), объясните, почему фикстуры удобнее: декларативность, композиция, отсутствие необходимости наследования.
Что проверяет интервьюер
- Понимание жизненного цикла фикстур и scope.
- Умение проектировать граф зависимостей без циклов.
- Знание тонкостей:
yieldдля teardown,request.param,autouse, переопределение в conftest. - Способность объяснить, когда фикстура - правильное решение, а когда лучше просто функция-хелпер.
- Практический опыт: как вы отлаживаете фикстуры, как избегаете глобального состояния.
Типичные ошибки
- Использование
returnвместоyield- teardown не выполняется. - Злоупотребление
scope="session"без сброса состояния - тесты начинают зависеть друг от друга. - Создание фикстур, которые не используются напрямую, а только через другие фикстуры - это нормально, но нужно понимать, что это усложняет чтение.
- Игнорирование
conftest.py- фикстуры объявляются в тестовых файлах, что мешает переиспользованию. - Попытка мокать внутри фикстуры без явного указания
autouse- теряется явность. - Непонимание порядка разрушения фикстур: они разрушаются в обратном порядке создания, что критично при вложенных зависимостях.
> Похожие задачи по Python
В каком порядке строить составной индекс для user_id и даты
Что такое контейнеризация и зачем она нужна
Что произойдет при вызове асинхронной функции без await?
Что такое Depends в FastAPI и для чего он нужен
> Похожие задачи по backend
В каком порядке строить составной индекс для user_id и даты
Что такое контейнеризация и зачем она нужна
Что произойдет при вызове асинхронной функции без await?
Что такое Depends в FastAPI и для чего он нужен
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью