web-dev-qa-db-ja.com

「Go test」でgoタイムアウトフラグを設定する方法

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 -test.timeout 99999を実行すると、同じエラーが発生します

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

有効なtime.ParseDuration入力を使用してください。例えば、

$ go test -timeout 300ms

$ go test -timeout 99999s

コマンドgo

テストフラグ

-timeout t

テストの実行時間がtpanicよりも長い場合。

パッケージフラグ

期間フラグは、time.ParseDurationに有効な任意の入力を受け入れます。

パッケージ時間

func ParseDuration

func ParseDuration(s string) (Duration, error)

ParseDurationは、期間文字列を解析します。期間文字列は、符号付きの10進数のシーケンスであり、それぞれにオプションの小数部と単位接尾辞が付いています(「300ms」、「-1.5h」、「2h45m」など)。有効な時間単位は「ns」、「us」(または「µs」)、「ms」、「s」、 「m」、「h」。

46
peterSO

タイムアウトしたときに簡単に失敗したい1つのテストだけにこれが必要な場合は、タイムアウトチャネルを使用するだけで適切な方法があります。

テストがタイムアウトすると思われ、それでも失敗したい場合は、タイムアウトチャネルを使用します。

したがって、いくつかのゴルーチンがデッドロックするのではないかと疑い、テストが失敗することを確認したいコードがあるとします。

そのため、私は実際のテストをゴルーチンで実行し、メインのゴルーチンは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:
    }
}
2
Tigraine