Python模拟:如何测试递归函数的调用次数?

2024-02-01

我有一个递归函数,位于名为的模块中test_module

import requests    

def send_msg(msg, retries=0):
    try:
        # send the message here, e.g. a http request
        response = requests.get("http://www.doesnotexist98734.com")
        # if url does not exist raise an exception
    except Exception as e:
        if retries == 0:
            raise e
        else:
            return send_msg(msg, retries=retries-1)

我的问题是如何编写一个单元测试来检查send_msg当我设置 retries = n 时,函数被调用 n 次。我正在玩模拟模块(我使用的是 python 2.7),我想我想要类似这样的东西,

import mock, unittest

class MyUnitTest(unittest.TestCase):

    @mock.patch('test_module.send_msg')
    def test_send_msg_tries_n_times(self, mock_send_msg):
        with self.assertRaises(Exception):
            mock_send_msg("hello", retries=3)
        self.assertEqual(mock_send_msg.call_count, 4) # initial call + 3 retries

然而,由于我已经模拟了该函数,它不会调用真正的函数,所以我没有得到异常,也不会递归地调用自身......


您无法模拟被测试的函数。您想要测试预期成绩,如果函数正确使用了递归,则不会。

嘲笑request.get()调用,并让它始终产生异常。然后计算你的模拟被调用的频率。

@mock.patch('requests.get')
def test_send_msg_tries_n_times(self, req_get_mock):
    req_get_mock.side_effect = Exception
    with self.assertRaises(Exception):
        send_msg("hello", retries=3)
    self.assertEqual(req_get_mock.call_count, 4)  # 1 initial call + 3 retries

如果将来您想避免使用递归并希望使用迭代,您的测试仍然可以工作,因为它验证的是行为,而不是具体的实现。您可以安全地重构被测函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python模拟:如何测试递归函数的调用次数? 的相关文章

  • 如何迭代按值排序的 Python 字典?

    我有一本字典 比如 a 6 b 1 c 2 我想迭代一下by value 不是通过键 换句话说 b 1 c 2 a 6 最直接的方法是什么 sorted dictionary items key lambda x x 1 对于那些讨厌 la
  • 仅使用堆区域的递归

    是否有仅使用堆区域的递归示例 在 C 中 基于函数调用的递归总是使用堆栈 几乎按照定义 如果您愿意将递归转换为迭代 那么可以仅使用堆空间 但这并不是真正的递归 您可以通过在堆中实现堆栈来实现这一点 某些问题可以使用尾递归 http en w
  • 如何在 pytest 中将单元测试和集成测试分开

    根据维基百科 https en wikipedia org wiki Unit testing Description和各种articles https techbeacon com devops 6 best practices inte
  • 填充两个函数之间的区域

    import matplotlib pyplot as plt import numpy as np def domain x np arange 0 10 0 001 f1 lambda x 2 x x 2 0 5 plt plot x
  • 如何计算numpy数组中元素的频率?

    我有一个 3 D numpy 数组 其中包含重复的元素 counterTraj shape 13530 1 1 例如 counterTraj 包含这样的元素 我只显示了几个元素 array 136 129 130 103 102 101 我
  • 为什么Python的curses中escape键有延迟?

    In the Python curses module I have observed that there is a roughly 1 second delay between pressing the esc key and getc
  • Pandas 数据帧到 numpy 数组 [重复]

    这个问题在这里已经有答案了 我对 Python 很陌生 经验也很少 我已经设法通过复制 粘贴和替换我拥有的数据来使一些代码正常工作 但是我一直在寻找如何从数据框中选择数据 但无法理解这些示例并替换我自己的数据 总体目标 如果有人真的可以帮助
  • 在Python中调整图像大小

    我有一张尺寸为 288 352 的图像 我想将其大小调整为 160 240 我尝试了以下代码 im imread abc png img im resize 160 240 Image ANTIALIAS 但它给出了一个错误TypeErro
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 如何从Python中的字符串中提取变量名称和值

    我有一根绳子 data var1 id 12345 name John White python中有没有办法将var1提取为python变量 更具体地说 我对字典变量感兴趣 这样我就可以获得变量的值 id和name python 这是由提供
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default

