13.6 テストの落とし穴の回避

品質保証のためのテスト技法をいくつか紹介してきました。一方で、効率の悪いテストや失敗時に問題発見がすばやくできないテストを書いてしまうこともあります。また、思った通りに動かなくて正しくテストできないケースもあります。Goにはいくつかそれらを潰すための機能が提供されていたり、Tipsがあります。

Goに関係ない落とし穴も「テストアンチパターン」で検索すると、さまざまなブログ記事やプレゼンテーション資料が見つかるでしょう。興味を持ったら色々と調べてみると良いでしょう。

13.6.1 テストの分割

同じようなテストがたくさん登場する、というのは他の言語ではありますが、Goにはテーブル駆動テストがあるため、そこは問題になりにくいでしょう。しかし、このテーブル数が膨大になることがあります。あまりにもケース数が多すぎる場合は、テスト関数を分割して、テーブルも分けてしまうと良いでしょう。テーブルの中のテストコードがまったく同じだからといって1つにしなければならないということもありません。データの種別によって関数を分けたり、正常系と異常系でテストを分けても良いでしょう。

それ以外にも巨大すぎるシナリオ風テスト関数があれば小さくしていきます。あまり大きくても、エラーが発生したときに問題箇所が見つけにくくなりますし、テーブル駆動テストにしてカバレッジを上げるのも難しくなります。

13.6.2 テストの順序依存の排除

さて、テストを分割しました。しかしテストの準備コードはそのままなので、ユニットテストを順番に実行しないとパスしない、というのは良くないテストです。テストは独立して動くべきです。複数のテストをまたいで影響があるということはグローバル変数に状態が入っている可能性があり、テストの動作を追いかけるのも大変です。Go ...