如何在不添加参数的情况下对基于时间的函数进行单元测试

2023-12-22

我创建了一个函数,该函数返回距离下次出现该时间还剩下的秒数,但我在为其编写单元测试时遇到了问题。人们如何测试这种类型的调用函数datetime.now() in it?

添加另一个参数(current_time)仅仅测试它似乎是错误的,因为它改变了函数的初始要求。

要测试的功能是。

from datetime import datetime, time, timedelta

def get_time_left(target_time):
    '''return float of number of seconds left until the target_time'''

    if not isinstance( target_time, time ):
        raise TypeError("target_time must be datetime.time")

    curr_time = datetime.now()
    target_datetime = datetime.combine( datetime.today(), target_time )
    if curr_time > target_datetime:
        target_datetime = curr_time + timedelta(1)

    seconds_left = (curr_time - target_datetime).total_seconds()

    return seconds_left

对它的测试是。

class TestDTime(unittest.TestCase):

    def test_time_left(self):
        dt_now = datetime.now()
        tm_5sec_future = ( dt_now + timedelta(0,5) ).time()
        self.assertEqual( dtime.get_time_left(tm_5sec_future), 5.0)

结果是。

======================================================================
FAIL: test_time_left (__main__.TestDTime)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/ctatest.py", line 37, in test_time_left
    self.assertEqual( dtime.get_time_left(tm_5sec_future), 5.0)
AssertionError: -4.999985 != 5.0

在不向函数添加任何参数的情况下进行单元测试的最佳方法是什么?


您需要使用模拟框架将您的 UT 与依赖项隔离,以便您的 UT 具有一致的行为。

冷冻枪 https://github.com/spulec/freezegun/#freezegun-let-your-python-tests-travel-through-time- 对于我曾经使用过的时间来说,这是一个很好的模拟库。

只需安装这个库:pip install freezegun

你的UT中使用了装饰器@freeze_time如下:

