Ответ
В контексте тестирования, например, в 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.