【问题标题】:How to temporary hide stdout or stderr while running a unittest in Python如何在 Python 中运行单元测试时临时隐藏标准输出或标准错误
【发布时间】:2011-12-15 15:43:03
【问题描述】:

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

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

仅限于 Python 2.5 语法:)

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

【问题讨论】:

    标签: python


    【解决方案1】:

    您也可以使用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 的第三方模块。

    【讨论】:

    • 如果在导入期间按照 OP 指示写入 stdout,解决方案的这部分 mock 是否有效?
    • @MattH 你是对的,这个例子是错误的。仅在导入模块时,我才更新了修补 sys.stdout 和 sys.stderr 的答案。感谢您的反馈。
    • +1 有趣,我不熟悉mock。我猜你不再需要import unittest了。
    • @MattH 我同意。我已从示例中删除了该导入。再次感谢。
    • 您可以使用from contextlib import nestedwith 更简洁地写成with nested(patch('sys.stdout', devnull), patch('sys.stderr', devnull)):
    【解决方案2】:

    你可以这样做:

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

    【讨论】:

    • 您的示例应该可以工作,我什至尝试更改 sys.__stdout__sys.__stderr__ 但仍然得到输出 :[
    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2023-03-29
    • 2014-08-05
    • 2010-11-17
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多