Если тест не пройден, pytest автоматически сообщит, что было выведено на стандартный вывод теста.
Например, этот код:
Код: Выделить всё
def method_under_test():
print("Hallo, Welt!")
return 41
def test_result_only():
result = method_under_test()
assert result == 42
сообщит об этом:
Код: Выделить всё
================================== 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__'
и нашел многообещающий метод close (который вызывает
какой-то метод pop_outerr_to_orig()),
но вызов capsys.close() в моем тесте тоже не помог,
он не дал вообще никакого очевидного эффекта.
Как заставить pytest сообщать о моих результатах в случае сбоя
теста с использованием capsys?
Подробнее здесь: https://stackoverflow.com/questions/265 ... int-stdout