Я работаю с пользовательским тестовым фреймворком и пытаюсь связать его с PyTest через несколько пользовательских плагинов.
Мне бы хотелось иметь возможность добавить некоторые пользовательские функции для отдельных тестовых журналов, но я продолжаю нажимать контрольно-пропускной пункт.
Базовая c структура моего кода выглядит следующим образом:
Базовый пакет (пользовательская среда тестирования)
Тестовый пакет
Базовый пакет содержит BaseClass:
class BaseClass(object):
"""
Base Class for all classes
"""
@property
def log(self):
current_module = sys.modules[__name__]
name = "{0}.{1}".format(
current_module.__name__, self.__class__.__name__)
return logging.getLogger(name)
Это позволяет нам создать красивое дерево регистрации, имея исходную точку для всех объектов регистрации. Однако я вижу странное поведение при взаимодействии через pytest.
По сути, я создал тестовый базовый класс с приспособлением autouse для создания обработчика файла журнала тестирования
class PyTestBase(BaseClass):
"""
TestBase for all PyTests
"""
@pytest.fixture(autouse=True)
def init_logs(self, request):
# some code to figure out log_path
handler = logging.FileHandler(log_path, 'a+', encoding='UTF-8')
logging.getLogger(BaseClass.__module__).addHandler(handler)
yield
logging.getLogger(BaseClass.__module__).removeHandler(handler)
Это кажется отлично работают, и мои файлы генерируются правильно, и все записи появляются Однако некоторые классы также выводятся непосредственно на консоль (независимо от флага -s или нет).
Например, у меня есть реализация ловушки
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
yield
# If outcome is from test call
if call.when == "call":
ids = # get from item
pytest.Reporter.report(ids) # global pytest variable Reporter
class Reporter(BaseClass):
def report(ids):
self.log.info("Will show in logs AND print directly to console")
I Я не уверен, какова точная причина этого. Я использовал: https://pypi.org/project/logging_tree/ для распечатки дерева и заметил, что при вызове метода отчета дерево журналов содержит дополнительный обработчик:
Handler <LogCaptureHandler (NOTSET)>
Formatter <_pytest.logging.ColoredLevelFormatter object at 0x11a80b828>
Это должно быть то, что вызывает консольная печать, но я не уверен, почему это добавляется здесь. Это потому, что я нахожусь внутри функции крючка? Может быть, я не использую логирование здесь правильным способом, которым я все еще занимаюсь с этим и с тем, как работает pytest. У кого-нибудь есть идеи, как я могу это исправить?