PYPROGLIB Telegram 7143
📱 Python: как захватывать stdout и stderr в unit test

Когда вы тестируете функции, которые что-то печатают в терминал (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

🐸 Библиотека питониста

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94👏1



tgoop.com/pyproglib/7143
Create:
Last Update:

📱 Python: как захватывать stdout и stderr в unit test

Когда вы тестируете функции, которые что-то печатают в терминал (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

🐸 Библиотека питониста

#буст

BY Библиотека питониста | Python, Django, Flask




Share with your friend now:
tgoop.com/pyproglib/7143

View MORE
Open in Telegram


Telegram News

Date: |

End-to-end encryption is an important feature in messaging, as it's the first step in protecting users from surveillance. Hui said the messages, which included urging the disruption of airport operations, were attempts to incite followers to make use of poisonous, corrosive or flammable substances to vandalize police vehicles, and also called on others to make weapons to harm police. In the “Bear Market Screaming Therapy Group” on Telegram, members are only allowed to post voice notes of themselves screaming. Anything else will result in an instant ban from the group, which currently has about 75 members. Telegram Android app: Open the chats list, click the menu icon and select “New Channel.” fire bomb molotov November 18 Dylan Hollingsworth yau ma tei
from us


Telegram Библиотека питониста | Python, Django, Flask
FROM American