如何在golang中测试睡眠功能

Vru*_*shi 6 unit-testing sleep go

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

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

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

icz*_*cza 11

经过的时间:

从特定时间(start)开始经过的最简单时间是使用time.Since()返回a 的函数,该函数time.Duration有一个Duration.Seconds()以秒为单位返回持续时间的方法float64.

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

sec := time.Since(start).Seconds()
Run Code Online (Sandbox Code Playgroud)

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

在测试类似睡眠的函数时,您应该考虑到睡眠后不能保证代码会立即继续执行.例如,引用文档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")
    }
}
Run Code Online (Sandbox Code Playgroud)


jab*_*son 1

如果您使用 time.Unix() 给出自纪元(UTC 1970 年 1 月 1 日)以来的秒数,那么您的测试应该可以工作。

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

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