🕌

【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
GitHubで編集を提案

Discussion