13.3 テストに事前事後の処理を追加する

テストを実行する際に、事前事後の共通処理を実行したいケースがあります。事前事後にもパターンがあり以下のように整理できます。

  1. テスト共通の実行前後

    • TestMain() 関数を利用します。 go test を実行した際、テストファイル内に TestMain() があればこれを経由して各テスト関数が順次 m.Run() で呼び出されます。ここに事前事後の処理を追加します (サンプルコードの1、6)

  2. テスト関数の実行前後

    • テスト関数内に記載します。(サンプルコード2、5)

  3. テストケースの実行前後

    • サブテスト実行内に記載します。(サンプルコード3、4)

それぞれの実装位置と実行順序は次のコードの通りです。事後処理は defer を用いることで簡潔に記述できます。

func TestMain(m *testing.M) {
	// 1. テスト全体の実行前
	setup()
	// 6. テスト全体の実行後
	defer teardown()

	m.Run()
}

func setup() {
	// setup code
}

func teardown() {
	// tear down code
}

func TestHoge(t *testing.T) {
	type args struct {
		a int
		b int
	}
	tests := []struct {
		name string
		args args
		want string
	}{
		// テストケース
	}

	// 2. テスト関数の実行前
	defer func() {
		// 5. テスト関数の実行後
	}()

	for _, tt := range tests {
		t.Run ...