如何为交互式文本程序编写测试?

1 投票
1 回答
692 浏览
提问于 2025-04-17 19:04

我正在尝试为一个简单的Python程序写测试(使用unittest)。这个程序是一个互动程序,具体来说,它是一个基于文本的游戏,暂时基本上是把《世界的祖尔》移植到Python上。

所以现在我想进行良好的测试驱动开发,先写一个测试,确保当用户输入命令x时,会发生y的结果。例如:当用户输入“quit”时,我希望程序能结束。我想确保这个行为是正确的。唯一的问题是,我想不出怎么在不实际在命令行输入的情况下给我的程序输入,所以我不知道该怎么写这个测试。

目前,我把程序放在了自己的线程里……我原以为这样可以让我异步地给它输入,但我还是不知道怎么做到。

有没有办法以编程的方式动态地给我的程序输入呢?……比如,使用stdin之类的?如果可以的话,我真的很困惑,希望能有个例子。

最后,如果我走错了方向,请告诉我,因为我对Python和测试驱动开发都很陌生,任何建议我都非常感激。

1 个回答

1

你可以设置一些测试,来运行程序的主函数,并从文件(或者字符串)中读取用户可能输入的数据,只需要这样设置代码:

def main(inp):
    # play game

if __name__ == '__main__':
    main(sys.stdin)

接下来,测试的过程就是创建一个输入流(可能用到一个叫 StringIO 的东西),把这个输入流传给 main 函数,然后观察输出结果。如果你担心程序会卡住,可以把它放在一个单独的线程里运行,并设置一个超时时间。

如果你想让测试更高级一点,甚至可以使用 pty 来模拟终端输入。

撰写回答