Python:为控制台打印编写单元测试

2024-03-06

功能foo打印到控制台。我想测试控制台打印。我怎样才能在Python中实现这一点?

需要测试这个函数,没有 return 语句:

def foo(inStr):
   print "hi"+inStr

我的测试:

def test_foo():
    cmdProcess = subprocess.Popen(foo("test"), stdout=subprocess.PIPE)
    cmdOut = cmdProcess.communicate()[0]
    self.assertEquals("hitest", cmdOut)

您只需临时重定向即可轻松捕获标准输出sys.stdout to a StringIO对象,如下:

import StringIO
import sys
    
def foo(inStr):
    print "hi"+inStr
    
def test_foo():
    capturedOutput = StringIO.StringIO()         # Make StringIO.
    sys.stdout = capturedOutput                  # Redirect stdout.
    foo('test')                                  # Call function.
    sys.stdout = sys.__stdout__                  # Reset redirect.
    print 'Captured', capturedOutput.getvalue()  # Now works.
    
test_foo()

该程序的输出是:

Captured hitest

这表明重定向成功捕获了输出,并且您能够将输出流恢复到开始捕获之前的状态。


请注意,上面的代码适用于 Python 2.7,如问题所示。 Python 3 略有不同:

import io
import sys
    
def foo(inStr):
    print ("hi"+inStr)
    
def test_foo():
    capturedOutput = io.StringIO()                 # Create StringIO.
    sys.stdout = capturedOutput                    # Redirect stdout.
    foo('test')                                    # Call function.
    sys.stdout = sys.__stdout__                    # Reset redirect.
    print ('Captured', capturedOutput.getvalue())  # Now works.
    
    test_foo()

如果您的函数可能引发异常,您还需要小心,因为这可能意味着重定向重置可能无法完成。这可能会影响以后的测试。

解决这个问题的一种方法是将函数调用包装在try/except阻止,并在发生异常时重置重定向并重新引发异常。然后,对函数的单行调用将变成这样,其他代码保持原样:

try:
    foo('test')                  # Call function.
except:
    sys.stdout = sys.__stdout__  # Reset redirect.
    raise
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:为控制台打印编写单元测试 的相关文章

随机推荐