【问题标题】:Is there a libfaketime alternative for Golang?Golang 是否有 libfaketime 替代方案?
【发布时间】:2021-03-02 03:00:43
【问题描述】:

我想自动化一些测试,我必须操纵系统时间来检查用 golang 编写的程序的身份验证行为。根据this post,libfaketime 不适用于 golang。还有另一种方法可以实现我想用 libfaketime 做的事情吗?

这是 libfaketime 在 github 上所做的说明。

libfaketime 拦截程序用于检索的各种系统调用 当前日期和时间。然后它报告修改(伪造)的日期和时间(如 由您(用户)指定)到这些程序。这意味着您可以修改 程序看到的系统时间,而无需更改系统范围内的时间。

【问题讨论】:

  • 正如how it was done for the Go playground 所见,在 Go 中伪造时间并非易事。您可能会考虑将您的设计更改为更具可测试性,以便它接受 time.Time 而不是在内部使用 time.Now()
  • 这意味着我将无法在外部调用程序和操作时间?我的测试框架是用 Java 编写的,即使我将源代码更改为接受 time.Time,我也无法从 Java 中对其进行测试。
  • 正确。如果您尝试对根据系统时钟改变其输出的二进制文件进行黑盒测试(以某种方式您不能完全忽视),那将非常非常困难。也许您可以在虚拟机中运行它,您可以在其中以某种方式操纵虚拟硬件时钟。

标签: testing go operating-system


【解决方案1】:

不,没有。

您需要使用clockwork 之类的东西(请参阅this 了解更多信息)并在代码周围显式传递“时间”实现。


更新自 2021 年 3 月 1 日起,提供更新的选项列表:

【讨论】:

  • 如果我正在为程序编写端到端测试怎么办?这意味着我将无法直接访问源代码,而是创建用户场景?
  • @emma,没办法(几乎)。原因是 libfaketime 不拦截系统调用,而是颠覆了标准 C 库中包装系统调用的功能。与 C 代码相反,大多数平台(Solaris 和 Windows 除外)上的 Go 代码直接调用内核。所以剩下的两种方法是:以某种方式弄乱内核,并测试你的程序,让它针对一个打补丁的 Go 运行时构建。后者并不像听起来那么难,但仍然是一项重大任务。
  • 我要补充一点,目前在我的 \$dayjob 中,我们正在使用 github.com/LopatkinEvgeniy/clock,因为它是我所知道的唯一能够模拟 time.Ticker 和其他计时器的包。
【解决方案2】:

this 存储库 (tkuchiki/faketime) 声称能够伪造 time.Now() 函数。我不知道这有多广泛,也没有测试过。但听起来它可能是解决您问题的方法。

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 2014-01-29
    • 2020-10-07
    • 2012-09-02
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多