tgoop.com/pyproglib/7143
Create:
Last Update:
Last Update:
Когда вы тестируете функции, которые что-то печатают в терминал (stdout/stderr), полезно уметь перехватывать этот вывод и проверять его. В Python это можно сделать с помощью contextlib.redirect_stdout()
и redirect_stderr()
.
Простой пример:
from contextlib import redirect_stdout
from io import StringIO
from unittest import TestCase
from example import print_silly
class PrintSillyTests(TestCase):
def test_print_silly(self):
with redirect_stdout(StringIO()) as buffer:
print_silly("What a lovely day!")
self.assertEqual(buffer.getvalue(), "WhAt a lOvElY DaY!\n")
📌 Если нужно одновременно захватывать stdout и stderr, удобно вынести это в отдельный контекстный менеджер:
from contextlib import contextmanager, redirect_stdout, redirect_stderr
from io import StringIO
from typing import Generator, TextIO
@contextmanager
def capture_output() -> Generator[tuple[TextIO, TextIO]]:
with (
redirect_stdout(StringIO()) as out,
redirect_stderr(StringIO()) as err,
):
yield out, err
И использовать в тестах:
class PrintSillyTests(TestCase):
def test_print_silly(self):
with capture_output() as (out, err):
print_silly("What a lovely day!")
self.assertEqual(out.getvalue(), "WhAt a lOvElY DaY!\n")
self.assertEqual(err.getvalue(), "")
Советы:
— Для логов используйте
self.assertLogs()
вместо перехвата stdout.— В pytest ещё проще: есть встроенный
capsys
для захвата вывода (captured = capsys.readouterr()
).— Не используйте
test.support.captured_stdout()
— это внутренняя утилита Python, нестабильная и не гарантирована к доступу во всех сборках.📖 Источник: https://clc.to/DNjodQ
#буст