Как установить флаг тайм-аута go на "Go test"

go test -timeout 99999

вызывает эту нечувствительную ошибку

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

Это ошибка? я использую   go версия 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

Ответ 1

Используйте допустимый ввод времени. time.ParseDuration. Например,

$ go test -timeout 300ms

$ go test -timeout 99999s

Команда идти

Флаги тестирования

-timeout t

Если тест выполняется дольше, чем t, panic.

Флаг упаковки

Флаги продолжительности принимают любой ввод, действительный для time.ParseDuration. time.ParseDuration.

Время пакета

func ParseDuration

func ParseDuration(s string) (Duration, error)

ParseDuration анализирует строку продолжительности. Строка длительности является возможно подписана последовательность десятичных чисел, каждая с дополнительной фракции и суффикса единицы, такие как " 300ms ", " -1.5h " или " 2h45m ". Допустимые единицы времени: " ns ", " us " (или " µs "), " ms ", " s ", " m ", " h ".

Ответ 2

Если вам нужно это только для одного теста, который вы хотите легко потерпеть неудачу, когда он истекает, есть простой способ использовать каналы тайм-аута.

Если я подозреваю, что у теста истекло время ожидания, и я все еще хочу, чтобы он провалился, это работа с каналом тайм-аута.

Итак, представьте, что у вас есть код, в котором вы подозреваете, что некоторые goroutines будут заблокированы, и вы хотите убедиться, что ваш тест не пройден.

Для этого я запускаю реальный тест в goroutine, а основной goroutine затем бездельничает, ожидая, когда done канал завершится или timeout время 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")
        //t.Fatal("Test didn't finish in time")
    case <-done:
    }
}