Когда вызывается фикстура (fixture) в контексте тестирования?

«Когда вызывается фикстура (fixture) в контексте тестирования?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В контексте тестирования, например, в pytest, фикстура вызывается автоматически в момент, когда тест-функция (или другая фикстура) запрашивает её в качестве параметра. Ключевой момент — область видимости (scope), которая определяет, как часто фикстура будет создаваться и завершаться.

Основные scope и момент вызова:

  • scope='function' (по умолчанию): Фикстура вызывается перед выполнением каждого теста, который её запрашивает, и завершается (выполняет код после yield или return) после этого теста. Используется для изолированных данных или соединений.
  • `scope='class': Вызывается один раз перед первым тестом в классе и завершается после последнего теста в классе.
  • `scope='module': Вызывается один раз в начале модуля и завершается в конце модуля. Идеально для тяжёлых операций, например, подключения к БД.
  • `scope='session': Вызывается один раз за всю сессию запуска тестов (например, один запуск pytest). Используется для глобальных ресурсов.

Практический пример с scope='module' для тестирования веб-приложения:

import pytest
from selenium import webdriver

@pytest.fixture(scope="module")
def browser():
    # Эта часть выполняется ОДИН РАЗ для модуля
    print("n[SETUP] Запуск браузера Chrome")
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    yield driver  # Здесь управление передаётся тестам
    # Эта часть выполняется ОДИН РАЗ после всех тестов модуля
    print("n[TEARDOWN] Закрытие браузера")
    driver.quit()

# Оба теста используют один и тот же экземпляр браузера
def test_login(browser):
    browser.get("https://example.com/login")
    # ... действия для входа
    assert "Dashboard" in browser.title

def test_logout(browser):
    # Браузер уже открыт и авторизован из предыдущего теста
    browser.find_element("id", "logout").click()
    assert "Login" in browser.title

Таким образом, фикстура — это мощный инструмент для управления состоянием и ресурсами, а момент её вызова контролируется через scope.