是否有Golang的libfaketime替代品?

3
我想自动化一些测试,其中需要操作系统时间来检查使用golang编写的程序的身份验证行为。根据这篇文章,libfaketime不能与golang一起使用。是否有其他方法可以使用libfaketime实现我的目标?
以下是libfaketime的描述: libfaketime拦截程序用于检索当前日期和时间的各种系统调用。然后向这些程序报告修改后的(伪造的)日期和时间(由您,用户指定)。这意味着您可以修改程序看到的系统时间,而无需在整个系统范围内更改时间。

3
正如您可以从Go Playground的实现方式中看到的那样,模拟 Go 中的时间并非一项简单的任务。您可能需要考虑修改设计,使其更具可测试性,这样它就能接受time.Time而不是在内部使用time.Now() - Adrian
这意味着我将无法调用程序并从外部操作时间?我的测试框架是用Java编写的,即使我更改源代码以接受time.Time,我也无法从Java中进行测试。 - emma
如果你试图对一个二进制文件进行黑盒测试,而它的输出又根据系统时钟变化(以一种你无法完全忽略的方式),那么这将会非常非常困难。也许你可以在虚拟机中运行它,在那里你可以以某种方式操作虚拟硬件时钟。 - Adrian
2个回答

0

如果我正在为程序编写端到端测试,意味着我将无法直接访问源代码,而是创建用户场景,该怎么办? - emma
@emma,几乎没有办法。原因是libfaketime不拦截系统调用,而是破坏标准C库的函数来包装系统调用。与C代码相反,除了Solaris和Windows之外,大多数平台上的Go代码直接调用内核。因此,剩下的两种方法是:以某种方式干扰内核,并测试您的程序是否已构建为修补过的Go运行时。后者并不像听起来那么难,但仍然是一项重大任务。 - kostix
我想补充一下,目前在我的$dayjob中,我们正在使用github.com/LopatkinEvgeniy/clock,因为这是我所知道的唯一能够模拟time.Ticker和其他计时器的包。 - kostix

-1

有一个this存储库(tkuchiki/faketime),声称能够伪造time.Now()函数。我不知道它是否完全有效,也没有测试过。但是听起来可能是您问题的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接