いろいろ備忘録日記

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

Goメモ-421 (テストで一時ディレクトリを使いたい)(t.TempDir)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れない内にメモメモ。。。

テスト時に一時的なディレクトリが欲しくなることは結構ありますね。

testing.T.TempDir() を利用すると、一発で生成された一時ディレクトリパスが手に入るのでとても便利です。

以下の書籍で知りました。

いつも自前で生成してテストしてました・・今後はこのメソッド利用します。

サンプル

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "testing"
)

var (
    tmpDir string
)

func TestMain(m *testing.M) {
    ret := m.Run()

    // テスト終了後に一時ディレクトリが削除されているか確認
    if tmpDir != "" {
        _, err := os.Stat(tmpDir)
        fmt.Printf("[teardown] os.Stat() ==> %v", err)
    }

    os.Exit(ret)
}

func TestTempDir(t *testing.T) {
    //
    // t.TempDir() にてテスト時に利用できる一時ディレクトリの
    // パスが取得出来る。この一時ディレクトリはテスト時に作成されて
    // テスト終了後に自動的に消去される。テスト時に手動で一時ディレクトリを
    // 確保しておく手間が無くなるため、とても便利。
    //
    tmpDir = t.TempDir()
    t.Logf("tmpDir=%s", tmpDir)

    fi, err := os.Stat(tmpDir)
    t.Logf("IsDir=%v, Name=%s, Err=%v", fi.IsDir(), fi.Name(), err)

    // ディレクトリが存在しているだけでは何なので
    // 何かのファイルを書き込んでおく
    p := filepath.Join(tmpDir, "hello.txt")
    os.WriteFile(p, []byte("hello world"), 0777)

    fi, err = os.Stat(p)
    t.Logf("IsDir=%v, Name=%s, Err=%v", fi.IsDir(), fi.Name(), err)

    // t.TempDir() の呼び出しは何回でも良い
    // その度に、異なるディレクトリが返る
    for i := 0; i < 10; i++ {
        t.Logf("tmpDir=%s", t.TempDir())
    }
}

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

$ task
task: [default] go test -v .
=== RUN   TestTempDir
    main_test.go:34: tmpDir=/tmp/TestTempDir298149024/001
    main_test.go:37: IsDir=true, Name=001, Err=<nil>
    main_test.go:45: IsDir=false, Name=hello.txt, Err=<nil>
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/002
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/003
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/004
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/005
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/006
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/007
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/008
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/009
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/010
    main_test.go:50: tmpDir=/tmp/TestTempDir298149024/011
--- PASS: TestTempDir (0.00s)
PASS
[teardown] os.Stat() ==> stat /tmp/TestTempDir298149024/001: no such file or directory
ok      github.com/devlights/try-golang/examples/testing/tempdir        0.003s

参考情報

Goのおすすめ書籍


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

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