pythonunit-testingpytest

How do I print to console in pytest?


pytest will not print to the console when I use print. The documentation seems to say that it should work by default.

I am using pytest my_tests.py to run this test:

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.

Nothing gets printed to my standard output console (just the normal progress and how many many tests passed/failed).

And the script that I'm testing contains print:

class Blogger(Site):
    get_links(self, posts):
        print len(posts)   # It won't get printed in the test.

In unittest module, everything gets printed by default, which is exactly what I need. However, I wish to use pytest for other reasons.

Does anyone know how to make the print statements get shown?


Solution

  • By default, py.test captures the result of standard out so that it can control how it prints it out. If it didn't do this, it would spew out a lot of text without the context of what test printed that text.

    However, if a test fails, it will include a section in the resulting report that shows what was printed to standard out in that particular test.

    For example,

    def test_good():
        for i in range(1000):
            print(i)
    
    def test_bad():
        print('this should fail!')
        assert False
    

    Results in the following output:

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

    Note the Captured stdout section.

    If you would like to see print statements as they are executed, you can pass the -s flag to py.test. However, note that this can sometimes be difficult to parse.

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