如何测试具有多个输入调用的循环?

2024-04-30

我正在尝试测试一个依赖多个用户输入来返回某个值的函数。

我已经在这里寻找了多个答案,但没有一个能够解决我的问题。我看到了参数化、模拟和猴子补丁的东西,但没有任何帮助。我认为很大程度上是因为我没有清楚地理解正在做的事情背后的概念,并且我无法适应我的问题。我看到了为此使用外部文件的建议,但我不想依赖于此。我正在尝试使用 pytest 和 python 3.7.3

我想测试的功能是这样的

def function():
    usr_input = input('please enter a number: ')
    while True:
        if int(usr_input) < 5:
            usr_input = input('please, enter a value less then 5: ')
        else:
            break
    return usr_input

我想知道当插入的值无效时如何传递两个输入值来测试函数。示例:发送值 6 和 2,断言期望值 2 并通过测试。我的其他测试如下所示:

def test_input(monkeypatch):
    monkeypatch.setattr('builtins.input', lambda x: 6)
    test = function()
    assert test == 2

但是,对于这种情况,它们会循环。是否可以仅使用参数化或其他简单代码来做到这一点?

EDIT

正如 wim 在接受的答案中指出的那样,我在“if”中添加了一个 int() ,只是为了防止未来的读者感到困惑。我假设演员阵容是可能的。


这里有两个问题,您需要将输入转换为数字,否则比较将失败,将字符串与数字进行比较:usr_input < 5。请注意,真实的input永远不会返回数字,只返回字符串。

一旦你清除了这个问题,你就可以进行猴子补丁了input具有在调用时可以返回不同值的可调用对象:

def fake_input(the_prompt):
    prompt_to_return_val = {
        'please enter a number: ': '6',
        'please, enter a value less then 5: ': '2',
    }
    val = prompt_to_return_val[the_prompt]
    return val

def test_input(monkeypatch):
    monkeypatch.setattr('builtins.input', fake_input)
    test = function()
    assert test == 2

如果你安装了插件pytest-mock https://github.com/pytest-dev/pytest-mock,您可以使用模拟 API 更轻松地完成此操作:

def test_input(mocker):
    mocker.patch('builtins.input', side_effect=["6", "2"])
    test = function()
    assert test == 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测试具有多个输入调用的循环? 的相关文章

  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • Expresso 的 Android 测试首选项片段

    我在通过 Expresso 测试我的代码时遇到问题 我写了这段代码 public class SettingsActivity extends Activity Override protected void onCreate Bundle
  • Python - 不使用复制模块的深度复制

    本质上 问题是创建一个函数 deepcopy L 它将返回列表 L 的深层副本 但是 我们被告知不要使用 copy 模块或其中的任何函数 我是入门课程的初学者 老实说我在这方面很挣扎 我们真正被告知的唯一一件事是我们应该使用递归来解决问题
  • Python 中的错误? threading.Thread.start() 并不总是返回

    我有一个很小的 Python 脚本 在我看来 threading Thread start 表现出意外 因为它不会立即返回 在线程内我想调用一个方法boost python基于对象 不会立即返回 为此 我将对象 方法包装如下 import
  • Python 3 sqlite 参数化 SQL 查询

    我一直在尝试使用 Python 3 和 sqlite 模块进行参数化 SQL 查询 并且仅使用一个变量就成功了 但是 当使用两个变量时 我得到一个IndexError tuple index out of range错误 关于导致此错误的原
  • 为什么 __instancecheck__ 没有被调用?

    我有以下 python3 代码 class BaseTypeClass type def new cls name bases namespace kwd result type new cls name bases namespace p
  • 如何在 Rails 测试中测试 params 哈希?

    以下内容会生成错误 未定义的局部变量或方法 params assert equal params recipient id users one id 如何测试参数哈希 另外 你如何测试assert redirect当存在参数时 参数附加到
  • 如果文件为空,如何跳过文件行

    python 3中的程序 这是我的第一个涉及文件的程序 我需要忽略注释行 以 开头 和空行 然后拆分这些行 以便它们可迭代 但我不断收到 IndexError 消息 指出字符串索引超出范围 并且程序在空行处崩溃 import os path
  • Django 2.0 haystack 更新索引,重建索引抛出错误

    我使用 django 2 0 和 haystack whoosh 作为搜索 我按照文档中的说明进行配置 发生的问题是当我跑步时 manage py rebuild index它显示此错误 Traceback most recent call
  • 生成二叉树的所有从根到叶的分支

    抱歉 如果这是一个常见问题 但我还没有找到适合我的特定问题的答案 我正在尝试实施一个walk方法将二叉树从根节点遍历到每个叶节点 每当到达叶节点时都会生成根到叶路径 例如 遍历表示为的二叉树 a b d c 会产生 a b c a d 我的
  • 如何修复 TypeError: G 必须是 'd' 矩阵?

    目标 尝试通过优化过程运行玩具数据集 我遇到以下错误 TypeError Traceback most recent call last
  • 有没有办法改变输入类型=“日期”格式?

    默认情况下 输入type date 显示日期为YYYY MM DD 问题是 是否可以将其格式强制为 DD MM YYYY 无法更改格式 我们必须区分有线格式和浏览器的表示格式 接线格式 The HTML5日期输入规范 https www w
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • Selenium 中的断言和验证

    有人可以解释一下断言和验证之间的区别吗 我知道验证意味着它检查它是否存在 如果不存在 则测试失败并停止在那里 正确吗 那么 即使断言失败了 断言还会继续吗 我已经阅读了文档 但仍然无法理解它 不 你已经搞反了 在 Selenium IDE
  • 如何使用 BeautifulSoup 从表中选择特定行?

    So I have a question related to a previous question but I realized I needed to go one level more to get an 11 digit NDC
  • 在 python 3 中使用子进程

    我使用 subprocess 模块在 python 3 中运行 shell 命令 这是我的代码 import subprocess filename somename py in practical i m using a real fil
  • 无故运行测试时 PyCharm 抛出“AttributeError: 'module' object has no attribute”

    因此 我有一个 Django REST Framework 项目 有一天它无法在 PyCharm 中运行测试 从命令行我可以使用它们来运行它们paver or the manage py直接地 曾经有一段时间 当我们没有在文件顶部导入类的超
  • 如何从下面的html中提取数据?

    我想要从中提取数据的 Html 是 div class infoMessageInner p span class ng binding Fiber r best lld till adressen Tj nsterna kan du be
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如

随机推荐