ведение журнала отключено при использовании с pytest - PullRequest
0 голосов
/ 08 января 2019

У меня проблема при использовании pytest и регистрации вместе. Когда я запускаю программу самостоятельно, я вижу ее сообщения, напечатанные на экране, а также в файле test.log.

python3 main.py -> prints on terminal, and also in test.log

Однако, когда я запускаю ту же программу с pytest, я вижу сообщения только на экране, но файл test.log не создается.

pytest -vs test -> prints only on terminal, but not in test.log

Почему pytest взаимодействует с утилитой ведения журнала и что я должен делать для создания этих файлов журнала при использовании pytest?

Мои версии следующие:

platform linux -- Python 3.6.7, pytest-4.0.2, py-1.7.0, pluggy-0.8.0 -- /usr/bin/python3

Структура каталогов следующая:

├── logger.py
├── main.py
└── test
    ├── __init__.py
    └── test_module01.py

Код для этих файлов приведен ниже:

# logger.py ===================================
import logging

def logconfig(logfile, loglevel):
    print('logconfig: logfile={} loglevel={}..'.format(logfile,loglevel))
    logging.basicConfig(filename=logfile, level=logging.INFO, format='%(asctime)s :: %(message)s')

def logmsg(log_level, msg):
    print(log_level,': ',msg)
    logging.info('INFO: ' + msg)

# main.py =====================================
from datetime import datetime
from logger import *

def main(BASE_DIR):
    LOG_FILE = BASE_DIR + 'test.log'
    logconfig(LOG_FILE,'INFO')
    logmsg('INFO',"Starting PROGRAM@[{}] at {}=".format(BASE_DIR,datetime.now()))
    logmsg('INFO',"Ending PROGRAM at {}=".format(datetime.now()))

if __name__ == "__main__":
    main('./')

# __init__.py =================================
all = ["test_module01"]

# test_module01.py ============================
import pytest
import main

class TestClass01:
    def test_case01(self):
        print("In test_case01()")
        main.main('./test/')

1 Ответ

0 голосов
/ 09 января 2019

По умолчанию pytest фиксирует все записи журнала, созданные вашей программой. Это означает, что все обработчики журналирования, определенные в вашем коде, будут заменены на собственный обработчик pytest, используемый внутри; если вы передадите -s, он выведет отправленные записи на терминал, в противном случае он ничего не напечатает и дальнейший вывод не производится. Внутренний обработчик будет захватывать все записи, исходящие из вашего кода. Для доступа к ним в тестах используйте приспособление caplog. Пример: представьте, что вам нужно протестировать следующую программу:

import logging
import time


def spam():
    logging.basicConfig(level=logging.CRITICAL)
    logging.debug('spam starts')
    time.sleep(1)
    logging.critical('Oopsie')
    logging.debug('spam ends')


if __name__ == '__main__':
    spam()

Если вы запустите программу, вы увидите вывод

CRITICAL:root:Oopsie

но нет очевидного способа получить доступ к сообщениям отладки. Нет проблем при использовании caplog:

def test_spam(caplog):
    with caplog.at_level(logging.DEBUG):
        spam()
    assert len(caplog.records) == 3
    assert caplog.records[0].message == 'spam starts'
    assert caplog.records[-1].message == 'spam ends'

Если вам не требуется захват логов (например, при написании системных тестов с pytest), вы можете отключить его, отключив плагин logging:

$ pytest -p no:logging

Или сохраните его в pytest.cfg, чтобы не вводить его каждый раз:

[pytest]
addopts = -p no:logging

Конечно, после явного отключения захвата журнала вы не можете больше полагаться на caplog.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...