Size: a a a

QA — Automation

2021 June 06

СС

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

А

Алексей in QA — Automation
это не смотри, это какие то наркоманы со стаковерфлоу судя по всему.
Добрался до компа
Наша задача проста как топор - получить локалсы в случае возникновения эксепшена
Адаптировал враппер.
import sys

def check_wrapper(func):
   def func_wrapper(*args, **kwargs):
       try:
           func(*args, **kwargs)  # No return values
       except AssertionError as ae:
           logger.error(f"Assertion failed: {str(ae)}")
           logger.error(f"Local variables: {sys.exc_info()[2].tb_next.tb_frame.f_locals}")
           raise
       except Exception as e:
           logger.exception(str(e))
           logger.error(f"Unknown error: {str(e)}")
           raise

   update_wrapper(func_wrapper, func)
   return func_wrapper
источник

А

Алексей in QA — Automation
это вообще простое решение, если нужны ток локалсы
источник

А

Алексей in QA — Automation
добавь в conftest.py (главный)
источник

А

Алексей in QA — Automation
сам враппер можно в отдельный файл, оттуда и вызывать
источник

А

Алексей in QA — Automation
снаружи и не надо :)
источник

A

Alexander in QA — Automation
def check_wrapper это не фикстура получается? Просто так и добавлять?
источник

А

Алексей in QA — Automation
это декоратор своего рода :)
источник

A

Alexander in QA — Automation
Чек враппер вынести,а апдейт запихать в конфтест получается?
источник

А

Алексей in QA — Automation
Да, добавляй его, потом
def pytest_runtest_call(item):
   item._obj = check_wrapper(item._obj)
источник

СС

Сказочный Сникерс... in QA — Automation
это в случае трейса, а без трейса?
источник

А

Алексей in QA — Automation
в конфтесте
def pytest_runtest_call(item):
   item._obj = check_wrapper(item._obj)

сам чек враппер - где угодно
источник

А

Алексей in QA — Automation
без трейса у меня вылетает только виндовые мемори виолешены из си, а там обычно не то что не до трейсов, там питон складывается быстрее мысли
источник

А

Алексей in QA — Automation
для обычных же тестов вон ента фигня выше (ну посложнее, там с перебором фреймов) помогала достаточно давно
источник

СС

Сказочный Сникерс... in QA — Automation
в общем в случае ошибки да, так получится. без ошибки понять какие были локальные переменные не получится. а зачастую это тоже надо
источник

A

Alexander in QA — Automation
Не, нам не надо)
источник

СС

Сказочный Сникерс... in QA — Automation
с ошибкой пайтест и в логе их показывает и в аллюре их прекрасно все видно
источник

A

Alexander in QA — Automation
Нам в ci по факту интересны только упавшие)
источник

А

Алексей in QA — Automation
ну обычно интересуют ток во время ошибки :) но если оченя надо вообще видеть что там -
sys.settrace() - там можно пошагово все прокручивать и при необходимости логгировать
источник

А

Алексей in QA — Automation
в гробу я видал показ пайтеста :)
источник