どうも、Go言語勉強中のとがみんです。
テスト駆動でGo言語を勉強している際にt.Helper()という関数が出てきて、なんのための関数なのかがよくわからなかったので、この記事ではそのHelper関数についてまとめていきます。
Helper関数とは
Go言語のtestingパッケージに用意されているHelper関数は、この関数を記述しておくと、Errorを返す場合に、ファイルと行の情報の表示をスキップします。
Goでテストを実行する際に、共通のアサーションを定義することがありますが、その共通アサーションに対してこのHelper関数を使用しない場合、どのファイルのどの行でエラーが発生したのかがわかりずらくなります。
エラー発生時にどのファイルのどの行でエラーが起きたのかをわかりやすくするために、Helper関数を使用します。
次に、具体ソースコードを用いて整理していきます。
あるコードが実行される時に満たされるべき条件を記述して実行時にチェックする仕組み
Helper関数の挙動を確認する
Helper関数を使用した場合と、Helper関数を使用しなかった場合に、エラーを発生させた場合のテスト結果の出力をそれぞれ確認していきます。
Helper関数なしの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import "testing" func Add(x, y int) int { return x + y } func TestAdd(t *testing.T) { AssertEquals(t, 10, Add(1, 1)) AssertEquals(t, 10, Add(1, 2)) AssertEquals(t, 10, Add(1, 3)) } func AssertEquals(t *testing.T, expected, actual int) { if expected != actual { t.Errorf("Unexpected int\nexpected:%d, actual:%d", expected, actual) } } |
— FAIL: TestAdd (0.00s)
add_test.go:17: Unexpected int
expected:10, actual:2
add_test.go:17: Unexpected int
expected:10, actual:3
add_test.go:17: Unexpected int
expected:10, actual:4
FAIL
FAIL command-line-arguments 0.957s
FAIL
エラーが出力されたファイルと行は、AssertEquals関数内(add_test.go:17)であり、具体的にどのファイル・行でエラーが発生したかがわからなくなっています。
Helper関数ありの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import "testing" func Add(x, y int) int { return x + y } func TestAdd(t *testing.T) { AssertEquals(t, 10, Add(1, 1)) AssertEquals(t, 10, Add(1, 2)) AssertEquals(t, 10, Add(1, 3)) } func AssertEquals(t *testing.T, expected, actual int) { t.Helper() if expected != actual { t.Errorf("Unexpected int\nexpected:%d, actual:%d", expected, actual) } } |
— FAIL: TestAdd (0.00s)
add_test.go:10: Unexpected int
expected:10, actual:2
add_test.go:11: Unexpected int
expected:10, actual:3
add_test.go:12: Unexpected int
expected:10, actual:4
FAIL
FAIL command-line-arguments 0.577s
FAIL
t.Helper()を追加することによって、エラーが発生した行番号が、AssertEqualsの中身ではなく、TestAdd関数の各行番号になっていることが確認できました。
Errorを返す場合に、t.Helper()を記述した関数のファイルと行の情報の表示をスキップしていることが確認できました。
まとめ
Go言語のtestingパッケージのHelper関数について整理してきました。
エラー発生時にどのファイル、どの行番号でエラーが発生したのかをわかりやすくするためにも、共通アサーションを作成した場合は活用していくと良さそうです。