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

时间:2013-03-14 09:12:20

标签: python unit-testing io stdin

我试图为一个简单的Python程序编写测试(使用unittest)。这是一个交互式程序,特别是它将是一个基于文本的游戏,现在基本上是一个世界的Zuul到Python的端口。

所以现在我想进行良好的测试驱动开发并编写测试,并确保当用户输入命令x时,y结果发生。示例:当用户输入"退出"时,我希望程序结束。我想确保这种行为。唯一的问题是,我似乎无法想出一种方法来提供我自己的程序输入,而无需在shell中输入该输入,因此我无法想到如何为此编写测试。 / p>

目前,我已经将程序嵌入到自己的线程中...我认为这会允许我异步地给它输入,但我仍然不知道如何做到这一点。

有没有办法以编程方式动态提供我自己的程序输入? ...比如,使用stdin或其他什么?如果是这样,我会感到非常困惑,并希望得到一个例子。

最后,如果我在这里走错了路,请告诉我,因为我是Python和测试驱动开发的新手,我会很感激任何建议。

1 个答案:

答案 0 :(得分:1)

如果设置如下代码,您可以设置运行程序主函数的测试并读取用户从文件(或字符串)提供的输入:

def main(inp):
    # play game

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

然后测试涉及设置输入流(可能是StringIO),将其提供给main,并监视输出。如果你认为该程序可能会挂起,你可以在一个单独的线程中运行它并给它一个超时。

如果你想获得幻想,你甚至可以使用pty来模拟终端输入。