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

Что такое scope у фикстур в pytest (function, module, session)?

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

В pytest, scope у фикстур определяет, как долго фикстура будет существовать и когда она будет создаваться и уничтожаться. Существует четыре уровня scope: function, class, module и session. Function — фикстура создается для каждой тестовой функции. Class — для каждого класса тестов. Module — для каждого модуля. Session — для всей сессии тестирования.

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

Фикстура в pytest — это функция, которая выполняет настройку перед тестом и/или очистку после теста. Например, фикстура может создать временную базу данных, заполнить её тестовыми данными и удалить после завершения теста.

Что такое scope?

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

Виды scope

  1. Function Scope

    • Описание: Фикстура создается и уничтожается для каждой тестовой функции.
    • Когда использовать: Когда каждый тест должен иметь свою собственную изолированную среду.
    • Пример:
      import pytest
      ​
      @pytest.fixture(scope="function")
      def resource():
          print("Setup resource")
          yield
          print("Teardown resource")
      ​
      def test_example(resource):
          assert True
      
    • Как работает: В этом примере resource будет создаваться и уничтожаться для каждой тестовой функции, которая его использует.
  2. Class Scope

    • Описание: Фикстура создается и уничтожается для каждого класса тестов.
    • Когда использовать: Когда все тесты в классе могут использовать одну и ту же настройку.
    • Пример:
      import pytest
      ​
      @pytest.fixture(scope="class")
      def resource():
          print("Setup resource")
          yield
          print("Teardown resource")
      ​
      class TestExample:
          def test_one(self, resource):
              assert True
      ​
          def test_two(self, resource):
              assert True
      
    • Как работает: Здесь resource будет создаваться один раз для всех тестов внутри TestExample и уничтожаться после выполнения всех тестов в классе.
  3. Module Scope

    • Описание: Фикстура создается и уничтожается для каждого модуля.
    • Когда использовать: Когда все тесты в модуле могут использовать одну и ту же настройку.
    • Пример:
      import pytest
      ​
      @pytest.fixture(scope="module")
      def resource():
          print("Setup resource")
          yield
          print("Teardown resource")
      ​
      def test_one(resource):
          assert True
      ​
      def test_two(resource):
          assert True
      
    • Как работает: resource будет создаваться один раз для всех тестов в модуле и уничтожаться после выполнения всех тестов.
  4. Session Scope

    • Описание: Фикстура создается и уничтожается один раз за всю сессию тестирования.
    • Когда использовать: Когда настройка может быть использована всеми тестами в проекте.
    • Пример:
      import pytest
      ​
      @pytest.fixture(scope="session")
      def resource():
          print("Setup resource")
          yield
          print("Teardown resource")
      ​
      def test_one(resource):
          assert True
      ​
      def test_two(resource):
          assert True
      
    • Как работает: resource будет создаваться один раз перед началом всех тестов и уничтожаться после завершения всех тестов.

Зачем это нужно?

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

Тема: Тестирование
Стадия: Tech

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

Твои заметки