How to print to console in pytest?

I'm trying to use TDD (test-driven development) with pytest. pytest will not print to the console when I use print.

I am using pytest my_tests.py to run it.

The documentation seems to say that it should work by default: http://pytest.org/latest/capture.html

But:

    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?

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

From: stackoverflow.com/q/24617397

Back to homepage or read more recommendations: