如何在Python单元测试中临时隐藏stdout或stderr

12 投票
2 回答
8329 浏览
提问于 2025-04-17 08:26

我有一个有问题的第三方Python模块,它在被导入时会向标准输出(stdout)或标准错误输出(stderr)发送信息,这导致我的单元测试输出出现问题。

我该如何临时重定向stdout,以隐藏它的输出呢?

请限制在Python 2.5的语法 :)

更新,我忘了提到sys.stdoutsys.__stderr__的方法在这种情况下不起作用。就我所知,这个有问题的模块使用了本地代码。

2 个回答

22

你还可以使用 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 输出内容。

19

你可以这样做:

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

撰写回答