Вопрос с собеседования · Python

Как работают фикстуры 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

Подробно

Почему лучше 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.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Фикстуру импортируют в каждый тестовый файл, а scope="session" пересоздаёт её заново для каждого теста
  • ✗Фикстуры не могут зависеть друг от друга
  • ✓Фикстура приходит в тест по имени параметра; после yield — очистка; scope задаёт частоту создания
  • ✗Код после yield в фикстуре никогда не выполняется

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования