【问题标题】:How to simulate change of system date/time for testing purposes?如何模拟系统日期/时间的变化以进行测试?
【发布时间】:2019-03-01 17:25:56
【问题描述】:

我使用 gitlab-ci 运行我的测试套件,在一个测试中我想模拟一个 更改系统日期(例如,后天)以查看是否 一切都按预期工作,例如:

  • redis 键被删除 (TTL)
  • 自更改日期以来,某些文件使用新的“运行编号”写入
  • 日期时间计算正常
  • ...

如何模拟系统日期/时间的更改以进行单元测试?


编辑:由于我的代码库是 Python,我找到了freezegunpython-libfatketime;前者可能可以为我的 Python 代码解决问题,而后者更强大,因为它可以拦截系统调用,所以理论上如果我在应用补丁后启动 redis,我可以使用它来测试 redis TTL。

【问题讨论】:

  • 我相信 “有这个工具吗?” 进入了离题的领域。我认为标题中的问题更适合这篇文章。

标签: linux unit-testing testing automated-tests


【解决方案1】:

您可以覆盖gettimeofdayclock_gettime 以随时返回。但是,这不会影响具有超时的 pthread 等待函数。

【讨论】:

    【解决方案2】:

    不从系统中选择日期并从可以通过脚本更改的变量中提供日期怎么样?

    【讨论】:

    • 这不适用于我正在使用的外部软件,例如 Redis:最好是更改所有应用程序的系统时间,否则对于我自己的代码,我找到了 2 个可以使用的项目(参见已编辑问题)
    【解决方案3】:

    在编写(单元)测试套件时,您需要明确定义被测系统及其边界。在这种情况下,您的应用程序属于被测系统,redis 不属于。

    不属于被测系统的东西应该被模拟。对于 python 从这里开始:https://docs.python.org/3/library/unittest.mock.html

    【讨论】:

    • 我的 Python 项目与 redis 交互,并在 redis 键上设置了一些 TTL——我想在删除一些键后测试我的软件的行为,因为达到了 TTL 限制。我认为最简单的方法是更改​​系统日期/时间,实际上 python-libfaketime 为我做到了
    • 您需要在您的测试套件中模拟 redis 连接类。您的测试套件会note测试 redis 库是否正确设置了 TTL,仅测试您的应用程序如何对其做出反应。需要明确的是:您的测试套件永远不应该与真正的 redis 数据库对话
    • 我不同意,我有一个测试redis db,我更喜欢测试真实的东西而不是嘲笑这部分
    • 那么你有一个集成测试,而不是单元测试。
    • 你是对的。我将编辑问题标题以使其更通用
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 2010-11-08
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多