Вопрос проверяет понимание областей видимости фикстур в PyTest, которые определяют, как часто создаются и переиспользуются тестовые данные.
Фикстуры (fixtures) в PyTest — это мощный механизм для подготовки и очистки тестового окружения. Параметр scope управляет жизненным циклом фикстуры, определяя, как часто она будет инициализирована и завершена в процессе выполнения тестового набора. Это ключевой инструмент для управления производительностью и изоляцией тестов.
pytest). Это идеально для дорогостоящих ресурсов, таких как подключение к базе данных или запуск внешнего сервиса.Выбор scope напрямую влияет на скорость тестов и состояние тестовых данных. Например, фикстура для подключения к базе данных часто имеет scope='session', чтобы избежать многократного установления соединения. Фикстура, которая сбрасывает состояние изолированной тестовой базы, может иметь scope='function', чтобы каждый тест начинался с чистого листа.
import pytest
# Фикстура с областью видимости "session"
@pytest.fixture(scope="session")
def database_connection():
# Имитация дорогого подключения к БД
conn = {"status": "connected"}
print("\nУстановлено соединение с БД (сессия)")
yield conn # Возвращаем объект соединения тестам
# Очистка после всех тестов
conn["status"] = "closed"
print("Соединение с БД закрыто (конец сессии)")
# Фикстура с областью видимости "function" (по умолчанию)
@pytest.fixture
def clean_data():
# Подготовка чистых данных для каждого теста
data = []
print("\nДанные очищены (для функции)")
return data
def test_insert_item(database_connection, clean_data):
clean_data.append("item1")
assert len(clean_data) == 1
assert database_connection["status"] == "connected"
def test_data_isolation(database_connection, clean_data):
# Этот тест получит свой собственный пустой список clean_data
assert len(clean_data) == 0
# Но то же самое соединение database_connection
assert database_connection["status"] == "connected"В этом примере сообщения в консоли покажут, что соединение с БД создалось один раз, а данные очищались перед каждым тестом.
Правильный выбор scope для фикстур — это баланс между изоляцией тестов (во избежание побочных эффектов) и производительностью. Используйте session или module для дорогостоящих, неизменяемых ресурсов и function для данных, которые должны быть уникальными и изолированными для каждого теста.