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

Что такое Scope в PyTest

1️⃣ Как кратко ответить

Scope в PyTest определяет уровень, на котором фикстура будет создана и уничтожена. Существуют четыре уровня: function, class, module и session. Это позволяет управлять временем жизни фикстур и оптимизировать выполнение тестов.

2️⃣ Подробное объяснение темы

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

Уровни Scope

  1. Function:

    • Это значение по умолчанию. Фикстура создается перед каждым тестом и уничтожается после его завершения.
    • Применяется, когда каждый тест требует уникальной настройки или изоляции.
  2. Class:

    • Фикстура создается один раз для каждого класса тестов и уничтожается после завершения всех тестов в этом классе.
    • Полезно, когда все тесты в классе могут использовать одну и ту же настройку.
  3. Module:

    • Фикстура создается один раз для каждого модуля и уничтожается после завершения всех тестов в этом модуле.
    • Используется, когда все тесты в модуле могут использовать одну и ту же настройку.
  4. Session:

    • Фикстура создается один раз за всю сессию тестирования и уничтожается после завершения всех тестов.
    • Подходит для глобальных настроек, которые не изменяются в течение всей сессии тестирования.

Пример использования Scope

Рассмотрим пример, где мы используем фикстуру с разными уровнями scope:

import pytest
​
# Фикстура с уровнем scope 'function'
@pytest.fixture(scope='function')
def setup_function():
    print("\nSetup for a test function")
    return "function scope"
​
# Фикстура с уровнем scope 'class'
@pytest.fixture(scope='class')
def setup_class():
    print("\nSetup for a test class")
    return "class scope"
​
# Фикстура с уровнем scope 'module'
@pytest.fixture(scope='module')
def setup_module():
    print("\nSetup for a test module")
    return "module scope"
​
# Фикстура с уровнем scope 'session'
@pytest.fixture(scope='session')
def setup_session():
    print("\nSetup for a test session")
    return "session scope"
​
# Тестовый класс, использующий фикстуры
class TestExample:
    def test_one(self, setup_function, setup_class, setup_module, setup_session):
        print("Running test_one")
        assert setup_function == "function scope"
        assert setup_class == "class scope"
        assert setup_module == "module scope"
        assert setup_session == "session scope"
​
    def test_two(self, setup_function, setup_class, setup_module, setup_session):
        print("Running test_two")
        assert setup_function == "function scope"
        assert setup_class == "class scope"
        assert setup_module == "module scope"
        assert setup_session == "session scope"

Объяснение примера

  • setup_function: Эта фикстура будет вызвана перед каждым тестом (test_one и test_two), и после каждого теста будет уничтожена.
  • setup_class: Эта фикстура будет вызвана один раз перед первым тестом в классе TestExample и уничтожена после выполнения всех тестов в этом классе.
  • setup_module: Эта фикстура будет вызвана один раз перед первым тестом в модуле и уничтожена после выполнения всех тестов в модуле.
  • setup_session: Эта фикстура будет вызвана один раз за всю сессию тестирования и уничтожена после завершения всех тестов.

Использование scope позволяет оптимизировать выполнение тестов, избегая избыточной инициализации и освобождения ресурсов.

Тема: PyTest
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки