テーブル駆動テスト
サブテストによるパラメーター化テスト
「テーブル駆動テスト」は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フィードバックを取得できます。ローカル設定は不要です。