随机推荐

  • 如何管理具有不同数据库模式的git分支?

    我有一个项目 需要开发一项新功能 该功能需要重新设计部分数据库 同时保持主要开发分支在旧模式上工作 您管理此类项目的最佳实践是什么 我考虑过在开发新功能时拥有一个单独的数据库 但意识到这需要将数据库配置签入存储库 这是不行的 我还有其他方法
  • Angular2 与 Material Design Lite

    我在我的 angular2 应用程序中添加了以下代码 以帮助 MDL 在应用程序中移动时重新注册组件 ngAfterViewInit componentHandler upgradeDom 尽管它似乎工作正常 如预期 但我收到以下错误 16
  • 什么可以解释调用 free() 时的堆损坏?

    我已经调试了几天的崩溃 该崩溃发生在 OpenSSL 的深处 与维护者讨论here https www mail archive com openssl dev openssl org msg38571 html 我花了一些时间进行调查 所
  • 基本数据类型(字符串和整数)如何在 Python 和 Perl 中实现

    最近我一直想知道我对字符串和整数等基本类型执行的各种操作在性能方面如何工作 并且我认为如果我知道这些基本类型是如何实现的 即我已经听说 Python 中字符串和整数是不可变的 这是否意味着任何修改字符串中一个字符的操作都是 O n 因为必须
  • sql中的特殊字符排序

    我有名为 联系人 的表 有名为 id 和 name 的列 各列值如下所示 ID Name 1 ABC 3 DEF 2 GHI JKL null MNO null PQR 我需要查询要在顶行列出的特殊字符 如下所示 ID Name JKL 1
  • CakePHP:Ajax 请求的控制器响应错误

    我正在使用 jQuery 向某些控制器操作发出 AJAX 请求 该请求是通过同一控制器中编辑操作视图中的按钮激活的 我的问题 Ajax 请求返回编辑视图的所有代码 包含所有表单和输入 而不是预期的数量 如果我将相同的 ajax 按钮放在添加
  • javascript 在 Rails 3.1 基于资产的应用程序中包含两次

    尽管问题的标题与之前的一些问题非常相似 但我的问题似乎有所不同 简要地 第一项在 js 清单中包含两次 这是我的全部 app assets javascript application jsRails 3 1 应用程序中的文件 requir
  • iOS:UIPageViewController - 使用按钮跳转到下一页

    我在 PageViewController 中有一系列 VC 用户可以用手指从左到右导航 我需要添加按钮 这些按钮基本上执行与手指滑动相同的操作 即通过 VC 向左或向右移动 1 个 我怎样才能做到这一点 现在我正在使用这两种方法在用户滑动
  • Python pip freeze 中的三等号和 ubuntu2 是什么?

    在我的 AWS Ubuntu 14 04 实例上 我刚刚做了一个pip freeze gt requirements txt这给了我一个文件 其中还包含以下两行 python apt 0 9 3 5ubuntu2 python debian
  • PyCharm 中所有 pip 安装均“未找到匹配的发行版”

    我在 Windows 7 上运行 PyCharm Community Edition 2016 1 2 和 Python 3 4 3 并且有以下行为 在 PyCharm 中安装新包 从 设置 gt 项目解释器 失败并显示错误消息No mat
  • select from ... - 基于 JSON 格式的值

    假设我有一个数据库表 其中包含几个常见列 例如姓名 性别 年龄 此外 我还有一个附加列 使用 JSON 数据类型 可从 Postgres 9 2 获得 在 JSON 中具有任意长度和任意字段 occupation football occu
  • 当我在 youtube api 中使用 order-date 时,会出现总结果,但找不到项目

    当我在 youtube api 中使用 order date 时 会有总结果 但未找到项目 YOUR API KEY YOUR API KEY 这两个链接给出不同的结果 None
  • 通过另一个列表/数组过滤 Linq 子集合

    当我尝试根据简单值过滤子集合时 我可以通过执行以下操作轻松完成 db Table Where a gt a SubTable Any b gt b SubTableId 1 但是 当我尝试根据与其对应的值列表过滤同一个子集合时 我总是收到错
  • 我正在尝试在 angular1 项目中使用 ag-grid

    我在 Jhipster 从 Angular 1 项目开始 我对 ag grid 组件有一些问题 第一 我对所有组件使用 Bower 并在 angular js 文件之前包含我的 ag grid 文件 我想我可以通过使用覆盖来解决这个问题 但
  • 无法在 savon 调用上设置 SOAP 标头参数

    我正在使用 savon 2 2 进行 SOAP 调用 初始化 client Savon client wsdl SOAP WSDL endpoint SOAP URL 我可以像这样进行 SOAP 调用 并且效果很好 resp client
  • onBackPressed() 已弃用。还有什么选择呢?

    我已经升级了targetSdkVersion and compileSdkVersion to 33 我现在收到一条警告 告诉我按下后退 https developer android com reference android app A
  • Scala 与 Akka 中的相互身份验证

    我将使用 Akka 在 Scala 中创建一个 TLS 会话 并在客户端和服务器之间进行相互身份验证 我创建了两个 CA 证书 它们必须信任来自另一部分的相应证书 您能给我一个如何实现这一点的例子吗 谢谢 我创建了一个 github 项目
  • 如何从 PyQt 中的另一个线程访问 GUI 元素

    我正在尝试创建一个客户端 服务器应用程序 当服务器关闭时 我希望关闭在另一个线程上运行的客户端 GUI 我希望访问 GUI 并关闭 但出现 X 错误 实施不当 我该如何解决这个问题 您可以做的是当第一个线程关闭时发出自定义信号 from P
  • 当输入更改时如何运行 javascript 函数

    当用户在我的网站上创建新帐户时 我想检查该名称是否已存在 我希望当他们离开用户名输入框并输入密码时运行此检查 我试过
  • Python模拟:如何测试递归函数的调用次数?

    我有一个递归函数 位于名为的模块中test module import requests def send msg msg retries 0 try send the message here e g a http request res