【Go】簡単なユニットテストのサンプルコード
更新日:2025/6/7/(土) 01:57
タグ:Go、テスト
概要
- Goのテストコードのとても簡単なサンプルコード
- テスト対象コード、テストコード、テストの実行方法を記載
サンプルコード
ディレクトリ構成など
- Goでは、
_test.go
****で終わるファイルにテストコードを書く TestXXX
****という関数名にする
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
- 失敗(
want := 10
に変更)
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
でカバレッジを出力できる
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
- if文に対するテストケースを追加すると
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