Как печатать на консоль в тесте 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 по другим причинам. Похоже, такая базовая функциональность, что, возможно, мне ее не хватает!?



кто-нибудь знает, как сделать так, чтобы показывались операторы печати?

882   4  

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 ======================

Примечание .

если вы хотите увидеть print операторы, как они выполняются, вы можете передать -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, которую вы упомянули, предлагает несколько предложений:

  1. вставить assert False, "dumb assert to make PyTest print my stuff" в конце вашей функции, и вы увидите свой выход из-за неудачного теста.

  2. у вас есть специальный объект, переданный вам 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

    Ничего не найдено.