Golang测试程序涉及时间

时间:2016-09-20 09:56:12

标签: testing go timer

有一个对象依赖于正时运行的时间。不幸的是,定时持续时间本身太长而无法实时地对其进行实际测试,并且由于对象的性质,缩短持续时间会使测试失败。

测试此类对象的最佳方法是什么?理想情况下,会有一些可以任意运行的虚拟时钟。

type Obj struct{}
func (o Obj) TimeCriticalFunc(d time.Duration) bool {
    //do stuff
    //possibly calling multiple times time.Now() or other real time related functions
}

func TestTimeCriticalFunc(t *testing.T) {
    if !Obj{}.TimeCriticalFunc(10 * 24 * time.Hour) {
        t.Fail()
    }
}

1 个答案:

答案 0 :(得分:6)

这实际上是在Andrew Gerrand的Testing Techniques talk中回答的。在你的代码中做

var (
    timeNow   = time.Now
    timeAfter = time.After
)

// ...

type Obj struct{}
func (o Obj) TimeCriticalFunc(d time.Duration) bool {
    // Call timeAfter and timeNow.
}

在你的测试中做

func TestTimeCriticalFunc(t *testing.T) {
    timeNow = func() time.Time {
        return myTime // Some time that you need
    }
    // "Redefine" timeAfter etc.
    if !Obj{}.TimeCriticalFunc(10 * 24 * time.Hour) {
        t.Fail()
    }
}