Go のテストを testify/assert で書く

備忘録。

最近 Go のテストで使い始めたアサートライブラリについて。

Go のテストは標準の testing だけでも書けなくはないが、メッセージなど何から何まで書かないといけないのが辛い。

Behavior Driven で書くなら Gingko と Gomega の組み合わせがいいが、Table Driven で書くなら単純なアサートライブラリがほしい。ということで使い始めたのが testify/assert

テストの制御フローや実行は testing に任せつつ、各種アサートを簡単に書くことができる。

func add(x, y int) int {
  return x + y
}

func TestAdd(t *testing.T) {
  cases := []struct {
    x int
    y int
    expected int
  } {
    { 1, 2, 3 },
    { 3, 4, 7 },
  }

  // testing だけで書く場合
  for _, tt := range cases {
    t.Run(fmt.Sprintf("case(%d, %d)", tt.x, tt.y), func(t *testing.T) {
      actual := add(tt.x, tt.y)
      if actual != tt.expected {
        t.Errorf("expected: %d, actual: %d", tt.expected, tt.actual)
      }
    })
  }

  // testify/assert を使うとこうなる
  for _, tt := range cases {
    t.Run(fmt.Sprintf("case(%d, %d)", tt.x, tt.y), func(t *testing.T) {
      actual := add(tt.x, tt.y)
      assert.Equal(t, tt.expected, actual)
    })
  }
}

ひたすら if を書いたりメッセージを書かなくていいのはもちろんのこと、assert.Equal など Deep Equality で比較してくれるのでだいぶ楽になる。