Нужен py.test для регистрации ошибок утверждения в файле журнала из модуля ведения журнала python.

Нужен py.test для регистрации ошибок утверждения в файле журнала из модуля ведения журнала python. В тесте настроен модуль ведения журнала python, и все журналы поступают туда, как и ожидалось. Я использовал операторы assert на протяжении всего теста. Но когда возникают ошибки утверждения, эти сообщения регистрируются не в выводе журнала python, а в командной консоли.

Есть ли способ заставить py.test регистрировать ошибки утверждения в выводе журнала теста?

Прямо сейчас ошибки находятся в командной консоли, но было бы здорово, если бы эти ошибки утверждения также регистрировались как часть вывода журнала python, чтобы все сообщения журнала собирались в одном месте. Кроме того, для длительного теста я не вижу ошибок до завершения всего теста, что может занять много времени. Было бы здорово, если бы я мог сразу увидеть ошибку утверждения, чтобы я мог решить принять меры.


person kenneth wong    schedule 22.09.2012    source источник
comment
см. stackoverflow.com/a/58095587/192373   -  person Alex Cohn    schedule 25.09.2019


Ответы (1)


Вы можете добиться этого, используя хук pytest_runtest_call в файле conftest.py:

import logging

def pytest_runtest_call(__multicall__):
    try:
        __multicall__.execute()
    except KeyboardInterrupt:
        raise
    except:
        logging.exception('pytest_runtest_call caught exception:')
        raise

Хук pytest_runtest_call отвечает за фактический запуск тестовых функций, но не отвечает за перехват исключений и сообщение о них. Это означает, что это идеальное место для перехвата исключения и передачи его в журнал.

Вместо фактического изменения способа вызова тестовой функции используется __multicall__ для простого вызова хука, который был бы вызван, если бы этого хука не было.

Обратите внимание, что исключение, зарегистрированное ловушкой, будет намного длиннее, чем исключение, о котором обычно сообщает py.test. Это связано с тем, что ведение журнала не усекает стек, чтобы он был просто тестовой функцией, вы можете добавить это самостоятельно, если это необходимо.

person flub    schedule 22.09.2012