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

Привет. Коллеги, никак не могу вытащить объект возвращаемый параметризуемой фикстурой в хуке pytest_runtest_call(item): .
Для обычной фикстуры это работает отлично:

tef test_bla_bla (my_fixture):
obj = my_fixture
...
def pytest_runtest_call(item):
    item.funcargs.get("my_fixture") # <object at 0x10ecff710>

А вот для параметризованной фикстуры тут не результат выполнения а функция.

tef test_bla_bla (my_fixture_param):
obj = my_fixture_param(1)
...
def pytest_runtest_call(item):
    item.funcargs.get("my_fixture_param") # <function my_fixture_param.<locals>._my_fixture_param at 0x115fa9cb0>

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

Если тест параметризованный, то можно сделать так item.funcargs.get("my_fixture_param")(), но тогда мы не можем контролировать какие аргументы передавать. Так как их может быть разное количество у теста и часть из них могут быть фикстурами.

Можете вкратце рассказать зачем такая потребность появилась? Я за 6 проектов на PyTest ни разу не хотел так заморочиться :grin: Может мы подберем более простое решение.

Максим, у меня есть потребность вытягивать часть данных для отчета Allure из объекта ORM. Этот объект возвращает фикстура. Вот у меня необходимость в pytest_runtest_call сохранить в поле объекта значение ORM, а затем в pytest_exception_interact приложить данные из ORM к отчету.

Такая организация фреймворка. У нас есть предусловия - это часть фикстуры, мы их пишем отдельно и подгружаем в фикстуре. Иного способа у нас не было как параметризовать фикстуру. Но теперь столкнулись с проблемой как вытащить объект ORM из параметризованной фикстуры, чтобы приложить данные к отчету.

Я бы посоветовал сначала посмотреть в сторону yield fixtures, чем пытаться перекидывать данные между хуками. Как раз там решите и сетап с прекондишенами, и попытаетесь выгрузить артефакты в аллюр.

1 лайк

Мне бы все-таки найти решение, по проблеме, которую я описал. Иначе получается слишком много изменений.

Нашлось решение, правда костыльное. Сделали глобальный словарь и в фикстуре складывали в словарь ключ - nodeid, значение - возвращаемый фикстурой объект. А потом в хуке получали из глобального словаря значение по ключу item.node.nodeid.

если я вас правильно понял, то вы просто сделали key-value словарь, доступный отовсюду; я это костылём не стал бы называть, ибо например в specflow последнем из коробки идёт такой словарь, в него вообще всё складывается, и ничего плохого в этом нет

Ну просто глобальные переменные это не очень хорошо )
Костыль, наверное больше с точки зрения устройства фреймворка. Создавая новые фикстуры с аргументами надо не забывать складывать их значения в словарь в самой фикстуре.
В целом, конечно , вариант имеет место быть )