🧪
【Go】Goのテストに入門してみた! ~テストの前処理・後処理編~
はじめに
前回は「一部のテストをスキップする方法」を見ていきました。
今回は「テストの前処理・後処理」に入門していきます!
前回の記事はこちら!
この記事でわかること
- テストの前処理・後処理の実装方法
- テストの前処理・後処理をする上での注意点
テストの前処理・後処理
テスト実行時、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() の呼び出しは必須ではなくなったため、より簡潔に書けるようになっています。
次回は「並行テスト」に入門します!
参考
Discussion