Как печатать на консоль в тесте Py?
Я пытаюсь использовать тестовую разработку с pytest модуль.
pytest не будет print в консоль, когда я пишу print.
Я использую py.test my_tests.py, чтобы запустить его...
The 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 по другим причинам. Похоже, такая базовая функциональность, что, возможно, мне ее не хватает!?
кто-нибудь знает, как сделать так, чтобы показывались операторы печати?
4 ответов:
по умолчанию
py.testзахватывает результат стандарта вне так, что он сможет контролировать как он печатает его вне. Если бы он этого не сделал, он бы выплюнул много текста без контекста того, какой тест напечатал этот текст.однако, если тест завершится неудачно, он будет включать раздел в результирующий отчет, который показывает, что было напечатано для стандартизации в этом конкретном тесте.
например,
def test_good(): for i in range(1000): print(i) def test_bad(): print('this should fail!') assert Falseрезультаты в следующем вывод:
>>> py.test tmp.py ============================= test session starts ============================== platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2 plugins: cache, cov, pep8, xdist collected 2 items tmp.py .F =================================== FAILURES =================================== ___________________________________ test_bad ___________________________________ def test_bad(): print('this should fail!') > assert False E assert False tmp.py:7: AssertionError ------------------------------- Captured stdout -------------------------------- this should fail! ====================== 1 failed, 1 passed in 0.04 seconds ======================Примечание .
если вы хотите увидеть
-sфлагpy.test. Однако, обратите внимание, что это иногда может быть трудно разобрать.>>> py.test tmp.py -s ============================= test session starts ============================== platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2 plugins: cache, cov, pep8, xdist collected 2 items tmp.py 0 1 2 3 ... and so on ... 997 998 999 .this should fail! F =================================== FAILURES =================================== ___________________________________ test_bad ___________________________________ def test_bad(): print('this should fail!') > assert False E assert False tmp.py:7: AssertionError ====================== 1 failed, 1 passed in 0.02 seconds ======================
используя
-sопция будет печатать вывод всех функций, которые могут быть слишком много.Если вам нужен конкретный вывод, страница doc, которую вы упомянули, предлагает несколько предложений:
вставить
assert False, "dumb assert to make PyTest print my stuff"в конце вашей функции, и вы увидите свой выход из-за неудачного теста.у вас есть специальный объект, переданный вам PyTest, и вы можете записать вывод в файл, чтобы проверить его позже, как
def test_good1(capsys): for i in range(5): print i out, err = capsys.readouterr() open("err.txt", "w").write(err) open("out.txt", "w").write(out)вы можете открыть
outиerrфайлы в отдельной вкладке, и пусть редактор автоматически обновлять его для вас, или сделать простойpy.test; cat out.txtкоманда оболочки для запуска теста.это довольно хакерский способ делать вещи, но может быть, это то, что вам нужно: в конце концов, TDD означает, что вы возитесь с вещами и оставляете их чистыми и тихими, когда они готовы :-).
мне нужно было напечатать важное предупреждение о пропущенных тестах именно тогда, когда
PyTestприглушенные буквально все.Я не хотел провалить тест, чтобы отправить сигнал, поэтому я сделал Хак следующим образом:
def test_2_YellAboutBrokenAndMutedTests(): import atexit def report(): print C_patch.tidy_text(""" In silent mode PyTest breaks low level stream structure I work with, so I cannot test if my functionality work fine. I skipped corresponding tests. Run `py.test -s` to make sure everything is tested.""") if sys.stdout != sys.__stdout__: atexit.register(report)The
atexitмодуль позволяет мне печатать вещи послеPyTestосвободил выходные потоки. Вывод выглядит следующим образом:============================= test session starts ============================== platform linux2 -- Python 2.7.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /media/Storage/henaro/smyth/Alchemist2-git/sources/C_patch, inifile: collected 15 items test_C_patch.py .....ssss....s. ===================== 10 passed, 5 skipped in 0.15 seconds ===================== In silent mode PyTest breaks low level stream structure I work with, so I cannot test if my functionality work fine. I skipped corresponding tests. Run `py.test -s` to make sure everything is tested. ~/.../sources/C_patch$сообщение печатается даже тогда, когда
PyTestнаходится в беззвучном режиме, и не печатается, если вы запускаете материал сpy.test -s, так что все уже хорошо протестированы.
по словам pytest docs,
pytest --capture=sysдолжны работать. Если вы хотите захватить стандарт вне внутри испытания, то см. приспособление capsys.
Comments