単体テストの考え方/使い方
こんにちは、技術部のYです。 単体テストの考え方/使い方という本を読んだので、第一部のまとめと感想です。
第1部 単体テストとは
第1章 なぜ、単体テストを行うのか?
- 単体テストの目標は、ソフトウェア開発プロジェクトの成長を持続可能なものにすること。
- 質の良いテストケースで構成されたテストスイート[^1]があることで、プロダクションコードに変更を加えても退行が発生しないことに確信を持てるようになる。
- 結果、機能追加やリファクタリングを簡単に行え、開発スピードを長く維持できる。
- 単体テストを単に作成できるだけでなく、良い単体テストを作成できることが重要である。
- 悪い単体テストを書いていると、開発にかかるコストが増えていき、テストがない場合と実質的に変わらなくなってしまう。
- 悪い単体テストを書いていると、開発にかかるコストが増えていき、テストがない場合と実質的に変わらなくなってしまう。
- 優れたテストスイートの特徴
- テストすることが開発サイクルの中に組み込まれている。
- コードベースの特に重要な部分のみがテスト対象となっている。
- 費やした時間に対して価値が最も効果的に返ってくるのはビジネスロジックを含むドメインモデルのコード
- 最小限の保守コストで最大限の価値を生み出すようになっている。
第2章 単体テストとは何か?
- 単体テストとして定義されるテストは、以下の3つの重要な性質をすべて備えている。
- 「単体」と呼ばれる少量のコードを検証する。
- 実行時間が短い。
- 隔離された状態で実行される。
- 「単体」と「隔離」の解釈の違いにより、2つの学派が存在する。
単体の意味 | 隔離対象 | テストダブル[^3]の置き換え対象 | |
---|---|---|---|
古典学派 | 1つの振る舞い | テストケース | 他のテストケースの実行に影響のある共有依存[^2] |
ロンドン学派 | 1つのクラス | 単体 | 不変依存[^4]を除く全ての依存 |
- 著者は古典学派のスタイルを好んでいて、本書では古典学派の定義を採用している
- テスト対象の焦点をクラスに当てるのは間違っていて、1単位の振る舞いに焦点を当てなければいけない。
- また、ロンドン学派のスタイルだと単体テストがテスト対象の内部的なコードと密接に結びつく傾向があるため、賛同できない。
3章 単体テストの構造的解析
- AAAパターンという単体テストの構造を用いることで、全てのテストケースに対して簡潔で統一された構造を持たせることができる。また、この構造に慣れることで読みやすさが向上し、保守コストを下げることにつながる。
- 準備フェーズ(Arrange)フェーズ...ケースの事前条件を満たすように、テスト対象システムとその依存の状態を設定するフェーズ
- 実行(Act)フェーズ...テスト対象の振る舞いを実行するフェーズ
- 確認(Assert)フェーズ...実行した結果が想定した結果であることを確認するフェーズ
- 1つのテストケースの中に同じフェーズが複数ある場合、多くのことを検証しようとしている。
- 単体テストは1つの振る舞いを検証するものであるため、ケースを分割する必要がある。
- 単体テストは1つの振る舞いを検証するものであるため、ケースを分割する必要がある。
- 以下の指針を守ることで可読性のあるテストメソッド名をつけれるようになる。
- 厳密な命名規則に縛られないようにする。
- 問題領域に精通している非開発者に対しても、検証内容が伝わる名前をつける。
- 英語の場合はアンダースコア(_)を使って単語を区切る。
まとめ
テストの重要さや、目的をあらためて学ぶことができて良かったです。 また、実際にプロダクションコードをテストしやく変更する実例ものっていて勉強になりました。
最後までお読みいただきありがとうございました!
関連記事
- 2023-05-30
- テクノロジー