Pytest: как использовать capsys для проверки stdout/stderr, а также распечатать stdout/stderr, если тест не пройден?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pytest: как использовать capsys для проверки stdout/stderr, а также распечатать stdout/stderr, если тест не пройден?

Сообщение Anonymous »

Python 3.4.1, pytest 2.6.2.

Если тест не пройден, pytest автоматически сообщит, что было выведено на стандартный вывод теста.
Например, этот код:

Код: Выделить всё

def method_under_test():
print("Hallo, Welt!")
return 41

def test_result_only():
result = method_under_test()
assert result == 42
при выполнении как python -m pytest myfile.py,
сообщит об этом:

Код: Выделить всё

================================== FAILURES ===================================
______________________________ test_result_only _______________________________

def test_result_only():
result = method_under_test()
>       assert result == 42
E       assert 41 == 42

pytestest.py:9: AssertionError
---------------------------- Captured stdout call -----------------------------
Hallo, Welt!
========================== 1 failed in 0.03 seconds ===========================
Это очень хорошая функция.
Но когда я использую встроенное в pytest приспособление capsys, вот так:

Код: Выделить всё

def test_result_and_stdout(capsys):
result = method_under_test()
out, err = capsys.readouterr()
assert out.startswith("Hello")
assert result == 42
отчет больше не содержит фактических результатов:

Код: Выделить всё

================================== FAILURES ===================================
___________________________ test_result_and_stdout ____________________________

capsys = 

def test_result_and_stdout(capsys):
result = method_under_test()
out, err = capsys.readouterr()
>       assert out.startswith("Hello")
E       assert ('Hello')
E        +  where  = 'Hallo, Welt!\n'.startswith

pytestest.py:14: AssertionError
========================== 1 failed in 0.03 seconds ===========================
Я не уверен, соответствует ли такое поведение спецификации;
в документации pytest говорится о readouterr.:
"После теста функция завершается
исходные потоки будут восстановлены."

Я попробовал предположить, что capsys является менеджером контекста, и
вызвал capsys .__exit__() непосредственно перед утверждениями.
Это было бы уродливое решение, но, по крайней мере, решение, если
он восстановит вывод до моего утверждения.
Однако это только производит

Код: Выделить всё

AttributeError: 'CaptureFixture' object has no attribute '__exit__'
Затем я заглянул в исходный код класса CaptureFixture
и нашел многообещающий метод close (который вызывает
какой-то метод pop_outerr_to_orig()),
но вызов capsys.close() в моем тесте тоже не помог,
он не дал вообще никакого очевидного эффекта.

Как заставить pytest сообщать о моих результатах в случае сбоя
теста с использованием capsys?

Подробнее здесь: https://stackoverflow.com/questions/265 ... int-stdout
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»