我正在尝试测试一个严重依赖一天中的时间的应用程序。我希望能够像在正常时间(未加速)但在任意日期/时间段内运行一样执行程序。
我的第一个想法是用我自己的库调用来抽象时间检索函数调用,这将允许我改变测试行为,但我想知道是否可以不向我的代码库添加条件逻辑或构建测试变体的二进制文件。
我真正在寻找的是某种本地化时间域,这是否可以通过容器(如 Docker)或使用 LD_PRELOAD 来拦截调用?
我还看到了一个补丁,可以使用 unshare(COL_TIME) 使时间与系统时间断开连接,但它看起来不像这个。
这似乎是一个已经解决了无数次的问题,有人愿意分享他们的解决方案吗?
谢谢 阿杰
最佳答案
虽然替代解决方案和技巧很棒,但我认为您将一个简单的问题严重地过度复杂化了。出于测试/评估目的,在程序中包含某些命令行开关是完全常见且可以接受的。我会简单地包含一个像这样的接受 ISO 时间戳的命令行开关:
./myprogram --debug-override-time=2014-01-01Z12:34:56
然后在启动时,如果已设置,则从当前系统时间中减去它,并且确实创建一个本地 apptime()
函数来为此更正常规系统的输出,并在您的任何地方调用它代码代替。
这样做的最大优势是任何人都可以重现您的测试结果,而无需大量阅读自定义 linux 技巧,外部测试团队或擅长编码但 future 的合作开发人员也可以重现您的测试结果不是在运行时技巧。在进行(单元)测试时,能够通过简单的开关调用您的代码并能够测试结果是否与样本集相等是一个主要优势。
您甚至不必记录它,许多企业级产品中的生产工具都针对这种“公众”不需要知道的行为隐藏了命令行开关。
关于linux - Linux 上的时间虚拟化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20978692/