@freeze_time("2018-06-03") 
def test_time_left(self):
    dt_now = datetime.now()
    tm_5sec_future = (dt_now + timedelta(0, 5)).time()
    self.assertEqual(dtime.get_time_left(tm_5sec_future), -5.0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不添加参数的情况下对基于时间的函数进行单元测试 的相关文章

  • python 模拟第三方模块

    我正在尝试测试一些处理推文的类 我使用 Sixohsix twitter 来处理 Twitter API 我有一个类充当 Twitter 类的外观 我的想法是模拟实际的 Sixohsix 类 通过随机生成新推文或从数据库检索它们来模拟推文的
  • Python逻辑运算符优先级[重复]

    这个问题在这里已经有答案了 哪个运算符优先4 gt 5 or 3 lt 4 and 9 gt 8 这会被评估为真还是假 我知道该声明3 gt 4 or 2 lt 3 and 9 gt 10 显然应该评估为 false 但我不太确定 pyth
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • 将数据帧行转换为字典

    我有像下面的示例数据这样的数据帧 我正在尝试将数据帧中的一行转换为类似于下面所需输出的字典 但是当我使用 to dict 时 我得到了索引和列值 有谁知道如何将行转换为像所需输出那样的字典 任何提示都非常感激 Sample data pri
  • Pandas 中允许重复列

    我将一个大的 CSV 包含股票财务数据 文件分割成更小的块 CSV 文件的格式不同 像 Excel 数据透视表之类的东西 第一列的前几行包含一些标题 公司名称 ID 等在以下列中重复 因为一家公司有多个属性 而不是一家公司只有一栏 在前几行
  • 填充两个函数之间的区域

    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
  • Pandas 数据帧到 numpy 数组 [重复]

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

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • 使用 Python pandas 计算调整后的成本基础(股票买入/卖出的投资组合分析)

    我正在尝试对我的交易进行投资组合分析 并尝试计算调整后的成本基础价格 我几乎尝试了一切 但似乎没有任何效果 我能够计算调整后的数量 但无法获得调整后的购买价格有人可以帮忙吗 这是示例交易日志原始数据 import pandas as pd
  • 使用 OLS 回归预测未来值(Python、StatsModels、Pandas)

    我目前正在尝试在 Python 中实现 MLR 但不确定如何将我找到的系数应用于未来值 import pandas as pd import statsmodels formula api as sm import statsmodels
  • 在为 RXJS 可观察量编写测试时,如何避免让调度程序通过我的业务逻辑?

    我发现使某些测试通过的唯一方法是显式地将调度程序传递给函数 为了便于说明 请考虑以下函数 function doStuff stream return stream delay 100 filter x gt x 2 0 map x gt
  • 从 python 发起 SSH 隧道时出现问题

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

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • 将 matplotlib 颜色图集中在特定值上

    我正在使用 matplotlib 颜色图 seismic 绘制绘图 并且希望白色以 0 为中心 当我在不进行任何更改的情况下运行脚本时 白色从 0 下降到 10 我尝试设置 vmin 50 vmax 50 但在这种情况下我完全失去了白色 关
  • 将 JSON 对象传递给带有请求的 url

    所以 我想利用 Kenneth 的优秀请求模块 https github com kennethreitz requests 在尝试使用时偶然发现了这个问题自由库API http wiki freebase com wiki API 基本上
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • 使用 Firefox 绕过弹出窗口下载文件:Selenium Python

    我正在使用 selenium 和 python 来从中下载某些文件web page http www oceanenergyireland com testfacility corkharbour observations 我之前一直使用设
  • 迭代 my_dict.keys() 并修改字典中的值是否会使迭代器失效?

    我的例子是这样的 for my key in my dict keys my dict my key mutate 上述代码的行为是否已定义 假设my dict是一本字典并且mutate是一个改变其对象的方法 我担心的是 改变字典中的值可能
  • 当鼠标悬停在上面时,intellisense vscode 不显示参数或文档

    我正在尝试将整个工作流程从 Eclipse 和 Jupyter Notebook 迁移到 VS Code 我安装了 python 扩展 它应该带有 Intellisense 但它只是部分更糟糕 我在输入句点后收到建议 但当将鼠标悬停在其上方
  • 如何读取Python字节码?

    我很难理解 Python 的字节码及其dis module import dis def func x 1 dis dis func 上述代码在解释器中输入时会产生以下输出 0 LOAD CONST 1 1 3 STORE FAST 0 x

随机推荐

  • Mono / Ubuntu - 定义冲突

    我正在尝试在 Ubuntu 上构建一个库 Medsphere Widgets 但它抛出了一个错误 我已经进行了很好的搜索 但似乎没有人能找到答案 配置脚本工作正常 并且完成时没有警告或错误 当我去运行 make 时 它 会执行以下操作 po
  • 复制项目行为不一致?

    考虑这个目录结构 C temp A file txt C temp B 如果我运行命令 Copy Item C temp A C temp B A Recurse Force ErrorAction Stop I have C temp A
  • 如何在 Google Dialogflow Fullfilment 内联编辑器中安装 npm 包

    我想在我的聊天机器人中安装一些 npm 包 但我无法使其工作 package json 文件如下所示 name dialogflowFirebaseFulfillment description This is the default fu
  • 埃尔兰的哲学家餐厅

    如果您以前看过 哲学家就餐 那么您就会知道有几种方法可以做到这一点 我的实现创建了与消息传递进行通信的哲学家和分叉进程 我有很多关于分叉和哲学家进程格式的程序 但我自己弄清楚了 现在我将分享完成的代码 我是初学者仅供参考 祝你今天过得愉快
  • java构造函数有什么意义?

    所以我正在学习java 我已经一个月了 我刚刚了解了构造函数 但我不明白创建一个的全部目的 我为什么以及何时想要使用它 我的整体想法是它没有 main 方法 您可以从主类中调用构造函数 任何人都可以就这个话题启发我 这对我有很大帮助 构造函
  • PHP,通过POST传递数组

    这是通过以下方式发送数组的最安全的方式POST foreach id as array
  • 如何用斜杠“/”替换反斜杠“\”?

    在我的代码中我想替换反斜杠字符 通过正斜杠字符 在一个字符串中 我尝试过以下代码 string str chosen file Replace where chosen file is a string其中包含大量出现的 特点 但它似乎不起
  • 猕猴桃屏幕。我必须用 super 初始化吗?

    来自docs https kivy org docs api kivy uix screenmanager html Declare both screens class MenuScreen Screen pass class Setti
  • wsimport 不使用复杂的输入类型

    当我使用 wsimport 为某些服务生成代理时 每个端口的生成方法签名似乎没有使用 WSDL 中指定的复杂类型 但我注意到其他一些服务确实如此 多种服务都发生过这种情况 但最近的例子是亚马逊的 AWSEConsumerService 链接
  • 将 YUI3 与 HTTPS 结合使用的“正确”方法是什么?

    我对 YUI2 有丰富的经验 并且正在快速了解 YUI3 我正在编写的服务需要 HTTPS 但普通的 YUI 体验是从雅虎的 HTTP only CDN 加载的 当浏览器尝试将 HTTPS 页面与 HTTP javascript 混合时 它
  • 使用 javascript 设置响应头

    我在从应用程序中的 URL 收集 json 值时遇到问题 当我尝试获取它们时 控制台中会显示错误日志 指出 access control allow origin 不允许来源 我研究了一下 发现响应标头必须设置为 Access Contro
  • 在 iOS 5 中的地图上放置 CLPlacemark

    在 iOS 5 中 有一种转发地理编码地址的新方法 将 1 Infinite Loop CA USA 等地址转换为 lat lang 地址 有关此的更多信息请参见此处 http developer apple com library ios
  • 在 mac 中通过应用程序(.jar)读取/写入文件时出现权限被拒绝错误

    我在 swing 中创建了一个应用程序 还为同一应用程序创建了一个安装程序 安装程序和应用程序都可以在 Windows 系统上完美运行 但我的问题是 当我尝试在 mac os 中运行它时 它并不能完美地处理所有数据 我发现在我的应用程序中我
  • 在Hibernate的EmptyInterceptor中注入JPA的实体管理器

    我在数据访问层中使用 JPA 2 0 和 Hibernate 出于审计日志记录的目的 我通过在 persistence xml 中配置以下属性来使用 Hibernate 的 EmptyInterceptor
  • 向 Java 程序添加音乐/声音

    我正在制作一些迷你 java 游戏 我想知道如何向我的程序添加声音 音乐 我在 youtube 上观看了视频并按照提供的代码进行操作 但是出现以下错误 java io IOException 无法从输入流创建音频流 我注意到其他人用相同的代
  • 我应该在哪一层将两个实体连接在一起?

    我使用 Spring MVC 和常规 JDBC 我刚刚了解到我应该将业务流程分为表示层 控制器层 服务层和存储库 DAO 层 现在假设我有一个名为Person可以有多个Jobs Job它本身是另一个实体 有自己的属性 据我所知 存储库层仅管
  • 简单的数据触发器不起作用。为什么?

    我试图根据 bool 属性更改文本块的前景色 单击按钮时其值会更改 但是 由于某种原因 这不起作用 另外 我是否必须首先将 bool 属性添加到列表中 我尝试将 bool 属性直接添加到 DataContext 但这也不起作用 任何帮助 将
  • 给模板参数包起别名

    戏剧前 你好 也许这个问题是重复的 但我对模板编程相对较新 实际上我找不到simple and 简短的解决方案 gt 只找到兆字节的 roxxor 模板 magic 我不明白 与我具体而简单的问题相匹配 所以我现在感觉有点迷失 预先信息 我
  • 如果设备支持 Touch ID

    想知道如何确定用户拥有的设备是否支持 Touch ID API 希望将其作为布尔值 Thanks 尝试这个 BOOL canAuthenticateByTouchId if SYSTEM VERSION GREATER THAN OR EQ
  • 如何在不添加参数的情况下对基于时间的函数进行单元测试

    我创建了一个函数 该函数返回距离下次出现该时间还剩下的秒数 但我在为其编写单元测试时遇到了问题 人们如何测试这种类型的调用函数datetime now in it 添加另一个参数 current time 仅仅测试它似乎是错误的 因为它改变