如何为交互式文本程序编写测试?
我正在尝试为一个简单的Python程序写测试(使用unittest
)。这个程序是一个互动程序,具体来说,它是一个基于文本的游戏,暂时基本上是把《世界的祖尔》移植到Python上。
所以现在我想进行良好的测试驱动开发,先写一个测试,确保当用户输入命令x时,会发生y的结果。例如:当用户输入“quit”时,我希望程序能结束。我想确保这个行为是正确的。唯一的问题是,我想不出怎么在不实际在命令行输入的情况下给我的程序输入,所以我不知道该怎么写这个测试。
目前,我把程序放在了自己的线程里……我原以为这样可以让我异步地给它输入,但我还是不知道怎么做到。
有没有办法以编程的方式动态地给我的程序输入呢?……比如,使用stdin
之类的?如果可以的话,我真的很困惑,希望能有个例子。
最后,如果我走错了方向,请告诉我,因为我对Python和测试驱动开发都很陌生,任何建议我都非常感激。
1 个回答
1
你可以设置一些测试,来运行程序的主函数,并从文件(或者字符串)中读取用户可能输入的数据,只需要这样设置代码:
def main(inp):
# play game
if __name__ == '__main__':
main(sys.stdin)
接下来,测试的过程就是创建一个输入流(可能用到一个叫 StringIO
的东西),把这个输入流传给 main
函数,然后观察输出结果。如果你担心程序会卡住,可以把它放在一个单独的线程里运行,并设置一个超时时间。
如果你想让测试更高级一点,甚至可以使用 pty
来模拟终端输入。