我编写了一个简单的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文件之外指定的,这可能会使用户感到困惑。
答案 0 :(得分:2)
答案 1 :(得分:2)
首先,我想指出的是,有许多方法可以测试您的代码,并且有些方法比其他方法更好,而每种方法由于不同的原因都可能被程序员偏爱。您应该学习如何使用现有方法测试代码。根据代码的结构,可利用的模式以及您遵循的实现原理(依赖项注入,mvc,mvvm等)。
对于您的特定案例,我建议对您使用用户输入的代码部分进行单元测试,并使用您可以断言的预定义输出定义案例集合。然后,每当编辑此分数时,都使用相同的代码(可能加上大小写),以确保您的程序继续流畅地工作。
使用Python的Unittest包,您可以实现一个不错的脚本,该脚本可以一致地检查您的代码并将其合并到您的项目中。另请参见关于{em>单元测试的Wikipedia页,以了解有关必须遵循的原则的更多信息。您也可以查看Tensorflow's testing page,了解有关如何进行此类测试的说明 在更大的项目中,并在您的想法中使用这些想法。
祝你好运!
答案 2 :(得分:1)
如果您不介意导入单元测试python mocking raw input in unittests,则这里的答案应该有效。
然后可以从您的项目中删除main_test()部分,并在测试脚本中进行处理。然后,“ return_values”对应于您的模拟输入。