Ответ
В фикстуру pytest можно передать любой объект, который является возвращаемым значением другой фикстуры. Кроме того, фикстура может автоматически получать специальные объекты pytest, если объявить их в своих параметрах.
Основные типы объектов, которые можно передать:
- Возвращаемые значения других фикстур. Это основной способ композиции зависимостей в тестовом фреймворке.
- Специальные объекты pytest, такие как
request(для доступа к контексту теста) иpytestconfig(для доступа к конфигурации). - Параметры из декоратора
@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 построена на внедрении зависимостей, где фикстуры запрашивают именно те объекты, которые им нужны для работы.