Time 使用golang游乐场功能在测试期间伪造时间

Time 使用golang游乐场功能在测试期间伪造时间,time,go,Time,Go,golang博客提到了两个Go功能faketime和timejump: 我感兴趣的部分是: modify scheduler condition to wait for deadlock, then: - check if timers are pending - advance clock to trigger-time of first timer 我想知道如何利用此实现使用faketime运行unittests。我指的是很多单位都在利用时间睡觉。实时测试是禁止的,因为执行时间加起来是几

golang博客提到了两个Go功能faketime和timejump:

我感兴趣的部分是:

modify scheduler condition to wait for deadlock, then:
- check if timers are pending
- advance clock to trigger-time of first timer
我想知道如何利用此实现使用faketime运行unittests。我指的是很多单位都在利用时间睡觉。实时测试是禁止的,因为执行时间加起来是几个小时。在faketime中,测试在几秒钟内运行

明确地说:我不打算也不想把运行时搞砸。我想造一个能工作的假钟

我非常确信上面提到的实现在并发情况下是正确的。如果你有一个想法,一个或两个关于如何借用这个实现并从中构建一个假时钟的技巧将是非常棒的

我的问题是基于这样一个假设:google不会接受对runtime/time的pull请求。转到将FaketTime转换为FaketTime或添加“func FaketTime(f int64){FaketTime=f}”

我的问题是基于这样一个假设:google不会接受对runtime/time的pull请求。转到将FaketTime转换为FaketTime或添加“func FaketTime(f int64){FaketTime=f}”

4年后(2019年9月),这一假设可能会受到挑战

布拉德·菲茨帕特里克:

因此,我们正在将#golang Playway从本机客户端迁移到具有gvisor下运行时faketime支持的linux/amd64二进制文件。e、 g

和():

奥斯汀的faketime#golang支持在master(1.14?)中。
请参阅它前面的两个提交(&I)

请注意,睡眠是模拟的,所有写入操作都以包含伪时间的二进制头作为前缀,从通常的Go epoch()开始

见和

背景是操场。
这是供游乐场使用的,甚至可能没有记录或支持(保持兼容)。
这样我们就可以在JavaScript中重放休眠,但在服务器端快速执行


看起来在go 1.5中,这些功能现在在go中实现(runtime/proc.go和runtime/timer.go)。补丁:这意味着要得到这个,我需要重新编译go运行时?是的,你需要重新编译运行时来颠覆时间。使用nacl构建还有其他缺点,除非您打算将其修补到标准运行时构建中。使代码更易于测试通常比弯曲运行时来测试代码更容易。另一个虚假的时间包:我仍然相信在Playerd中使用的实现是这个问题的正确解决方案。注释中的时钟(顺便说一句,还有更多)都具有相同的属性:它们无法实现我的问题中引用的博客文章中描述的死锁技巧。