Я разработал приложение на Python и использую библиотеку CLI Cement. Я использую py.test с CementTestCase. Я могу записать вывод из stdout в тестовых случаях без проблем, используя что-то вроде этого:
with EZOTestApp(argv=['view', 'deploys']) as app:
old_stdout = sys.stdout
app.ezo = EZO(app.config["ezo"])
result = StringIO()
sys.stdout = result
app.run()
output = sys.stdout.getvalue()
sys.stdout = old_stdout
assert 'deploy' in output
Однако, пытаясь уловить вывод stderr с расширением журнала Cement с использованием того же механизма, ничего не фиксирует (re: замена 'stdout' на 'stderr' в приведенном выше коде). Я видел метод для итерации через стандартные обработчики протоколов Python для поиска вывода, и я подозреваю, что что-то подобное будет использоваться для расширения журнала Cement для захвата stderr, но мне трудно понять его. У кого-нибудь есть понимание? Большое спасибо.
Захват вывода stdout
или stderr
можно выполнить с помощью устройства capsys
.
Затем вы можете сделать такие проверки (пример адаптирован из документов):
def test_myoutput(capsys):
print("hello")
sys.stderr.write("world\n")
captured = capsys.readouterr()
assert captured.out == "hello\n"
assert captured.err == "world\n"
Для еще большей детализации вы можете использовать прибор caplog
. Это даст вам доступ к уровню журнала, журналу и т.д., В отличие от текстовой строки. Это зависит от расширения, о котором вы говорите, полагаясь на стандартный модуль logging
lib, поэтому он может быть недоступен.
Пример того, что вы можете сделать с этим приспособлением (опять же, кредит относится к документу pytest):
def test_baz(caplog):
func_under_test()
for record in caplog.records:
assert record.levelname != 'CRITICAL'
assert 'wally' not in caplog.text