用于Python中的用户输入和预期输出的单元测试

时间:2015-09-09 20:07:56

标签: python unit-testing input mocking

我在Python中进行单元测试相当新,但是做了一些,所以我理解它的基础知识。我遇到的一个问题是能够模拟输入,然后根据该模拟输入测试STDOUT。我在这篇文章中尝试了解决方案:python mocking raw input in unittests 但是用给定的方法没有找到任何成功。我的测试似乎在要求输入时被挂断了。我希望能够模拟Run模块的输入,然后能够测试STDOUT,它可以是True/False这是我的Run代码

#imports
import random

def main():
    #variables
    dolphins = random.randrange(1,11)

    guess = int(input("This is a prompt"))

    print(guess == dolphins)

这里真的很简单。这是我的Testsuite

import unittest
from unittest.mock import patch

from Run import *

class GetInputTest(unittest.TestCase):

  @patch('builtins.input', return_value=1)
  def test_answer_false(self, input):
    self.assertEqual(main(), 'False')


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

所以在这里我输入的值为1,然后在我的断言期间调用main()并期望值False但它甚至没有得到到目前为止,该程序只是持续运行,我认为因为它等待input,我可能没有正确地嘲笑它。我还尝试将builtins.input提供给@patch参数,我得到了相同的结果。

没有错误消息或追溯。希望有更多经验的人可以告诉我我做错了什么。谢谢大家提前帮助我。

1 个答案:

答案 0 :(得分:0)

您可以将main作为一个带参数的函数。

def main(args):
    ...do stuff

if __name__ == '__main__':
    args = input('Get input')
    main(args)

然后将它作为正常功能进行单元测试。

class TestMain(unittest.TestCase):
    def testmain(self):
        self.assertTrue(main(5), 'foo')

如果您仍希望在主要内容中输入输入,则需要模拟补丁input而不是main