Привет. Коллеги, никак не могу вытащить объект возвращаемый параметризуемой фикстурой в хуке pytest_runtest_call(item): .
Для обычной фикстуры это работает отлично:
Если тест параметризованный, то можно сделать так item.funcargs.get("my_fixture_param")(), но тогда мы не можем контролировать какие аргументы передавать. Так как их может быть разное количество у теста и часть из них могут быть фикстурами.
Можете вкратце рассказать зачем такая потребность появилась? Я за 6 проектов на PyTest ни разу не хотел так заморочиться Может мы подберем более простое решение.
Максим, у меня есть потребность вытягивать часть данных для отчета Allure из объекта ORM. Этот объект возвращает фикстура. Вот у меня необходимость в pytest_runtest_call сохранить в поле объекта значение ORM, а затем в pytest_exception_interact приложить данные из ORM к отчету.
Такая организация фреймворка. У нас есть предусловия - это часть фикстуры, мы их пишем отдельно и подгружаем в фикстуре. Иного способа у нас не было как параметризовать фикстуру. Но теперь столкнулись с проблемой как вытащить объект ORM из параметризованной фикстуры, чтобы приложить данные к отчету.
Я бы посоветовал сначала посмотреть в сторону yield fixtures, чем пытаться перекидывать данные между хуками. Как раз там решите и сетап с прекондишенами, и попытаетесь выгрузить артефакты в аллюр.
Нашлось решение, правда костыльное. Сделали глобальный словарь и в фикстуре складывали в словарь ключ - nodeid, значение - возвращаемый фикстурой объект. А потом в хуке получали из глобального словаря значение по ключу item.node.nodeid.
если я вас правильно понял, то вы просто сделали key-value словарь, доступный отовсюду; я это костылём не стал бы называть, ибо например в specflow последнем из коробки идёт такой словарь, в него вообще всё складывается, и ничего плохого в этом нет
Ну просто глобальные переменные это не очень хорошо )
Костыль, наверное больше с точки зрения устройства фреймворка. Создавая новые фикстуры с аргументами надо не забывать складывать их значения в словарь в самой фикстуре.
В целом, конечно , вариант имеет место быть )