🕌
【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
Discussion