Python, py.test и stderr - получение выходных данных обработчика журналов из расширения цемента

1

Я разработал приложение на Python и использую библиотеку CLI Cement. Я использую py.test с CementTestCase. Я могу записать вывод из stdout в тестовых случаях без проблем, используя что-то вроде этого:

    with EZOTestApp(argv=['view', 'deploys']) as app:
        old_stdout = sys.stdout
        app.ezo = EZO(app.config["ezo"])
        result = StringIO()
        sys.stdout = result
        app.run()
        output = sys.stdout.getvalue()
        sys.stdout = old_stdout
        assert 'deploy' in output

Однако, пытаясь уловить вывод stderr с расширением журнала Cement с использованием того же механизма, ничего не фиксирует (re: замена 'stdout' на 'stderr' в приведенном выше коде). Я видел метод для итерации через стандартные обработчики протоколов Python для поиска вывода, и я подозреваю, что что-то подобное будет использоваться для расширения журнала Cement для захвата stderr, но мне трудно понять его. У кого-нибудь есть понимание? Большое спасибо.

Теги:
logging
stderr
cement
pytest

1 ответ

1
Лучший ответ

Захват вывода stdout или stderr можно выполнить с помощью устройства capsys.

Затем вы можете сделать такие проверки (пример адаптирован из документов):

def test_myoutput(capsys):
    print("hello")
    sys.stderr.write("world\n")
    captured = capsys.readouterr()
    assert captured.out == "hello\n"
    assert captured.err == "world\n"

Для еще большей детализации вы можете использовать прибор caplog. Это даст вам доступ к уровню журнала, журналу и т.д., В отличие от текстовой строки. Это зависит от расширения, о котором вы говорите, полагаясь на стандартный модуль logging lib, поэтому он может быть недоступен.

Пример того, что вы можете сделать с этим приспособлением (опять же, кредит относится к документу pytest):

def test_baz(caplog):
    func_under_test()
    for record in caplog.records:
        assert record.levelname != 'CRITICAL'
    assert 'wally' not in caplog.text
  • 0
    спасибо Самуил У меня были проблемы с передачей параметров, и мне пришлось повторить тесты. Это работает очень хорошо сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню