Python pytest: захват stdout всегда терпит неудачу

Я пытаюсь захватить вывод из операторов stdout/print в pytest (Python версии 3.6).

Это всегда терпит неудачу:

message = 'The meaning of life is not actually 42\n'

def print_greeting():
    """print 42 to stdout"""

    # write to stdout
    sys.stdout.write(message)           # this fails

    # print to stdout
    print('Message again: ', message)   # this fails too


def test_printgreeting(capsys):
    """assert '42' was printed to stdout"""

    # capture stdout / stderr
    out, err = capsys.readouterr()
    print_greeting()

    # 42 should be in stdout from sys.stdout.write
    assert '42' in out

Результаты pytest:

========================================================= test session starts ==========================================================

collected 1 item

test.py
The meaning of life is not actually 42
F

=============================================================== FAILURES ===============================================================
__________________________________________________________ test_printgreeting __________________________________________________________
test.py:42: in test_printgreeting
    assert '42' in out
E   AssertionError: assert '42' in ''
======================================================= 1 failed in 0.03 seconds =======================================================

Почему это не захвачено?


person emf    schedule 13.09.2017    source источник


Ответы (1)


Вам нужно вызвать readouterr после печати:

def test_printgreeting(capsys):
    """assert '42' was printed to stdout"""

    # capture stdout / stderr
    print_greeting()
    out, err = capsys.readouterr()

    # 42 should be in stdout from sys.stdout.write
    assert '42' in out
person Phydeaux    schedule 13.09.2017
comment
Мой Бог. Я бился об это головой часа три. ›,‹ - person emf; 14.09.2017
comment
Большое спасибо. - person emf; 14.09.2017