🧪

【Go】Goのテストに入門してみた! ~テストの前処理・後処理編~

に公開

はじめに

前回は「一部のテストをスキップする方法」を見ていきました。
今回は「テストの前処理・後処理」に入門していきます!

前回の記事はこちら!
https://zenn.dev/tmyhrn/articles/cc14d4e12232c2

この記事でわかること

  • テストの前処理・後処理の実装方法
  • テストの前処理・後処理をする上での注意点

テストの前処理・後処理

テスト実行時、DB接続や環境変数設定など、事前・事後に処理しておきたいことがあると思います。
そんなときGoでは、以下のように実装することができます。

main_test.go
package main

import (
    "log"
    "testing"
    "unicode/utf8"
)

func TestMain(m *testing.M) {
    // 事前処理
    log.Println("テストを開始します。")
    // テスト実行
    m.Run()
    // 事後処理
    log.Println("テストを終了します。")
}

func Length(s string) int {
    return utf8.RuneCountInString(s)
}

func TestLength(t *testing.T) {
    if got := Length("Hello"); got != 5 {
        t.Errorf("Length(\"Hello\") = %d; want 5", got)
    }
}

1. TestMainを使う

前処理・後処理を行うためには TestMain を使います。
引数には m *testing.M を渡します。

2. m.Run()でテストを実行

m.Run() でテストを実行します。
m.Run() の前後に実装しておきたい処理を定義します。

3. os.Exit()は呼ばなくてよくなった

2020年8月11日リリースのGo 1.15以降、TestMain終了後に os.Exit() を明示的に呼び出す必要がなくなりました。
リリースノートにも呼び出さなくていい旨が書かれています。

A TestMain function is no longer required to call os.Exit. If a TestMain function returns, the test binary will call os.Exit with the value returned by m.Run.

テストを実行すると、以下のような結果が得られます。

ターミナル
# go test -v

2025/08/02 14:56:24 テストを開始します。
=== RUN   TestLength
--- PASS: TestLength (0.00s)
PASS
2025/08/02 14:56:24 テストを終了します。
ok      go-test-practice        0.572s

まとめ

今回は「テストの前処理・後処理」について学びました。

TestMain を使うことで、テストの前処理・後処理を簡単に追加できます。
DB接続や環境変数設定など、全テスト共通の初期化処理に便利です。
また、Go1.15以降では os.Exit() の呼び出しは必須ではなくなったため、より簡潔に書けるようになっています。

次回は「並行テスト」に入門します!

参考

https://go.dev/doc/go1.15#testingpkgtesting
https://future-architect.github.io/articles/20250509a/#テストの前処理や後処理を実施したい
https://zenn.dev/rescuenow/articles/7a145705df1f1d#テストケース全体での前後処理
https://qiita.com/hgsgtk/items/40e63150affed01f6573

Discussion