【问题标题】:How to test a sleep function in golang如何在 golang 中测试睡眠功能
【发布时间】:2015-12-12 11:31:45
【问题描述】:

我已经编写了自己的睡眠函数并想对其进行测试。以下是我的代码:

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。如果有人可以帮助我,那就太好了。 谢谢:)

【问题讨论】:

  • 你需要一些时间阅读api参考。有一个类型Duration
  • 你可以弄乱持续时间,或者你可以简单地减去 int 值。 time.Now() - time.Now() 不返回 time.Second 持续时间。
  • 想知道你的睡眠功能是否通过了测试?
  • 当 time.Sleep() 可用时,为什么要创建自己的睡眠函数?

标签: unit-testing go sleep


【解决方案1】:

经过的时间:

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

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

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

现在开始测试...

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

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")
    }
}

【讨论】:

  • 这是最好的答案。我不知道Since函数。
【解决方案2】:

如果您使用 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")
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2011-02-03
    • 2021-04-12
    • 1970-01-01
    • 2023-03-10
    • 2015-09-29
    相关资源
    最近更新 更多