この記事では、Goでテーブル駆動テストを実装する方法について解説します。
1. テーブル駆動テストとは?
テーブル駆動テストとは、テストケースを表形式で表現し、テスト関数内でそのテーブルを反復処理してテストを行う方法です。
テーブル駆動テストを使用することで、以下のメリットがあります。
- テストの再利用性が高くなる。
- テストケースを効率的に記述できる。
- 入力に対し、出力に何を期待するかが簡単に理解できる。
2. テーブルとは?
テーブル駆動テストにおけるテーブルとは、テストデータを表形式で表現するための構造体のことです。
通常、以下のような形式で定義されます。
type Test struct {
name string // テスト名
input int // 入力値
expected int // 期待値
}
この構造体を用いることで、テストケースを簡単記述することができます。
[]Test{
{"test case 1", 1, 2},
{"test case 2", 3, 4},
{"test case 3", 5, 6},
}
3. テーブル駆動テストの実装方法
テーブル駆動テストの実装方法は以下の通りです。
- テスト関数を作成する。
- テスト関数内で、テストケースを表す構造体を定義する。
- テストケースを配列として定義し、それぞれのテストケースをテーブルとして扱う。
- テーブルを反復処理して、テストを実行する。
例として、足し算を行う関数のテストを書いてみましょう。
package sum
func Sum(a, b int) int {
return a + b
}
まず、テスト構造体を作成します。
type Test struct {
name string // テスト名
input1 int // 引数1
input2 int // 引数2
expected int // 期待値
}
次に、テスト関数を作成します。
func TestSum(t *testing.T) {
tests := []Test{
{"test1", 1, 2, 3},
{"test2", 0, 0, 0},
{"test3", -1, 2, 1},
}
for _, test := range tests {
result := Sum(test.input1, test.input2)
if result != test.expected {
t.Errorf("got %d, want %d", result, test.expected)
}
}
}
このテスト関数は、テストケースを反復処理して、実際の結果が期待値と一致しているかどうかを確認しています。
もし期待値と結果が異なる場合には、t.Errorf
を用いてエラーを報告します。
テストに失敗した場合はどうなる?
t.Errorf
はアサーションではありません。
そのため、エラーがログに記録された後でも、テストは続行されます。
最後に、すべてのコードを組み合わせて、実際にテストを実行する方法を紹介します。
package sum
import "testing"
type Test struct {
name string
input1 int
input2 int
expected int
}
func TestSum(t *testing.T) {
tests := []Test{
{"test1", 1, 2, 3},
{"test2", 0, 0, 0},
{"test3", -1, 1, 0},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
result := Sum(test.input1, test.input2)
if result != test.expected {
t.Errorf("got %d, want %d", result, test.expected)
}
})
}
}
Go言語におけるテストの基本
テストファイル名は *_test.go
とし、テスト関数は Test
から始まる関数名を使用します。
テストは標準パッケージのtestingパッケージを使用して実装します。
テスト関数は、t *testing.T型の引数を受け取ります。
以下のコマンドを実行すると、テストが行われます。
$ go test
PASS
ok /path/to/package 0.042s
すべてのテストが通ると PASS と表示されます。
少なくとも1つのテストが失敗した場合には、FAIL と表示されます。
テストの詳細を見るには?
より詳細なテスト結果を確認したい場合は、 -v オプションを付けて実行することができます。
go test -v
コマンドを実行することで、テストの詳細なログが表示されます。
まとめ
最後にもう一度テーブル駆動テストを利用するメリットをあげます。
- テストの再利用性が高くなる。
- テストケースを効率的に記述できる。
- 入力に対し、出力に何を期待するかが簡単に理解できる。
この記事を通して、テーブル駆動テストを実装する方法が少しでも伝われば幸いです。
他にもMapを使用した実装やテストを並行に実行するといったこともできるので、興味がある方はぜひ調べてみてください!