【Go】簡単なユニットテストのサンプルコード

更新日:2025/6/7/(土) 01:57

タグ:Goテスト

概要

サンプルコード

ディレクトリ構成など

test_demo/ ├── calc.go └── calc_test.go ← テストコードはここ

calc.go

package calc func Add(a, b int) int { return a + b }

calc_test.go

package calc import "testing" func TestAdd(t *testing.T) { got := Add(2, 3) // テストしたい数値を引数に入れて実際の戻り値を受け取る want := 5 // テストしたい関数の期待値 // 実際の戻り値と期待値を比較 if got != want { t.Errorf("Add(2, 3) = %d; want %d", got, want) } }

テスト実行

go test PASS ok test_demo 0.302s
go test --- FAIL: TestAdd (0.00s) calc_test.go:10: Add(2, 3) = 5; want 10 FAIL exit status 1 FAIL test_demo 0.268s

テーブル駆動テストで複数ケースをまとめて書く

// calc_test.go func TestAddTableDriven(t *testing.T) { // テストケースの一覧(テーブル)を定義 tests := []struct { a, b int // 入力値 want int // 期待する戻り値 }{ {1, 2, 3}, // 1 + 2 = 3 {0, 0, 0}, // 0 + 0 = 0 {-1, 1, 0}, // -1 + 1 = 0 {100, 200, 300}, // 100 + 200 = 300 } // テストケースごとに繰り返し実行 for _, tt := range tests { // Add関数を実行し、結果を取得 got := Add(tt.a, tt.b) // 結果と期待値が一致しない場合はエラーを出力 if got != tt.want { t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, got, tt.want) } } }

カバレッジを出力

go test -cover PASS coverage: 100.0% of statements // 100%網羅できている ok test_demo 0.612s
// calc.go func Add(a, b int) int { if a == 10000 { fmt.Println("テストで通らないif文") return 0 } return a + b } // カバレッジが下がる // go test -cover // PASS // coverage: 66.7% of statements // ok test_demo 0.282s
func TestAddTableDriven(t *testing.T) { tests := []struct { a, b int want int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, {100, 200, 300}, {10000, 1, 0}, // ここを追加 } for _, tt := range tests { got := Add(tt.a, tt.b) if got != tt.want { t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, got, tt.want) } } } // 追加したケースにより、if文内を通るのでカバレッジが100%になる // PASS // coverage: 100.0% of statements // ok test_demo 0.217s