如何在“Go test”上设置go超时标志

t9aqgxwy  于 2022-12-07  发布在  Go
关注(0)|答案(3)|浏览(471)
go test -timeout 99999

抛出此无意义错误

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

是bug吗?我用的是go版本go1.3
“help”cli也没用。它说-test.timeout=0: if positive, sets an aggregate time limit for all tests。但是如果你去测试-test.timeout99999,你会得到同样的错误

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

eufgjt7s1#

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

$ go test -timeout 300ms

$ go test -timeout 99999s

Command go
测试标志

-timeout t

如果测试运行时间超过t,则panic
Package flag
持续时间标志接受对time.ParseDuration有效的任何输入。
Package time
函数分析持续时间

func ParseDuration(s string) (Duration, error)

ParseDuration分析持续时间字符串。持续时间字符串可能是十进制数字的有符号序列,每个数字都带有可选的分数和单位后缀,如“300ms“、“-1.5h“或“2h45m“。有效的时间单位为“ns“、“us“(或“第一个月9日至1x日“)、“第一个月10日至1x日“、“第一个月11日至1x日“、”第一个月12日至1x日“、“第一个月13日至1x日“。

wztqucjr

wztqucjr2#

如果你只需要一个测试,你想很容易失败时,它超时有一个巧妙的方法,只是使用超时通道。
如果我怀疑一个测试会超时,但我仍然希望它失败,就使用超时通道。
所以,假设你有一段代码,你怀疑某些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:
    }
}
9udxz4iz

9udxz4iz3#

要添加/更新Tigraineanswer,请执行以下操作:
如果你只需要一个测试,你想很容易失败时,它超时有一个巧妙的方法,只是使用超时通道。
实际上...... proposal/issue 48157 " cmd/go : add per-test timeouts",被接受并可能随Go 1.18(2022年第一季度)发布,将改变这一点。(也许Go 1.20,2022年第四季度)
测试具有整个二进制文件的总超时,但没有特定测试用例的超时。
您经常希望将任何特定的测试用例限制在比整个二进制文件短得多的时间内。
我建议在go命令的用户体验中添加每个测试(函数)超时的概念,如下所示。
1.每个测试都有一个测试超时
给定测试的计时器只在测试运行时才滴答作响。当测试在t.Parallel中被阻止时,它不会滴答作响,当它在t.Run中运行子测试时也不会滴答作响。
1.每个测试用例的默认超时时间为1分钟
如果显式指定了新的-testtimeout标志,则会设置不同的默认值。
如果省略了-testtimeout标志,但显式指定了-timeout,那么也会设置默认值。这样,如果你有一个非常长的测试并使用go test -timeout=30m,那么每种情况的超时不会在1分钟后启动并杀死它。
1.有一个新的testing.TB方法SetTimeout(d time.Duration),它允许测试设置自己的超时。
呼叫SetTimeout并不会重设计时器。如果测试执行30秒,然后呼叫t.SetTimeout(1*time.Second),它会因为逾时而被终止。子测试会继承以这种方式设定的逾时。(每个子测试都有自己的计时器。)
当测试超时发生时,整个进程仍然会被终止。对此我们无能为力。但是失败确实说明了哪个测试函数超时了。
因此,现在(2021年11月)有CL 363134,作为一个例子:

internal/fuzz:为fuzz目标的每个exec设置超时

在模糊化和最小化期间,此变更会在每次执行模糊化目的时设定10秒的逾时。
2022年10月:CL 445597也引用了它。

相关问题