Тестирование вывода логов с помощью pytest - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь написать тест с использованием pytest, который бы проверял, что определенная функция записывает предупреждение в журнал, когда это необходимо. Например:

In module.py:

import logging
LOGGER = logging.getLogger(__name__)

def run_function():
    if something_bad_happens:
        LOGGER.warning('Something bad happened!')

In test_module.py:

import logging
from module import run_function

LOGGER = logging.getLogger(__name__)

def test_func():
    LOGGER.info('Testing now.')
    run_function()
    ~ somehow get the stdout/log of run_function() ~
    assert 'Something bad happened!' in output

Я видел, что вы, возможно, можете получить журнал или stdout / stderr с pytest, передав capsys или caplog в качестве аргумента теста, а затем используя capsus.readouterr() или caplog.records для доступа к выход.

Однако, когда я пробую эти методы, я вижу только «Тестирование сейчас», а не «Что-то плохое случилось!». Похоже, что вывод журнала, который происходит во время вызова run_function(), недоступен из test_func()?

То же самое происходит, если я попробую более прямой метод, такой как sys.stdout.getvalue(). Что сбивает с толку, потому что run_function() пишет в терминал, поэтому я думаю, что это будет доступно с stdout ...?

В принципе, кто-нибудь знает, как я могу получить доступ к этому "Что-то плохое случилось!" из test_func()?

1 Ответ

0 голосов
/ 05 ноября 2018

Я не знаю, почему это не сработало, когда я пробовал это раньше, но это решение работает для меня сейчас:

In test_module.py:

import logging
from module import run_function

LOGGER = logging.getLogger(__name__)

def test_func(caplog):
    LOGGER.info('Testing now.')
    run_function()
    assert 'Something bad happened!' in caplog.text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...