Что такое Scope в PyTest
1️⃣ Как кратко ответить
Scope в PyTest определяет уровень, на котором фикстура будет создана и уничтожена. Существуют четыре уровня: function, class, module и session. Это позволяет управлять временем жизни фикстур и оптимизировать выполнение тестов.
2️⃣ Подробное объяснение темы
В PyTest фикстуры используются для подготовки тестовой среды, например, для создания объектов, настройки базы данных или конфигурации окружения. Scope (область видимости) фикстуры определяет, как долго она будет существовать и когда будет уничтожена. Это позволяет эффективно управлять ресурсами и временем выполнения тестов.
Уровни Scope
-
Function:
- Это значение по умолчанию. Фикстура создается перед каждым тестом и уничтожается после его завершения.
- Применяется, когда каждый тест требует уникальной настройки или изоляции.
-
Class:
- Фикстура создается один раз для каждого класса тестов и уничтожается после завершения всех тестов в этом классе.
- Полезно, когда все тесты в классе могут использовать одну и ту же настройку.
-
Module:
- Фикстура создается один раз для каждого модуля и уничтожается после завершения всех тестов в этом модуле.
- Используется, когда все тесты в модуле могут использовать одну и ту же настройку.
-
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 позволяет оптимизировать выполнение тестов, избегая избыточной инициализации и освобождения ресурсов.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться