繁体   English   中英

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

[英]Emulating user input in python for testing

我编写了一个简单的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文件之外指定的,这可能会使用户感到困惑。

如果你想确认X输入结果是Y输出,那么你要找的是单元测试 ; 此方法允许您定义根据预期结果评估函数结果的函数。

模块选项:
- pytest
- unittest

首先,我想指出有很多方法可以测试你的代码,有些方法比其他方法更好,而程序员可能会因为不同的原因而倾向于每个方法。 您应该学习如何使用现有方法测试代码。 取决于代码的结构,可以利用的模式,以及您遵循的实现原则(依赖注入,mvc,mvvm等)。

至于您的具体情况,我建议您对使用用户输入的代码部分进行单元测试,并定义一组具有您可以断言的预定义输出的案例。 然后,每当编辑此分数时,使用相同的代码(可能添加案例),以确保您的程序继续流畅地工作。

使用Python的Unittest包,您可以实现一个很好的脚本,可以一致地检查您的代码并将其合并到您的项目中。 另请参阅有关单元测试的 Wikipedia页面,以了解有关您必须遵循的原则的更多信息。 您还可以查看Tensorflow的测试页面 ,了解如何在更大的项目中加入此类测试,并在您的测试中使用这些想法。

祝好运!

如果您不介意在unittests中导入unittest, python mocking raw输入,那么这里的答案应该有效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM