【问题标题】:Checking if correct value is outputed Python unit test检查是否输出了正确的值 Python 单元测试
【发布时间】:2014-07-29 23:28:19
【问题描述】:

我试图尽可能清楚地表达标题。我是单元测试的新手,我掌握了一些更基本的断言类型,但有一个测试我还没有弄清楚。所以我让用户输入某种类型的输入,然后通过调用某种类型消息之前的变量来打印输出。这是测试套件正在测试的 py 文件

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

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

这是我的测试套件

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

所以我检查了我期望的输出,但测试确实按预期修补了输入。我不知道我是否清楚,但希望有人可以提供帮助。如果您需要更多详细信息,请告诉我。

谢谢

【问题讨论】:

  • 您的代码缺少某些部分并且语法不正确。你的GetInputTest 应该至少有一种方法...

标签: python unit-testing assertions


【解决方案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

【讨论】:

  • 太棒了!工作可爱。你能解释一下日志记录的作用吗?这是完全必要的吗?我一直在编写没有它们的单元测试,它们运行良好,那么我们从中得到什么好处?
  • 日志可以安全删除。我只是用它来打印output变量的值,但是你可以删除它。
猜你喜欢
  • 2017-03-10
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多