在单元测试中抑制打印输出

时间:2014-06-10 06:31:24

标签: python python-2.6 python-unittest

修改:请注意我使用的是Python 2.6(已标记)

说我有以下内容:

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

并说我有以下单元测试:

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

所以,如果我跑:

unittest.main()

我明白了:

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

OK
Exit code:  False

我的问题是:在获得unittest框架的输出时,有没有办法抑制被测对象的输出?

修改 这个问题不是flagged question的副本,它要求在普通的python脚本中静默特定函数的stdout。

然而这个问题是在运行它的单元测试时询问是否隐藏了python脚本的正常标准输出。我仍然希望显示unittest标准输出,并且我不想禁用我测试过的脚本的标准输出。

2 个答案:

答案 0 :(得分:20)

使用选项&#34; -b&#34;调用您的unittest - 缓冲stdout和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()

使用-b选项

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

OK

替代方案:使用nose

$ pip install nose

安装命令nosetests

请注意,我已修改测试套件,使其类和方法前缀为test,以满足nose默认测试发现规则。

默认情况下,

nosetests不显示输出

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

OK

如果要查看输出,请使用-s开关:

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

OK

答案 1 :(得分:2)

您可以通过禁用sys.stdout并在测试完成后启用它来抑制输出:

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__

所有这些都来自:

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