【问题标题】:Time virtualisation on linuxlinux上的时间虚拟化
【发布时间】:2014-01-07 18:06:32
【问题描述】:

我正在尝试测试一个严重依赖一天中时间的应用程序。我希望能够像在正常时间(未加速)但在任意日期/时间段上运行程序一样执行程序。

我的第一个想法是用我自己的库调用来抽象时间检索函数调用,这将允许我改变测试行为,但我想知道是否可以不向我的代码库添加条件逻辑或构建测试变体的二进制。

我真正在寻找的是某种本地化的时域,这是否可以通过容器(如 Docker)或使用 LD_PRELOAD 来拦截调用?

我还看到了一个补丁,它允许使用 unshare(COL_TIME) 将时间与系统时间断开连接,但它看起来不像这样进入。

这似乎是一个以前必须解决过无数次的问题,有谁愿意分享他们的解决方案吗?

谢谢 阿杰

【问题讨论】:

  • 您对时间的严重依赖究竟是什么?你有应用程序的完整源代码吗?它是用什么语言写的?
  • 它是 c++,我可以访问整个源代码。从某种意义上说,在代码的许多部分中,正在检索当前日期时间,并且需要与为给定的测试运行提供的历史数据同步。

标签: linux testing time


【解决方案1】:

虽然替代解决方案和技巧很棒,但我认为您将一个简单的问题严重过度复杂化了。在程序中包含某些命令行开关以用于测试/评估目的是完全常见且可以接受的。我会简单地包含一个像这样接受 ISO 时间戳的命令行开关:

./myprogram --debug-override-time=2014-01-01Z12:34:56

然后在启动时,如果设置,则从当前系统时间中减去它,并确实创建一个本地 apptime() 函数来为此更正常规系统的输出,并在代码中的任何地方调用它。

这样做的最大优势在于,任何人都可以重现您的测试结果,而无需大量阅读自定义 linux 技巧,外部测试团队或擅长编码但未来的合作开发人员也是如此不是在运行时技巧。在(单元)测试时,能够通过简单的开关调用您的代码并能够测试结果与样本集是否相等是一个主要优势。

您甚至不必记录它,企业级产品中的许多生产工具都为这种“普通大众”不需要知道的行为隐藏了命令行开关。

【讨论】:

    【解决方案2】:

    几种方法可以在 Linux 上查询时间。阅读time(7);我至少知道time(2)gettimeofday(2)clock_gettime(2)

    因此,您可以使用 LD_PRELOAD tricks 将其中的每一个重新定义为例如从秒部分(不是微秒或纳秒部分)中减去固定的秒数,例如通过一些环境变量。请参阅this example 作为起点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-13
      • 2014-10-23
      • 2011-01-08
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2018-12-18
      相关资源
      最近更新 更多