在Linux上进行时间虚拟化

时间:2014-01-07 18:06:33

标签: linux testing time

我正在尝试测试一个严重依赖于时间的应用程序。我希望能够执行程序,就好像它是在正常时间(不加速)运行,而是在任意日期/时间段运行。

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

我真正想要的是某种本地化的时域,这可能是一个容器(如Docker)还是使用LD_PRELOAD来拦截这些调用?

我还看到了一个补丁,它使用unshare(COL_TIME)将系统时间与系统时间断开连接,但看起来并没有这样。

这似乎是一个必须多次解决的问题,任何人都愿意分享他们的解决方案吗?

由于 AJ

2 个答案:

答案 0 :(得分:3)

虽然替代解决方案和技巧很棒,但我认为您严重过度复杂化了一个简单的问题。在程序中包含某些命令行开关以进行测试/评估是完全普遍和可接受的。我只需要包含一个接受ISO时间戳的命令行开关:

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

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

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

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

答案 1 :(得分:1)

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

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