在python中模拟用户输入以进行测试

时间:2018-09-24 16:19:47

标签: python python-3.x input

我编写了一个简单的python程序,它使用input()接收用户输入。有一些不同的命令。

我想确保所有可用命令都能按预期运行,并且该程序捕获无效命令。由于存在许多不同的命令,因此手动进行此操作非常耗时(即,启动程序并逐个输入所有命令)。 (对于所有命令的实际执行,我具有单独的测试功能,但是我正在努力寻找一种很好的方法来与input()循环一起测试此功能。)

如何在不弄乱其余代码的情况下自动化提供(预定)用户输入的过程?除了使用它来测试程序外,它还可以作为示例给用户,以查看该程序的可能用法。

我当前的解决方案是我有两个版本的main()函数,基本上这是一个无限循环,接受输入直到给出退出命令为止。第一个版本“ main()”是供使用的版本,它从input()获取输入,直到用户决定退出为止。第二个版本“ main_test()”仅用于测试,并从代码中指定的预定列表中获取输入。这可以完成工作,但是我不希望最终版本中的main_test()代码。我也不想通过添加仅用于测试的内容来“污染” main()。

def main():
    while True:
        user_input = input()
        ...
def main_test():
    test_input = [...]
    test_iter = 0
    while True:
        user_input = test_input[test_iter]
        test_iter += 1
        ...

尽管我确信必须有一种聪明的方法,但我仍无法在python中找到一种很好的方法来做到这一点。我希望不需要任何其他导入的方法。但是,如果有一种很好的方法可以执行其他导入操作,那么我就会不知所措。

无论如何,删除python,我的下一个想法是在Makefile中指定命令,在该文件中我将启动程序并提供程序文本输入,以模拟用户。这样做的主要好处是,我只需要“ main()”函数,而不必更改python代码中的任何内容。缺点是示例/测试是在* .py文件之外指定的,这可能会使用户感到困惑。

3 个答案:

答案 0 :(得分:2)

如果您希望确认X输入会导致Y输出,那么您所寻找的就是单元测试;这种方法论使您可以定义函数,以根据预期结果评估函数的结果。

模块选项:
-pytest
-unittest

答案 1 :(得分:2)

首先,我想指出的是,有许多方法可以测试您的代码,并且有些方法比其他方法更好,而每种方法由于不同的原因都可能被程序员偏爱。您应该学习如何使用现有方法测试代码。根据代码的结构,可利用的模式以及您遵循的实现原理(依赖项注入,mvc,mvvm等)。

对于您的特定案例,我建议对您使用用户输入的代码部分进行单元测试,并使用您可以断言的预定义输出定义案例集合。然后,每当编辑此分数时,都使用相同的代码(可能加上大小写),以确保您的程序继续流畅地工作。

使用Python的Unittest包,您可以实现一个不错的脚本,该脚本可以一致地检查您的代码并将其合并到您的项目中。另请参见关于{em>单元测试的Wikipedia页,以了解有关必须遵循的原则的更多信息。您也可以查看Tensorflow's testing page,了解有关如何进行此类测试的说明 在更大的项目中,并在您的想法中使用这些想法。

祝你好运!

答案 2 :(得分:1)

如果您不介意导入单元测试python mocking raw input in unittests,则这里的答案应该有效。

然后可以从您的项目中删除main_test()部分,并在测试脚本中进行处理。然后,“ return_values”对应于您的模拟输入。