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

ash*_*bar 17 python python-2.6 python-unittest

编辑:请注意我正在使用Python 2.6(标记为)

说我有以下内容:

class Foo:
    def bar(self):
        print 'bar'
        return 7
Run Code Online (Sandbox Code Playgroud)

并说我有以下单元测试:

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

所以如果我跑:

unittest.main()
Run Code Online (Sandbox Code Playgroud)

我明白了:

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

OK
Exit code:  False
Run Code Online (Sandbox Code Playgroud)

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

编辑 此问题不是标记问题的副本,该问题询问是否在正常python脚本中对特定函数的stdout进行静默.

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

Jan*_*sky 22

使用选项"-b"调用unittest - buffer stdout和stderr

Foo.py

class Foo:
    def bar(self):
        print "bar"
        return 7
Run Code Online (Sandbox Code Playgroud)

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 Code Online (Sandbox Code Playgroud)

使用-b选项运行它

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

OK
Run Code Online (Sandbox Code Playgroud)

替代方案:使用 nose

$ pip install nose
Run Code Online (Sandbox Code Playgroud)

什么安装命令 nosetests

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

nosetests 默认情况下不显示输出

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

OK
Run Code Online (Sandbox Code Playgroud)

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

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

OK
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`unittest.main(buffer = True)`将它作为默认值 (12认同)
  • 参考:https://docs.python.org/2/library/unittest.html#cmdoption-unittest-b (2认同)

小智 10

您可以通过禁用 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__
Run Code Online (Sandbox Code Playgroud)

所有这些都来自:

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

  • 我发现使用 `with` 语句和一个模拟,这是一种更好的语法,例如: `with mock.patch('sys.stdout', new = StringIO()) as std_out:` (11认同)