如何在golang中测试睡眠功能

时间:2015-09-16 03:09:04

标签: unit-testing go sleep

我已经编写了自己的睡眠功能并想测试它。以下是我的代码:

func TestSleep(t *testing.T) {
    start := time.Now()
    mySleepFunction(65)
    end := time.Now()
    if (end - start) != 65 {
        t.Error("Incorrect sleep function")
    }
}

这不起作用。我正在尝试获取开始时间和结束时间,然后将其与预期时间进行比较。预计时间将以秒为单位。我尝试end.Sub(start),但这会返回1m30.0909之类的内容,而我需要90。如果有人可以帮助我会很棒。 谢谢:))

2 个答案:

答案 0 :(得分:11)

经过时间:

最容易获得自特定时间(start)以来经过的时间是使用time.Since()函数,该函数返回time.Duration,其中Duration.Seconds()方法返回以float64为单位的持续时间(秒)。

所以在你的情况下,经过的秒数:

sec := time.Since(start).Seconds()

现在开始测试......

在测试类似睡眠的函数时,您应该考虑到睡眠后不能保证代码会立即继续执行。例如,引用time.Sleep()的文档:

  

睡眠暂停当前goroutine 至少持续时间d。

因此,当为类似睡眠的函数编写测试代码时,我会像这样测试:

  • 经过的时间应该至少是指定的
  • 并允许一些错误边距。

所以例如测试它是这样的:

func TestSleep(t *testing.T) {
    const secSleep = 65.0

    start := time.Now()
    mySleepFunction(int(secSleep))
    sec := time.Since(start).Seconds()

    if sec < secSleep || sec > secSleep*1.05 {
        t.Error("Incorrect sleep function")
    }
}

答案 1 :(得分:1)

如果你使用time.Unix(),它给你自纪元(1970年1月1日,1970年)以来的秒数,那么你的测试应该有效。

func TestSleep(t *testing.T) {
    start := time.Now().Unix()
    mySleepFunction(65)
    end := time.Now().Unix()
    if (end - start) != 65{
        t.Error("Incorrect sleep function")
    }
}

目前,您的代码正在减去time.Now(),它不会返回您想要的结果。您的测试需要表示秒的简单int值。