如何为Python的输入'生成键盘输入?功能?

时间:2016-11-27 21:43:43

标签: python python-3.x testing input stdin

我有一个用Python编写的控制台程序。我想在自动测试程序中测试几个输入组合。输入通过Pythons input(...)函数读取。

  • 如何模拟键盘或任何其他输入流以将单个字符或字符串发送到input
  • 或者我是否需要用另一个连接到我的测试用例的函数替换输入?

2 个答案:

答案 0 :(得分:1)

如果那只是一个测试案例,而不是大系统的真实部分" - 这意味着您只需要将某个输入传递给命令行可执行文件(例如运行测试)并且您使用的是Unix,一种方便的方法是使用pipes

// read.py 
val = raw_input()
print 'nice', val

然后通过控制台:

$ echo "hat" | python read.py 
nice hat
Windows语法上的

little different - 应该类似于

dir> python.exe read.py < file.txt

另一种实现同样功能的hacky-simple方法是用自定义流对象替换sys.stdin

sys.stdin = StringIO.StringIO("line 1\nline 2\nline 3")

一个人应该考虑使用@erip的答案,如果这比自动化程序更大或者测试学生的话。但是,针对固定测试集​​的家庭作业。

答案 1 :(得分:1)

您可以使用unittest.mock修补函数的输出(包括流)。

#!/usr/bin/env python3

import unittest
from unittest.mock import patch

# Unit under test.
def get_input():
    my_input = input("Enter some string: ")
    if my_input == "bad":
        raise Exception("You were a bad boy...")
    return my_input

class MyTestCase(unittest.TestCase):
    # Force input to return "hello" whenever it's called in the following test
    @patch("builtins.input", return_value="hello")
    def test_input_good(self, mock_input):
        self.assertEqual(get_input(), "hello")

    # Force input to return "bad" whenever it's called in the following test
    @patch("builtins.input", return_value="bad")
    def test_input_throws_exception(self, mock_input):
        with self.assertRaises(Exception) as e:
            get_input()
            self.assertEqual(e.message, "You were a bad boy...")

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