如何在" Go test"上设置go超时标志。

时间:2014-07-24 09:20:26

标签: testing go

go test -timeout 99999

抛出此无意义错误

invalid value "99999" for flag -test.timeout: 
time: missing unit in duration 99999

这是一个错误吗? 我正在使用     去版本go1.3

"帮助" cli也没用。它说-test.timeout=0: if positive, sets an aggregate time limit for all tests。但是,如果你去测试-test.timeout 99999,你会得到同样的错误

 -test.timeout=0: if positive, sets an aggregate time limit for all tests

2 个答案:

答案 0 :(得分:40)

使用有效的time.ParseDuration输入。例如,

$ go test -timeout 300ms

$ go test -timeout 99999s
  

Command go

     

Testing flags

-timeout t
     

如果测试的运行时间超过tpanic

     

Package flag

     

持续时间标志接受对time.ParseDuration有效的任何输入。

     

Package time

     

func ParseDuration

func ParseDuration(s string) (Duration, error)
     

ParseDuration解析持续时间字符串。持续时间字符串是a   可能签名的十进制数序列,每个都有可选的   分数和单位后缀,例如" 300ms"," -1.5h"或" 2h45m"。有效   时间单位为" ns"," us" (或" µs")," ms"," s"," { {1}}"," m"。

答案 1 :(得分:1)

如果您只想在一次测试中使用此功能,则希望在超时时很容易失败,这是使用超时通道的一种巧妙方法。

如果我怀疑测试会超时,但我仍然希望它失败,那就是使用超时通道。

因此,假设您有代码怀疑某些goroutine会死锁,并希望确保测试无法通过该代码。

为此,我在goroutine中运行实际测试,然后主goroutine围着等待done通道完成或timeout完成。

func TestWithTimeOut(t *testing.T) {
    timeout := time.After(3 * time.Second)
    done := make(chan bool)
    go func() {
        // do your testing
        time.Sleep(5 * time.Second)
        done <- true
    }()

    select {
    case <-timeout:
        t.Fatal("Test didn't finish in time")
    case <-done:
    }
}