scope
В Pytest scope используется для определения времени жизни фикстур, то есть того, сколько раз они будут созданы и использованы в течение выполнения тестов. Pytest поддерживает четыре разных уровня scope:
function: Это наименьший уровень scope. Фикстура будет создаваться заново для каждой тестовой функции. Это означает, что каждая функция получит свой собственный экземпляр фикстуры.
class: Фикстура будет создана один раз для каждого класса тестов. Все тестовые методы внутри класса будут использовать один и тот же экземпляр фикстуры.
module: Фикстура будет создана один раз для всего модуля тестов. Все тесты внутри модуля будут использовать один и тот же экземпляр фикстуры.
session: Это самый высокий уровень scope. Фикстура будет создана один раз для всего сеанса выполнения тестов. Все тесты во всех модулях будут использовать один и тот же экземпляр фикстуры.
Для определения scope фикстуры в Pytest используется аргумент scope
в декораторе @pytest.fixture
. Например:
import pytest
@pytest.fixture(scope="module")
def database():
# Этот код будет выполнен один раз для всего модуля
db = setup_database()
yield db
# Этот код будет выполнен после завершения всех тестов в модуле
teardown_database(db)
def test_something(database):
# Здесь можно использовать фикстуру database
pass
использования каждого уровня scope в Pytest:
function:
import pytest
@pytest.fixture(scope="function")
def setup():
print("\nSetup for function")
yield
print("\nTeardown for function")
def test_function_1(setup):
print("Test 1")
def test_function_2(setup):
print("Test 2")
В этом примере фикстура setup
будет создаваться заново для каждой функции test_function_1
и test_function_2
, что позволяет им иметь независимые состояния.
class:
import pytest
@pytest.fixture(scope="class")
def setup():
print("\nSetup for class")
yield
print("\nTeardown for class")
class TestClass:
def test_class_1(self, setup):
print("Test 1")
def test_class_2(self, setup):
print("Test 2")
Здесь фикстура setup
будет создаваться один раз для класса TestClass
, и все тесты внутри этого класса будут использовать один и тот же экземпляр фикстуры.
module:
import pytest
@pytest.fixture(scope="module")
def setup():
print("\nSetup for module")
yield
print("\nTeardown for module")
def test_module_1(setup):
print("Test 1")
def test_module_2(setup):
print("Test 2")
В этом примере фикстура setup
будет создаваться один раз для всего модуля, и все тесты внутри этого модуля будут использовать один и тот же экземпляр фикстуры.
session:
import pytest
@pytest.fixture(scope="session")
def setup():
print("\nSetup for session")
yield
print("\nTeardown for session")
def test_session_1(setup):
print("Test 1")
def test_session_2(setup):
print("Test 2")
В этом примере фикстура setup
будет создаваться один раз для всего сеанса выполнения тестов, и все тесты во всех модулях будут использовать один и тот же экземпляр фикстуры.
Общий пример
давайте создадим простой тестовый пример, где мы будем менять уровень scope фикстуры и видеть разницу между запусками.
import pytest
@pytest.fixture(scope="function")
def function_fixture():
print("\nFunction fixture setup")
yield
print("Function fixture teardown")
@pytest.fixture(scope="class")
def class_fixture():
print("\nClass fixture setup")
yield
print("Class fixture teardown")
@pytest.fixture(scope="module")
def module_fixture():
print("\nModule fixture setup")
yield
print("Module fixture teardown")
@pytest.fixture(scope="session")
def session_fixture():
print("\nSession fixture setup")
yield
print("Session fixture teardown")
def test_fixture_scopes_1(function_fixture):
print("Test 1")
def test_fixture_scopes_2(function_fixture):
print("Test 2")
@pytest.mark.usefixtures("class_fixture")
class TestClass:
def test_fixture_scopes_3(self):
print("Test 3")
def test_fixture_scopes_4(self):
print("Test 4")
def test_fixture_scopes_5(module_fixture):
print("Test 5")
def test_fixture_scopes_6(session_fixture):
print("Test 6")
В этом примере каждая фикстура создает свое сообщение при установке и демонтаже. После этого мы определили несколько тестов, использующих эти фикстуры. Затем мы различаем, когда каждая фикстура будет установлена и демонтирована, в зависимости от ее scope.
Вы можете запустить этот тестовый файл и увидеть, как разные фикстуры устанавливаются и демонтируются в разное время в зависимости от их scope.
pytest -v --setup-show test.py
Last updated