Заменить одной универсальной фикстурой пачку однотипных фикстур

В моем conftest.py есть много однотипных фикстур, которые импортируют API-клиент из src/api/service ради имплементации небольшой логики (например, прокинуть seed, но может быть что угодно).

from src.api.service1 import service1_api
from src.api.service2 import service2_api
...

@pytest.fixture()
def service1_api(seed):
    service1_api.seed = seed
    return service1_api

@pytest.fixture()
def service2_api(seed):
    service2_api.seed = seed
    return service2_api

Это сильно раздувает весь файл и выглядит явно избыточным (pytest при инициализации подтягивает все-все модули из репозитория, даже если запустятся только тесты, которые эти модули не используют).

Можно ли написать/заменить одним универсальной фикстурой всю пачку однотипных фикстур?


Ответы (1 шт):

Автор решения: insolor

Как вариант - из фикстуры возвращать функцию, которая принимает сервис и что-то в нем патчит:

from src.api.service1 import service1_api


@pytest.fixture()
def set_seed(seed):
    def func(service):
        service.seed = seed
    return func


def test_something(set_seed):
    set_seed(service1_api)
    ...

В целом, тут вообще как будто именно фикстура не нужна, можно обойтись просто функцией (но это зависит от того, откуда берется seed).

→ Ссылка