Size: a a a

testing_in_python

2021 April 27

СС

Сказочный Сникерс... in testing_in_python
в крайнем случае положи фикстуру в класс, объяви ей нужный тебе скоуп и автоюз, если не хочешь каждый раз ее руками дергать. пропиши результат выполнения фикстуры в self и будет тебе счастье
источник

А

Александр in testing_in_python
спс завтра поробую переделать
источник
2021 April 28

ПБ

Павел Бобров... in testing_in_python
Доброго времени суток.
У меня есть такая фикстура для сохранения скришота при фейле теста

@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item):
   outcome = yield
   rep = outcome.get_result()
   setattr(item, "rep_" + rep.when, rep)
   return rep
@pytest.fixture(scope="function", autouse=True)
def failed_check(request):
   def tear_down():
       if request.node.rep_call.failed:
           driver = Application().driver
           take_screenshot(driver, request)
   request.addfinalizer(tear_down)
   yield

В тестах я вношу какие-то изменения на странице и затем  открываю вторую вкладку что бы выполнить в ней какие-то проверки. Для тестов выполняется следующая фикстура

@pytest.fixture(scope="function")
def function_teardown(app):
   yield
   browser.switch_tab(1)
   browser.close()
   browser.switch_tab(0)

Но при фейле теста во второй вкладке, скриншот делается в первой, хотя failed_check отрабатывает до function_teardown.
Может кто-нибудь подсказать почему так происходит?
источник

СС

Сказочный Сникерс... in testing_in_python
таки уверен что нужный порядок?
источник

ПБ

Павел Бобров... in testing_in_python
Да, первым отрабатывает check_failure, затем выводится assertionerror и в конце function_teardown
источник

СС

Сказочный Сникерс... in testing_in_python
ты делаешь request.addfinalizer(tear_down). ты уверен что tear_down исполняется в нужный момент?
источник

СС

Сказочный Сникерс... in testing_in_python
кстати, не знаю как в новых версиях, но раньше если тот тест, который фейлится - последний - у него как то в другом порядке отрабатывали фикстуры в плане их тирдауна
источник

СС

Сказочный Сникерс... in testing_in_python
я с этим сталкивался
источник

СС

Сказочный Сникерс... in testing_in_python
видишь у тебя фикстура failed_check с автоюзом, у нее есть тирдаун, который добавляется через request.addfinalizer. порядок тут не совсем очевиден
источник

ПБ

Павел Бобров... in testing_in_python
Хм, да, точно.
@pytest.fixture(scope="function", autouse=True)
def failed_check(request):
   def tear_down():
       if request.node.rep_call.failed:
           driver = Application().driver
           take_screenshot(driver, request)
   request.addfinalizer(tear_down)
   yield

failed_check вызывается до function_teardown
однако tear_down уже после
источник

СС

Сказочный Сникерс... in testing_in_python
попробуй для начала сделать не через request.addfinalizer. но полагаю это может не помочь
источник

СС

Сказочный Сникерс... in testing_in_python
если не поможет, то попробуй в function_teardown явно добавить failed_check после app. по идее это должно выставить правильные зависимости и порядки тирдаунов фикстур

вообще вот это наверное самая большая проблема автоюз фикстур - порядок ее сетапа и тирдауна не детерменирован
источник

СС

Сказочный Сникерс... in testing_in_python
поэтому я пошел по другому пути. я в самом базовом классе всех тестов реализовал метакласс, который нужные мне фикстуры подпихивает в каждый тест на ту позицию где мне нужно
источник

А

Алексей in testing_in_python
def pytest_runtest_call(item):
   item._obj = check_wrapper(item._obj)
источник

А

Алексей in testing_in_python
самые четкие фэйл технологии
источник

А

Алексей in testing_in_python
в чек враппер напихать все что надо :)
источник

СС

Сказочный Сникерс... in testing_in_python
наркоман) но с другой стороны почему бы и нет)
источник

А

Алексей in testing_in_python
просто это как то реально предсказуемее финалайзеров
источник

ПБ

Павел Бобров... in testing_in_python
Только всё ещё совсем не понятно как это исправить:(
источник

СС

Сказочный Сникерс... in testing_in_python
для начала перенеси код функции tear_down за yield
источник