Pytest
  • Введение
  • Пример тестирования
  • fixture (Фикстуры)
    • Параметризация
    • декораторы в питоне
    • Пример использования
  • 📚Практика
    • API OpenWeatherMap
    • API OMDBapi
  • scope
  • Запуск тестов через терминал
    • пример иерархии каталогов для организации тестов и их запуска с помощью Pytest
  • argparse
    • Создание интерфейса командной строки
Powered by GitBook
On this page
  • использования каждого уровня scope в Pytest:
  • Общий пример

scope

В Pytest scope используется для определения времени жизни фикстур, то есть того, сколько раз они будут созданы и использованы в течение выполнения тестов. Pytest поддерживает четыре разных уровня scope:

  1. function: Это наименьший уровень scope. Фикстура будет создаваться заново для каждой тестовой функции. Это означает, что каждая функция получит свой собственный экземпляр фикстуры.

  2. class: Фикстура будет создана один раз для каждого класса тестов. Все тестовые методы внутри класса будут использовать один и тот же экземпляр фикстуры.

  3. module: Фикстура будет создана один раз для всего модуля тестов. Все тесты внутри модуля будут использовать один и тот же экземпляр фикстуры.

  4. 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:

  1. 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, что позволяет им иметь независимые состояния.

  1. 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, и все тесты внутри этого класса будут использовать один и тот же экземпляр фикстуры.

  1. 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 будет создаваться один раз для всего модуля, и все тесты внутри этого модуля будут использовать один и тот же экземпляр фикстуры.

  1. 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
PreviousAPI OMDBapiNextЗапуск тестов через терминал

Last updated 1 year ago