Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Python: pytest, fixture, scope, testing, python

Какие бывают scope у fixture и зачем они нужны?

Вопрос проверяет понимание областей видимости фикстур в PyTest, которые определяют, как часто создаются и переиспользуются тестовые данные.

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

Фикстуры в PyTest имеют параметр scope, который определяет, как часто они будут выполняться. Доступные значения: function (по умолчанию, для каждой тестовой функции), class (для каждого тестового класса), module (для каждого модуля), package (для каждого пакета), session (один раз за всю сессию тестов). Выбор scope позволяет оптимизировать время выполнения тестов, избегая лишних повторных вычислений или подключений к ресурсам, таким как базы данных.

Длинный ответ

Фикстуры (fixtures) в PyTest — это мощный механизм для подготовки и очистки тестового окружения. Параметр scope управляет жизненным циклом фикстуры, определяя, как часто она будет инициализирована и завершена в процессе выполнения тестового набора. Это ключевой инструмент для управления производительностью и изоляцией тестов.

Доступные области видимости (scope)

  • function (по умолчанию): Фикстура создаётся заново для каждой тестовой функции. Это обеспечивает максимальную изоляцию тестов, но может быть затратно, если фикстура выполняет тяжёлые операции (например, создание базы данных).
  • class: Фикстура создаётся один раз для каждого тестового класса. Все методы класса используют один экземпляр фикстуры.
  • module: Фикстура создаётся один раз для модуля (файла). Все тестовые функции и классы в этом модуле используют общий экземпляр.
  • package: Фикстура создаётся один раз для пакета (директории с модулями).
  • session: Фикстура создаётся один раз за всю сессию выполнения тестов (например, за один запуск pytest). Это идеально для дорогостоящих ресурсов, таких как подключение к базе данных или запуск внешнего сервиса.

Практическое применение и примеры

Выбор scope напрямую влияет на скорость тестов и состояние тестовых данных. Например, фикстура для подключения к базе данных часто имеет scope='session', чтобы избежать многократного установления соединения. Фикстура, которая сбрасывает состояние изолированной тестовой базы, может иметь scope='function', чтобы каждый тест начинался с чистого листа.

import pytest

# Фикстура с областью видимости "session"
@pytest.fixture(scope="session")
def database_connection():
    # Имитация дорогого подключения к БД
    conn = {"status": "connected"}
    print("\nУстановлено соединение с БД (сессия)")
    yield conn  # Возвращаем объект соединения тестам
    # Очистка после всех тестов
    conn["status"] = "closed"
    print("Соединение с БД закрыто (конец сессии)")

# Фикстура с областью видимости "function" (по умолчанию)
@pytest.fixture
def clean_data():
    # Подготовка чистых данных для каждого теста
    data = []
    print("\nДанные очищены (для функции)")
    return data

def test_insert_item(database_connection, clean_data):
    clean_data.append("item1")
    assert len(clean_data) == 1
    assert database_connection["status"] == "connected"

def test_data_isolation(database_connection, clean_data):
    # Этот тест получит свой собственный пустой список clean_data
    assert len(clean_data) == 0
    # Но то же самое соединение database_connection
    assert database_connection["status"] == "connected"

В этом примере сообщения в консоли покажут, что соединение с БД создалось один раз, а данные очищались перед каждым тестом.

Вывод

Правильный выбор scope для фикстур — это баланс между изоляцией тестов (во избежание побочных эффектов) и производительностью. Используйте session или module для дорогостоящих, неизменяемых ресурсов и function для данных, которые должны быть уникальными и изолированными для каждого теста.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Python

    Python

  • PyTest

Ключевые слова

#pytest

#fixture

#scope

#testing

#python

Подпишись на Python Developer в телеграм