linux上的时间虚拟化

linux上的时间虚拟化,linux,testing,time,Linux,Testing,Time,我正在尝试测试一个严重依赖于时间的应用程序。我希望能够像在正常时间(不加速)但在任意日期/时间段运行一样执行程序 我的第一个想法是用我自己的库调用来抽象时间检索函数调用,这将允许我改变测试行为,但我想知道在不向代码库添加条件逻辑或构建二进制代码的测试变体的情况下是否可能 我真正想要的是某种局部的时域,这是否可以通过容器(比如Docker)或使用LD_PRELOAD来拦截调用 我还看到了一个补丁,它使用unshare(COL_time)将时间与系统时间断开连接,但它看起来不像这样 这似乎是一个必须

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

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

我真正想要的是某种局部的时域,这是否可以通过容器(比如Docker)或使用LD_PRELOAD来拦截调用

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

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

谢谢 AJ

在Linux上有几种查询时间的方法。阅读我至少知道

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

在Linux上有几种查询时间的方法。阅读我至少知道


因此,您可以使用来重新定义其中的每一个,例如,从秒部分(不是微秒或纳秒部分)减去固定的秒数,例如,由某个环境变量给定。作为一个起点。

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

./myprogram --debug-override-time=2014-01-01Z12:34:56
然后,在启动时,如果设置了,则从当前系统时间中减去它,并确实生成一个本地
apptime()
函数,该函数将为此更正常规系统的输出,并在代码中的任何地方调用它

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


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

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

./myprogram --debug-override-time=2014-01-01Z12:34:56
然后,在启动时,如果设置了,则从当前系统时间中减去它,并确实生成一个本地
apptime()
函数,该函数将为此更正常规系统的输出,并在代码中的任何地方调用它

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


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

您对时间的严重依赖到底是什么?你有应用程序的全部源代码吗?它是用哪种语言编写的?它是C++,我可以访问整个源代码。严重依赖性,即在代码的许多部分中,当前日期时间被检索,并且需要与为给定测试运行提供的历史数据同步。您对时间的严重依赖性到底是什么?你有应用程序的全部源代码吗?它是用哪种语言编写的?它是C++,我可以访问整个源代码。严重依赖性,在代码的许多部分中,当前日期时间被检索,并且需要与为给定测试运行提供的历史数据同步。