检查Python单元测试输出的值是否正确

1 投票
1 回答
1829 浏览
提问于 2025-04-18 15:16

我尽量把标题写得清楚一点。我是新手,刚开始接触单元测试,了解了一些基本的断言类型,但有一个测试我还没搞明白。我让用户输入一些内容,然后通过调用一个变量来打印输出,前面加上一些信息。下面是测试套件要测试的py文件

def get_input()
    pirateInput = input("What be ye name?! ")
    print("Ahoy Captain ", pirateInput)

用户输入一个名字,我就把它打印出来。所以预期的输出应该是“Ahoy Captain [用户输入]”

这是我的测试套件

import unittest
from unittest.mock import patch

from get_input import *

class GetInputTest(unittest.TestCase):

    def test_ValuePrints(self):
      #patch input as 'Hook'
      @patch('builtins.input', return_value='Hook'

          saved_stdout = sys.stdout
      try:
          out = io.StringIO()
          sys.stdout = out
          get_input()
          output = out.getvalue().strip()
          assert output == 'Ahoy Captain Hook'
      finally:
          sys.stdout = saved_stdout

if __name__ == "__main__":
   unittest.main()

我检查输出是否符合预期,但测试确实没有像预期那样处理输入。我不知道我表达得是否清楚,但希望有人能帮忙。如果你需要更多细节,请告诉我。

谢谢

1 个回答

1

这个问题其实很简单。print这个函数在输出每一对参数之间会自动加一个空格,所以如果你这样写:

print("Ahoy Captain ", pirateInput)

它会输出:Ahoy Captain Hook。注意这里有两个空格,一个是你在第一个字符串后面加的,另一个是print自动加的。只要把你字符串里的那个空格去掉,就可以正常工作了。

下面是一个完整的可运行示例:

import unittest
import sys
import io
import logging

from unittest.mock import patch

def get_input():
    pirateInput = input("What be ye name?! ")
    print("Ahoy Captain", pirateInput)

class GetInputTest(unittest.TestCase):

    @patch('builtins.input', return_value='Hook')
    def test_ValuePrints(self, sth):
      log = logging.getLogger( "SomeTest.testSomething" )
      saved_stdout = sys.stdout
      try:
          out = io.StringIO()
          sys.stdout = out
          get_input()
          output = out.getvalue().strip()
          log.debug(output)
          assert output == 'Ahoy Captain Hook'
      finally:
          sys.stdout = saved_stdout

if __name__ == "__main__":
    logging.basicConfig( stream=sys.stderr )
    logging.getLogger( "SomeTest.testSomething" ).setLevel( logging.DEBUG )
    unittest.main()

测试运行:

$ python3 main.py 
DEBUG:SomeTest.testSomething:Ahoy Captain Hook
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

撰写回答