如何在Python中运行unittest时临时隐藏stdout或stderr

时间:2011-12-15 15:43:04

标签: python

我有一个错误的第三方python模块,它在导入时输出到stdout或stderr,这打破了我的单元测试的输出。

如何临时重定向stdout以隐藏其输出。

限于Python 2.5语法:)

更新,我忘了提及sys.stdoutsys.__stderr__方法在这种情况下不起作用。据我所知,这个错误的模块正在使用本机代码。

2 个答案:

答案 0 :(得分:20)

您还可以使用mock在导入模块时为您修补sys.stdoutsys.stderr。使用此策略的测试模块的示例如下:

import os
devnull = open(os.devnull, 'w')

from mock import patch
with patch('sys.stdout', devnull):
    with patch('sys.stderr', devnull):
        import bad_module

# Test cases writen here

其中bad_module是正在导入时打印到sys.stdoutsys.stderr的第三方模块。

答案 1 :(得分:18)

你可以这样做:

>>> import sys, os
>>> _stderr = sys.stderr
>>> _stdout = sys.stdout
>>> null = open(os.devnull,'wb')
>>> sys.stdout = sys.stderr = null
>>> print "Bleh"
>>> sys.stderr = _stderr
>>> sys.stdout = _stdout
>>> print "Bleh"
Bleh