Получить доступ

Как работают фикстуры pytest и что такое их scope?

MiddleТестированиеpytest
Ещё спрашивают так:
  • Чем фикстуры pytest лучше setUp и tearDown?
  • Что такое conftest.py?
Коротко

Фикстура — функция с @pytest.fixture, результат которой pytest передаёт в тест по имени параметра. Код после yield — очистка. scope (function, class, module, package, session) задаёт, как часто фикстура создаётся заново. Общие фикстуры живут в conftest.py и подхватываются без импорта.

  • Фикстуры зависят друг от друга через параметры — граф собирается сам
  • autouse=True — применяется ко всем тестам области
  • parametrize — один тест на наборе входных данных

А ещё Дорогое (контейнер БД) — scope="session", дешёвое и изменяемое — function

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Почему лучше setUp/tearDown. Тест явно объявляет, что ему нужно; фикстуры переиспользуются между файлами без наследования; очистка рядом с созданием; области жизни настраиваются.

Scope и изоляция. Фикстура с широкой областью создаётся один раз и разделяется тестами — быстро, но изменения состояния протекают между тестами. Типичная схема: движок БД или контейнер (Testcontainers) на сессию, транзакция с откатом — на каждый тест.

Полезное: tmp_path (временная папка), monkeypatch (подмена переменных окружения и атрибутов), capsys (вывод), request.param для параметризованных фикстур, фабрики-фикстуры, возвращающие функцию создания объектов.

Пример

import pytest

@pytest.fixture(scope="session")
def db_engine():
    engine = create_engine(TEST_URL)
    yield engine
    engine.dispose()

@pytest.fixture
def session(db_engine):
    conn = db_engine.connect(); tx = conn.begin()
    yield Session(bind=conn)
    tx.rollback(); conn.close()        # каждый тест в своей откатываемой транзакции

@pytest.mark.parametrize("raw, expected", [("1", 1), (" 2 ", 2)])
def test_parse(raw, expected):
    assert parse(raw) == expected

Что хотят услышать

  • Внедрение по имени и yield для очистки.
  • Области жизни и компромисс скорости и изоляции.
  • conftest.py и parametrize.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем