> Для чего нужны фикстуры в pytest (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: PositiveTechnologies, Сбер

Стек: Python

> Пример ответа

Короткий ответ

Фикстуры в pytest - это механизм для подготовки и очистки состояния тестового окружения. Они позволяют вынести повторяющуюся логику (создание объектов, подключение к БД, моки) в переиспользуемые функции с автоматическим управлением жизненным циклом через scope. Главная ценность - декларативность: тест просто объявляет зависимости через параметры, а pytest сам решает, когда создать фикстуру, кешировать её или разрушить.

Подробное объяснение

Фикстуры решают три задачи:

  1. Устранение дублирования - вместо копипасты setup/teardown кода в каждом тесте вы описываете его один раз.
  2. Управление областью видимости - через параметр scope (function, class, module, package, session) контролируете, как часто создаётся ресурс: для каждого теста, для всего модуля или один раз на весь прогон.
  3. Композиция зависимостей - фикстуры могут зависеть от других фикстур, образуя граф. pytest автоматически разрешает порядок создания и разрушения (в обратном порядке).

Ключевая особенность - использование yield вместо return для teardown-логики. Всё, что после yield, выполняется после завершения теста, даже если тест упал.

Фикстуры также поддерживают параметризацию через params и request.param, что позволяет генерировать наборы данных без дублирования тестов.

На практике

Для senior-позиции важно показать не просто знание синтаксиса, а понимание trade-off'ов:

  • scope="session" экономит время, но создаёт риск утечки состояния между тестами - нужно явно сбрасывать данные.
  • Автоиспользование (autouse=True) удобно для глобальных моков, но делает тесты менее явными.
  • Переопределение фикстур через conftest.py в разных уровнях директорий - мощный механизм, но требует дисциплины, иначе легко запутаться, какая версия фикстуры активна.
  • Для интеграционных тестов часто комбинируют фикстуры с фабриками (когда фикстура возвращает функцию, а не объект) - это даёт гибкость в создании множества экземпляров с разными параметрами.

Пример кода

PYTHON
import pytest
from myapp.db import Database
@pytest.fixture
def db_connection():
conn = Database.connect("test_db")
yield conn
conn.close()
@pytest.fixture(scope="session")
def test_data():
"""Тяжёлые данные, создаются один раз на сессию."""
data = load_big_dataset()
yield data
cleanup(data)
@pytest.fixture
def user_factory(db_connection):
"""Фабрика для создания пользователей с разными ролями."""
def _create_user(role="user", **kwargs):
user = User(role=role, **kwargs)
db_connection.save(user)
return user
return _create_user
def 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.param
def 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 - теряется явность.
  • Непонимание порядка разрушения фикстур: они разрушаются в обратном порядке создания, что критично при вложенных зависимостях.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью