← Назад к вопросам

Какое значение у фикстуры по дефолту?

1.6 Junior🔥 141 комментариев
#Фреймворки тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Значение по умолчанию для фикстуры в Pytest

Значение по умолчанию у фикстуры в Pytest — это function (уровень области видимости function). Это означает, что если вы не укажете параметр scope при объявлении фикстуры, она будет выполняться заново для каждого тестового метода (функции).

Уровни области вилимости (scope) фикстур

Pytest предоставляет несколько вариантов области видимости фикстур, которые контролируют, как часто фикстура инициализируется и завершается:

  • function (по умолчанию) — фикстура запускается для каждой тестовой функции.
  • class — фикстура запускается один раз для тестового класса.
  • module — фикстура запускается один раз для модуля (файла с тестами).
  • package — фикстура запускается один раз для пакета (директории с тестами).
  • session — фикстура запускается один раз за всю сессию выполнения тестов.

Практический пример с кодом

Рассмотрим разницу между фикстурой по умолчанию (scope='function') и фикстурой с областью видимости scope='module'.

import pytest

# Фикстура по умолчанию (scope='function')
@pytest.fixture
def function_fixture():
    print("\nИнициализация function_fixture")
    return "function_data"

# Фикстура с областью видимости модуля
@pytest.fixture(scope='module')
def module_fixture():
    print("\nИнициализация module_fixture")
    return "module_data"

def test_example_1(function_fixture, module_fixture):
    print(f"test_example_1: {function_fixture}, {module_fixture}")
    assert function_fixture == "function_data"

def test_example_2(function_fixture, module_fixture):
    print(f"test_example_2: {function_fixture}, {module_fixture}")
    assert module_fixture == "module_data"

При запуске этих тестов вывод будет следующим:

Инициализация module_fixture
Инициализация function_fixture
test_example_1: function_data, module_data
.
Инициализация function_fixture
test_example_2: function_data, module_data
.

Ключевые наблюдения:

  1. function_fixture инициализируется заново для каждого теста (test_example_1 и test_example_2).
  2. module_fixture инициализируется только один раз в начале модуля и переиспользуется между тестами.
  3. Если бы мы не указали scope='module' для второй фикстуры, она также вела бы себя как function_fixture.

Почему function выбрана по умолчанию?

  • Изоляция тестов — каждый тест получает свежее состояние, что минимизирует побочные эффекты.
  • Предсказуемость — упрощает отладку, так как не нужно учитывать состояние, оставшееся от предыдущих тестов.
  • Безопасность — снижает риск ложных срабатываний/пропусков из-за совместного использования данных.

Когда изменять область видимости?

Используйте более широкие области видимости когда:

  • Инициализация ресурса требует много времени (например, подключение к БД).
  • Ресурс является неизменяемым или read-only.
  • Тесты не модифицируют состояние ресурса.
# Пример эффективного использования scope='session'
@pytest.fixture(scope='session')
def database_connection():
    # Дорогая операция инициализации
    conn = create_database_connection()
    yield conn
    conn.close()

# Все тесты в сессии используют одно подключение
def test_user_query(database_connection):
    result = database_connection.execute("SELECT * FROM users")
    assert len(result) > 0

def test_product_query(database_connection):
    result = database_connection.execute("SELECT * FROM products")
    assert len(result) > 0

Важные нюансы:

  1. Фикстуры с более широкой областью видимости (session, module) инициализируются раньше, чем фикстуры с узкой областью (function).
  2. Фикстуры могут зависеть только от фикстур с такой же или более широкой областью видимости.
  3. Значение по умолчанию scope='function' обеспечивает баланс между изоляцией тестов и производительностью.

Таким образом, понимание области видимости фикстур критически важно для создания эффективных, изолированных и поддерживаемых тестовых наборов в Pytest.

Какое значение у фикстуры по дефолту? | PrepBro