[Translation]Golangでのテーブル駆動テスト
by Alex Pliutau 2018/08/07より翻訳
テキストリンク practice-goでは、テーブル駆動テストを使用して、可能なすべての関数使用シーンをテストすることがよくあります.例えば、
テキストリンク practice-goでは、テーブル駆動テストを使用して、可能なすべての関数使用シーンをテストすることがよくあります.例えば、
FindAnagrams()
関数は、所与の入力に対して辞書で見つかったクイズリストを返す.FindAnagrams()
関数を正しくテストするためには、空入力、有効入力、無効入力など、さまざまな状況をテストする必要があります.異なる断言を修正してテストを実現することができますが、テーブルテストを使用するのはずっと簡単です.FindAnagrams(string word) []string
これは「テーブル」のように見える関数です.var tests = []struct {
name string
word string
want []string
}{
{"empty input string", "", []string{}},
{"two anagrams", "Protectionism", []string{"Cite no imports", "Nice to imports"}},
{"input with space", "Real fun", []string{"funeral"}},
}
通常、テーブルは匿名構造体配列スライスであり、構造体を定義したり、既存の構造を使用して構造体配列宣言を行ったりすることができます.name
属性は、特定の試験例を記述するために使用される.テーブルがあれば、反復と断言を簡単に行うことができます.func TestFindAnagrams(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := FindAnagrams(tt.word)
if got != tt.want {
t.Errorf("FindAnagrams(%s) got %v, want %v", tt.word, got, tt.want)
}
})
}
}
は、t.Errorf()
関数の代わりに他の関数を使用することができ、t.Errorf()
はエラーを記録し、テストを継続するだけです.Goで人気のあるTestifyアサートパケットは、ユニットテストを明確にします.たとえば、assert.Equal(t, got, tt.want, "they should be equal")
t.Run()
はサブテストを開始し、詳細モードでテストを実行すると(go test -v
)、各サブテスト結果が表示されます.=== RUN TestFindAnagrams
=== RUN TestFindAnagrams/empty_input_string
=== RUN TestFindAnagrams/two_anagrams
=== RUN TestFindAnagrams/input_with_space`
は、Go 1.7テストパケットが(*testing.T).Parallel()
を使用してサブテストを並列に実行できるためです.パラレル化テストが意味があることを確認してください.t.Run(tt.name, func(subtest *testing.T) {
subtest.Parallel()
got := FindAnagrams(tt.word)
// assertion
})
はこのようにして、Goでテーブル駆動テストを楽しむようにしましょう.