Какой объект можно передать в фикстуру в pytest?

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

Ответ

В фикстуру pytest можно передать любой объект, который является возвращаемым значением другой фикстуры. Кроме того, фикстура может автоматически получать специальные объекты pytest, если объявить их в своих параметрах.

Основные типы объектов, которые можно передать:

  1. Возвращаемые значения других фикстур. Это основной способ композиции зависимостей в тестовом фреймворке.
  2. Специальные объекты pytest, такие как request (для доступа к контексту теста) и pytestconfig (для доступа к конфигурации).
  3. Параметры из декоратора @pytest.mark.parametrize. Фикстура может быть параметризована вместе с тестовой функцией.

Пример:

import pytest

# Фикстура, возвращающая объект соединения с БД
@pytest.fixture
def database_connection():
    conn = create_connection()
    yield conn
    conn.close()

# Фикстура, принимающая другую фикстуру в качестве параметра
@pytest.fixture
def user_repository(database_connection):  # Принимает объект из database_connection
    return UserRepository(database_connection)

# Фикстура, использующая специальный объект `request`
@pytest.fixture
def test_data(request):
    # Получаем значение параметра, переданного в тест
    data_file = request.param
    return load_test_data(data_file)

# Тест использует фикстуру, которая, в свою очередь, использует другие фикстуры
def test_find_user(user_repository):
    user = user_repository.find_by_id(1)
    assert user is not None

Таким образом, система фикстур в pytest построена на внедрении зависимостей, где фикстуры запрашивают именно те объекты, которые им нужны для работы.