🧪

自動テストを整理する

2023/07/18に公開

はじめに

本記事は、『初めての自動テスト - Webシステムのための自動テスト基礎』で紹介されているテストを整理するアイディアをまとめたものです。

初めての自動テスト - Webシステムのための自動テスト基礎

テストの整理により実現したいこと

  • 新しいテストを簡単に追加できること。
  • 既存のテストをシンプルで理解しやすい状態に保つこと。
  • テストを見返すたびに、内容の把握に頭を悩ませずに済むようにすること。

テストが整理された状態を保つ2つのテクニック

  • テストを分離する
  • コンテキストによってテストを分類する

テストが整理された状態を保つテクニックその1 - テストを分離する

テストを分離するとは

「テストを分離する」とは、テストコードを書く際に1度にテストする内容を、1つ、もしくはひとまとまりの概念に限るという意味である。言い換えると、テストの対象を絞り、一度に多くの内容をテストしないということである。

1つのテストケースに対するアサーション数

1つのテストケースで1つのアサーションを行うテストは、読みやすく、理解しやすく、保守もたやすい。また、小さいサイズで対象を絞ったテストを多く作成することができる。
しかし、1つのテストケースにつき、1つのアサーションを行うというのは、目標としては妥当であるが、強い制約ではない。複数のアサーションを行う必要があれば、行っても構わない。
重要なことは、1つのテストにつき、テストする内容が1つであるという考え。この考えに従えば、自ずと各テストケースに多くのアサーションは含まれなくなり、テストコードも読みやすくなる。

テストデータをどこで定義するか

経験則として「データは可能な限り、そのデータを使用するテストケースに近いところにまとめる。」がある。
これに従えば、特定のテストケースでしか使用しないデータであれば、使用するテストケースのメソッド内で定義する。もし他のテストケースで使用するようになった場合は、その時点でテスト実行前に処理されるセットアップのような場所に定義を移動する。必要になるまでは、定義を移動させない。

テストが整理された状態を保つテクニックその2 - コンテキストによってテストを分類する

  • 似ているものはまとめる
    類似性に注目して、似ているものは、一箇所にまとめる。並び替える。
    テスト内容の把握の負荷が減る。分類の意図を明示的にするためにコメントを残す。
  • コンテキストを明示的にする
    テスト名に共通する語句が含まれる場合は、クラス名等などの上位レベルの名前にその語句を含める。
    これによりテストのコンテキストが明示的になる。
    例えばクラス名前で明確にされていれば、それを見ただけで、このクラスのテストケースはすべて同様の観点のテストであること、そして同様の観点のテストを追加したい場合は、このクラスに追加すればよいことが理解できる。

テストの整理による効果

テストを整理すると、テストが読みやすくなるだけでなく、次のような効果もある。

  • 不具合の起きている箇所を特定しやすくなる。
  • テストのパターンを見つけやすくなる。
  • 漏れているテストケースを見つけやすくなる。

テストを整理しはじめるにあたって

  • 最初から、完璧にテストを整理しておく必要はない。はじめはシンプルにテストのまとまりごとにファイルを分けるだけで十分。複雑なことに挑戦する必要はない。
  • 「選択肢」を意識する。テストスイートが大きくなるにつれて、それまで以上に整理する方法が見えてくるはず。数多くの実験をし、挑戦を重ねることで、経験を積むことが大切。

GitHubで編集を提案

Discussion