Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Suppress print output in unittests

Edit: Please notice I'm using Python 2.6 (as tagged)

Say I have the following:

class Foo:
    def bar(self):
        print 'bar'
        return 7

And say I have the following unit test:

import unittest
class ut_Foo(unittest.TestCase):
    def test_bar(self):
        obj = Foo()
        res = obj.bar()
        self.assertEqual(res, 7)

So if I run:

unittest.main()

I get:

bar # <-- I don't want this, but I *do* want the rest
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
Exit code:  False

My question is: Is there a way to suppress the output of the object being tested while still getting the output of the unittest framework?

Edit This question is not a duplicate of the flagged question which is asking about silencing stdout of a particular function within a normal python script.

Whereas this question is asking about hiding the normal stdout of a python script while running it's unittests. I still want the unittest stdout to be displayed, and I don't want to disable the stdout of my tested script.

like image 935
asherbret Avatar asked Jun 10 '14 06:06

asherbret


2 Answers

Call your unittest with option "-b" - buffer stdout and stderr

Foo.py

class Foo:
    def bar(self):
        print "bar"
        return 7

test.py

import unittest
from Foo import Foo

class test_Foo(unittest.TestCase):
    def test_bar(self):
        obj = Foo()
        res = obj.bar()
        self.assertEqual(res, 7)

if __name__ == "__main__":
    unittest.main()

Run it with -b option

$ python test.py -b
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Alternative: use nose

$ pip install nose

what installs command nosetests

Note, that I have modified test suite to have class and methods prefixed by test to satisfy nose default test discovery rules.

nosetests by default does not show output

$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

If you want to see the output, use -s switch:

$ nosetests -s
bar
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
like image 196
Jan Vlcinsky Avatar answered Nov 10 '22 18:11

Jan Vlcinsky


You can suppress the output by disabling the sys.stdout and enabling it after your test is done:

import sys
import io
import unittest

class ut_Foo(unittest.TestCase):
    def test_bar(self):

        #You suppress here:
        suppress_text = io.StringIO()
        sys.stdout = suppress_text 
        
        obj = Foo()
        res = obj.bar()
        self.assertEqual(res, 7)
        
        #You release here:
        sys.stdout = sys.__stdout__

Got all of this from:

https://codingdose.info/2018/03/22/supress-print-output-in-python/

like image 29
Mbuso Avatar answered Nov 10 '22 16:11

Mbuso