thelper はテストヘルパー関数で t.Helper() の呼び出しや引数の一貫性をチェックするツールです。
解決する問題
テストヘルパー関数に t.Helper() がないと、テスト失敗時のエラーメッセージがヘルパー関数内の行を指してしまい、実際にどのテストケースが失敗したのか特定しにくくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| func assertEqualName(t *testing.T, got, want string) { if got != want { t.Errorf("name = %q, want %q", got, want) } }
func TestUser(t *testing.T) { u := NewUser("Alice") assertEqualName(t, u.Name(), "Bob") }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| func assertEqualName(t *testing.T, got, want string) { t.Helper() if got != want { t.Errorf("name = %q, want %q", got, want) } }
func TestUser(t *testing.T) { u := NewUser("Alice") assertEqualName(t, u.Name(), "Bob") }
|
設定
公式ドキュメント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| version: "2"
linters: enable: - thelper settings: thelper: test: first: true name: true begin: true benchmark: first: true name: true begin: true
|
オプション
test(*testing.T)、benchmark(*testing.B)、tb(testing.TB)、fuzz(*testing.F)の各カテゴリに同じオプションがあります。
| オプション |
型 |
デフォルト |
説明 |
first |
bool |
true |
*testing.T 等が最初の引数であることをチェックする |
name |
bool |
true |
引数名が t(b、tb、f)であることをチェックする |
begin |
bool |
true |
関数の先頭で t.Helper() が呼ばれていることをチェックする |
サンプル
検出例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
func setupTestDB(t *testing.T) *sql.DB { db, err := sql.Open("postgres", testDSN) if err != nil { t.Fatal(err) } return db }
func createUser(name string, t *testing.T) { t.Helper() }
func deleteUser(tt *testing.T, id string) { tt.Helper() }
|
修正例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| func setupTestDB(t *testing.T) *sql.DB { t.Helper()
db, err := sql.Open("postgres", testDSN) if err != nil { t.Fatal(err) } t.Cleanup(func() { if err := db.Close(); err != nil { t.Errorf("close db: %v", err) } }) return db }
func createUser(t *testing.T, name string) *User { t.Helper()
u, err := NewUser(name) if err != nil { t.Fatal(err) } return u }
|
注意点
t.Helper() は関数の最初の文として記述する。条件分岐の後に置くと一部のパスで効果がなくなる
- ベンチマークヘルパーでは
b.Helper() を同様に呼ぶ
testing.TB インターフェースを使うと *testing.T と *testing.B の両方で使えるヘルパーを作成できる
参考リンク