0Pricing
Go Academy · レッスン

テーブル駆動テスト

サブテストによるパラメーター化テスト

「テーブル駆動テスト」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

テーブル駆動テストとは

テーブル駆動テストでは、テストケース(入力と期待される出力)のスライスを定義し、1 つのテスト本体でループ処理します。重複を減らせるうえ、ケースの追加も簡単になります。

基本パターン

各ケース用の構造体を定義し、t.Run でループ処理して、ケース名とともに失敗を報告します:

tests := []struct {
    name  string
    input int
    want  int
}{
    {"zero", 0, 0},
    {"positive", 3, 9},
    {"negative", -2, 4},
}
for _, tt := range tests {
    t.Run(tt.name, func(t *testing.T) {
        got := Square(tt.input)
        if got != tt.want {
            t.Errorf("Square(%d) = %d; want %d", tt.input, got, tt.want)
        }
    })
}

匿名構造体のスライス

テストケースの型には匿名構造体を使用します。ケースの定義をテストの近くに置けるため、1 回しか使わない型に名前を付けずに済みます。

エラーケースを含める

wantErr bool フィールドを追加して、想定した状況で関数がエラーを返すことをテストします:

{"invalid input", -1, 0, true},
// in the loop:
if (err != nil) != tt.wantErr {
    t.Errorf("wantErr %v, got err %v", tt.wantErr, err)
}

サブテストの命名

説明的な name フィールドがあると、失敗の内容がひと目で分かります。-run TestFunc/case_name を使って特定のケースを実行することもできます。

t.Run による並列サブテスト

各サブテストを並列実行としてマークし、ループ変数をキャプチャしてケースを同時実行します(テストが I/O 待ちになる場合に重要です)。

for _, tt := range tests {
    tt := tt // capture
    t.Run(tt.name, func(t *testing.T) {
        t.Parallel()
        // ...
    })
}

ケースごとの共有セットアップ

tt.setup 関数フィールドを使用すると、定型コードを重複させずにケースごとのセットアップを指定できます:

type tc struct {
    setup func() *DB
    input string
    want  int
}

ケースを読みやすく保つ

ケースが大きくなった場合は、名前付き変数として定義するか、testdata ファイルから読み込みます。テーブルは簡潔に保ち、可能であれば 1 ケースを 1 行にしてください。

複数の出力をテストする

出力ごとにフィールドを追加して、複数の値を返す関数をテーブルテストします:

type tc struct {
    input     string
    wantVal   int
    wantErr   bool
}

テーブルでの Testify assert

テーブルテスト内で github.com/stretchr/testify/assert を使うと、冗長な if/t.Errorf ブロックを書かずに読みやすいアサーションを記述できます。

assert.Equal(t, tt.want, got, tt.name)

ケースによるドキュメント化

ケースのテーブルは生きたドキュメントとして機能します。将来の開発者は、サポートされているすべての入力とエッジケースをひと目で理解するために、このテーブルを参照できます。

クイックチェック

テーブル駆動テストで t.Parallel の前にループ変数(tt := tt)をキャプチャするのはなぜですか?

振り返り:テーブル駆動テスト

主なポイント:

  • 入力、期待される出力、エラーフラグを網羅する構造体のスライス
  • t.Run で名前付きの独立したサブテストとしてループ処理する
  • t.Parallel の前にループ変数(tt := tt)をキャプチャする
  • ケースはサポートされている動作を示す生きたドキュメントとして機能する

よくある質問

「テーブル駆動テスト」レッスンは無料ですか?

はい。「テーブル駆動テスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「テーブル駆動テスト」で何を学びますか?

サブテストによるパラメーター化テスト ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「テーブル駆動テスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. testingによるユニットテストの作成
  2. テーブル駆動テスト
  3. テストダブル:モックとスタブ
  4. テストカバレッジとtestify
← Go Academyに戻る