いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-64 (*testing.T.Logメソッドの挙動がgo1.13とgo1.14で異なる)

概要

以下の記事で知りました。感謝 m( )m

dave.cheney.net

Go1.13のときは、t.Log() すると、テストが完了してから出力されていたのですが

Go1.14からは、バッファリングせずに即出力されるようになっているみたいですね。

準備

自分の環境は、先日 go1.14 にしてしまったので、go1.13をダウンロードして試してみます。

$ go version
go version go1.14 windows/amd64

$ cd $(go env GOPATH)
$ go get golang.org/dl/go1.13
$ go1.13 download
Downloaded   0.0% (    16384 / 133885977 bytes) ...
Downloaded   0.7% (   899869 / 133885977 bytes) ...
Downloaded   1.2% (  1669917 / 133885977 bytes) ...
・
・
・
Downloaded 100.0% (133885977 / 133885977 bytes)
Success. You may now run 'go1.13'

$ go1.13 version
go version go1.13 windows/amd64

サンプル

package testings

import (
    "fmt"
    "testing"
    "time"
)

func TestTLog(t *testing.T) {
    // ----------------------------------------------------------------------
    // t.Log() の挙動が go1.13 と go1.14 では以下のように変わっている
    //
    // [go1.13]
    //   - バッファリングされていて、テストが完了した後に出力される
    // [go1.14]
    //   - バッファリング無しで、即出力される
    //
    // REFERENCES::
    //   - https://dave.cheney.net/2020/03/10/go-test-v-streaming-output
    //   - https://devlights.hatenablog.com/entry/2019/11/07/003735
    // ----------------------------------------------------------------------
    for i := 0; i < 5; i++ {
        fmt.Printf("fmt %d\n", i)
        t.Logf("t.Log %d\n", i)

        time.Sleep(1 * time.Second)
    }

    /*
       $ go version
       go version go1.14 windows/amd64

       $ cd $(go env GOPATH)
       $ go get golang.org/dl/go1.13
       $ go1.13 download
       Downloaded   0.0% (    16384 / 133885977 bytes) ...
       Downloaded   0.7% (   899869 / 133885977 bytes) ...
       Downloaded   1.2% (  1669917 / 133885977 bytes) ...



       Downloaded 100.0% (133885977 / 133885977 bytes)
       Success. You may now run 'go1.13'

       $ go1.13 version
       go version go1.13 windows/amd64

       $ go1.13 test -v examples/basic/testings/testing_log_test.go
       === RUN   TestTLog
       fmt 0
       fmt 1
       fmt 2
       fmt 3
       fmt 4
       --- PASS: TestTLog (5.00s)
           testing_log_test.go:20: t.Log 0
           testing_log_test.go:20: t.Log 1
           testing_log_test.go:20: t.Log 2
           testing_log_test.go:20: t.Log 3
           testing_log_test.go:20: t.Log 4
       PASS
       ok      command-line-arguments  5.095s


       $ go test -v examples/basic/testings/testing_log_test.go
       === RUN   TestTLog
       fmt 0
           TestTLog: testing_log_test.go:20: t.Log 0
       fmt 1
           TestTLog: testing_log_test.go:20: t.Log 1
       fmt 2
           TestTLog: testing_log_test.go:20: t.Log 2
       fmt 3
           TestTLog: testing_log_test.go:20: t.Log 3
       fmt 4
           TestTLog: testing_log_test.go:20: t.Log 4
       --- PASS: TestTLog (5.00s)
       PASS
       ok      command-line-arguments  5.086s
   */
}

try-golang/testing_log_test.go at master · devlights/try-golang · GitHub

実行すると以下のようになります。

$ go1.13 test -v examples/basic/testings/testing_log_test.go
=== RUN   TestTLog
fmt 0
fmt 1
fmt 2
fmt 3
fmt 4
--- PASS: TestTLog (5.00s)
    testing_log_test.go:20: t.Log 0
    testing_log_test.go:20: t.Log 1
    testing_log_test.go:20: t.Log 2
    testing_log_test.go:20: t.Log 3
    testing_log_test.go:20: t.Log 4
PASS
ok      command-line-arguments  5.095s


$ go test -v examples/basic/testings/testing_log_test.go
=== RUN   TestTLog
fmt 0
    TestTLog: testing_log_test.go:20: t.Log 0
fmt 1
    TestTLog: testing_log_test.go:20: t.Log 1
fmt 2
    TestTLog: testing_log_test.go:20: t.Log 2
fmt 3
    TestTLog: testing_log_test.go:20: t.Log 3
fmt 4
    TestTLog: testing_log_test.go:20: t.Log 4
--- PASS: TestTLog (5.00s)
PASS
ok      command-line-arguments  5.086s

確かに、変わっていますね。


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com