Как работают фикстуры pytest и что такое их scope?
- Чем фикстуры 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 в фикстуре никогда не выполняется
Разбор темы
- Окружение, импорты и тесты на pytest
Виртуальные окружения и зависимости, как работает импорт и чем опасны циклические импорты, __name__ == "__main__", pytest, фикстуры и mock.patch.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.