我有一个用Python编写的控制台程序。我想在自动测试程序中测试几个输入组合。输入通过Pythons input(...)
函数读取。
input
?答案 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()