Как переопределить fixture в PyTest (в тесте/в conftest/на уровне пакета)?
1️⃣ Как кратко ответить
Переопределить fixture в PyTest можно на уровне теста, модуля или пакета. Для этого создайте fixture с тем же именем, что и у оригинальной, в нужной области видимости. PyTest будет использовать ближайшую по области видимости fixture.
2️⃣ Подробное объяснение темы
В PyTest, fixture — это функция, которая предоставляет тестам фиксированные данные или состояния. Иногда возникает необходимость переопределить существующую fixture, чтобы изменить её поведение для конкретного теста, модуля или пакета. Переопределение fixture позволяет гибко управлять тестовыми данными и состояниями.
Переопределение на уровне теста
Чтобы переопределить fixture на уровне конкретного теста, определите новую fixture с тем же именем внутри тестового модуля. PyTest будет использовать эту локальную версию вместо глобальной.
import pytest
# Глобальная fixture
@pytest.fixture
def sample_data():
return {"key": "global_value"}
def test_example(sample_data):
assert sample_data["key"] == "global_value"
# Переопределение на уровне теста
def test_local_override():
@pytest.fixture
def sample_data():
return {"key": "local_value"}
assert sample_data()["key"] == "local_value"
Переопределение в conftest.py
Для переопределения fixture на уровне модуля или пакета, используйте файл conftest.py. Это позволяет переопределить fixture для всех тестов в текущем и вложенных модулях.
# conftest.py
import pytest
# Переопределение fixture
@pytest.fixture
def sample_data():
return {"key": "conftest_value"}
Переопределение на уровне пакета
Чтобы переопределить fixture на уровне пакета, создайте файл conftest.py в корневой директории пакета. Все тесты в этом пакете и его подмодулях будут использовать переопределённую fixture.
# package/conftest.py
import pytest
# Переопределение fixture
@pytest.fixture
def sample_data():
return {"key": "package_value"}
Зачем это нужно
Переопределение fixture полезно, когда необходимо изменить поведение тестов в зависимости от контекста. Например, для тестирования различных конфигураций приложения или для изоляции тестов друг от друга. Это позволяет избежать дублирования кода и поддерживать тесты в актуальном состоянии.
Как это работает
PyTest использует механизм поиска fixture, начиная с самой локальной области видимости (тест), затем переходит к модулю (через conftest.py), и, наконец, к пакету. Это позволяет гибко управлять тем, какие данные или состояния будут использоваться в тестах, и легко адаптировать их под различные сценарии.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться