t.Run で Go のテストをサブテストに分割する

備忘録。

Go のテスト関数内でサブテストに分割する方法について。

testing.TErrorSkip などのように関数で実装しているテストの制御を行うメソッドがあるが、サブテストに分割するためのメソッド Run も実装されている。以下のように使える:

func TestFoo(t *testing.T) {
  t.Run("Sub Test 1", func (t *testing.T) {
    if foo(1, 2) != 42 {
      t.Error("foo(1, 2) is not 42")
    }
  })
}

第1引数にサブテストの名前、第2引数にサブテストの内容を関数で渡す。

これは Table Driven Test で書く場合に有効である。

for i, tt := range cases {
  // テストケースごとにサブテストにする
  t.Run(fmt.Sprintf("case %d", i), func (t *testing.T) {
    ...
  })
}

これは t.Run を使わない場合と比べて以下のメリットがある

  • 必要に応じて各ケースに名前をつけられる
  • 独立したテストになるので、どのケースが成功してどのケースが失敗したかがわかりやすい