Вход в PyTest - PullRequest
       17

Вход в PyTest

0 голосов
/ 01 апреля 2020

Я работаю с пользовательским тестовым фреймворком и пытаюсь связать его с 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. У кого-нибудь есть идеи, как я могу это исправить?

...