Я пытаюсь использовать TDD (разработка через тестирование) с pytest
.
pytest
не будет print
к консоли, когда я использую print
.
Я использую, pytest my_tests.py
чтобы запустить его.
documentation
, Кажется, говорят , что он должен работать по умолчанию: http://pytest.org/latest/capture.html
Но:
import myapplication as tum
class TestBlogger:
@classmethod
def setup_class(self):
self.user = "alice"
self.b = tum.Blogger(self.user)
print "This should be printed, but it won't be!"
def test_inherit(self):
assert issubclass(tum.Blogger, tum.Site)
links = self.b.get_links(posts)
print len(links) # This won't print either.
Ничего не выводится на мою стандартную консоль вывода (только обычный прогресс и сколько тестов пройдено / не выполнено).
И скрипт, который я тестирую, содержит print:
class Blogger(Site):
get_links(self, posts):
print len(posts) # It won't get printed in the test.
В unittest
модуле все печатается по умолчанию, а это именно то, что мне нужно. Тем не менее, я хочу использовать pytest
по другим причинам.
Кто-нибудь знает, как заставить показывать операторы печати?
python
unit-testing
python-2.7
pytest
BBEdit
источник
источник
sys.stdout.write("Test")
? Как насчетsys.__stdout__.write("Test")
? Последний всегда должен записывать в системный стандартный вывод, который должен быть консолью. Если две команды делают разные вещи, то stdout изменяется; если они делают то же самое, то проблема в другом.Ответы:
По умолчанию
py.test
фиксирует результат стандартного вывода, чтобы он мог контролировать способ его вывода. Если бы он этого не делал, он бы выбросил много текста без контекста того, какой тест печатал этот текст.Однако, если тест не пройден, он будет включать в итоговый отчет раздел, в котором будет показано, что было напечатано в стандарте в этом конкретном тесте.
Например,
Результаты в следующем выводе:
Обратите внимание на
Captured stdout
раздел.Если вы хотите видеть
print
операторы по мере их выполнения, вы можете передать-s
флагpy.test
. Тем не менее, обратите внимание, что иногда это может быть трудно разобрать.источник
При использовании
-s
опции будет напечатан вывод всех функций, которых может быть слишком много.Если вам нужен конкретный вывод, упомянутая страница документации предлагает несколько советов:
Вставьте
assert False, "dumb assert to make PyTest print my stuff"
в конце своей функции, и вы увидите ваш вывод из-за неудачного теста.У вас есть специальный объект, переданный вам PyTest, и вы можете записать вывод в файл для последующей проверки, например:
Вы можете открыть файлы
out
иerr
на отдельной вкладке и позволить редактору автоматически обновить его для вас, или выполнить простуюpy.test; cat out.txt
команду оболочки для запуска теста.Это довольно хакерский способ делать вещи, но, возможно, это то, что вам нужно: в конце концов, TDD означает, что вы портите вещи и оставляете их чистыми и тихими, когда они готовы :-).
источник
print()
функции вы должны поместить переменную или сообщение, которое вы хотите напечатать после запятой в операторе assert. Напримерassert False, what_are_you
, «распечатает» значениеwhat_are_you
в отчете Pytest.Короткий ответ
Используйте
-s
опцию:Подробный ответ
Из документов :
pytest
имеет возможность ,--capture=method
в которомmethod
находится за испытание метода захвата, и может быть одним из следующих:fd
,sys
илиno
.pytest
также имеет опцию,-s
которая является ярлыком для--capture=no
, и это опция, которая позволит вам видеть ваши операторы печати в консоли.Настройка методов захвата или отключение захвата
Есть два способа
pytest
захвата:захват уровня дескриптора файла (FD) (по умолчанию): все записи, поступающие в дескрипторы файлов операционной системы 1 и 2, будут перехвачены.
Захват уровня sys : будут записываться только файлы Python: sys.stdout и sys.stderr. Захват записи в файловые дескрипторы не выполняется.
источник
Мне нужно было напечатать важное предупреждение о пропущенных тестах именно тогда, когда
PyTest
заглушено буквально все .Я не хотел проваливать тест, чтобы послать сигнал, поэтому я сделал хак следующим образом:
atexit
Модуль позволяет мне печатать материал послеPyTest
освободили выходные потоки. Вывод выглядит следующим образом:Сообщение печатается даже
PyTest
в беззвучном режиме и не печатается, если вы запускаете что-либоpy.test -s
, поэтому все уже хорошо протестировано.источник
Согласно документам pytest ,
pytest --capture=sys
должно работать. Если вы хотите захватить стандарт внутри теста, обратитесь к приспособлению capsys.источник
Первоначально я пришел сюда, чтобы найти способ
PyTest
печати в консоли VSCode при запуске / отладке модульного теста оттуда. Это можно сделать с помощью следующейlaunch.json
конфигурации. Учитывая.venv
папку виртуальной среды.источник