CARTA HOLDINGSの成長支援制度で単体テストの考え方/使い方という本を買ってもらったので今日はなるほどと思ったポイントや感想を書いていこうと思います。読んだ順番で書いていくので実際の本の章立てとは順番が一致しませんが悪しからず。
単体テストや統合テストに対する基本的な方針や注意すべき点をまとめている良い本でした。
アンチパターン
単体テストのアンチパターンはこんな感じ
- プライベートなメソッドを直接テストしたり、テストのためにプライベートなメソッドをパブリックにしたりしてはならない。あくまでテストはWhatを検証するものであり、Howに触れてはならないから。
- 同じようにプライベートな状態をテストのためにパブリックにしてはならない。テストだからといって特別なことが許されるわけではない。
- リグレッションへの保護を失うという話もあったが具体例がなくこれはよくわからなかった。
- 重要なロジックがプライベートメソッドに埋もれている場合、パブリックにする代わりに別のクラスとして切り出してテストすること。
- プライベートな振る舞いをテストで参照したくなった場合、テスト対象のコードがクライアントからどのように使われているのかを見て検証項目を考えること。
- テストのためにif文を追加するなどプロダクションコードを変更してはいけない。プロダクションコードの保守コストが高くなるから。もしどうしても必要な場合はInterfaceを導入するなどして、影響の少ない方法を取ること。
- プロダクションコードのロジックをテストにコピペしてはいけない。テストが嘘の警告を連発するようになるから。ロジックの結果導かれる期待値だけをテストに入力すること。
- 計算とデータ取得など別の責務は別のクラスに分けること。でないとテストしにくい。(これはまんまSRP)
- 現在日時をテストで使いたい時は外部から注入すること。
統合テスト
- コントローラに相当するコードをテストする。
- ボイラープレートなどの取るに足らないコードや、過度に複雑なコードをテストしてはいけない。取るに足らないコードは検証する価値がないし、過度に複雑なコードはまずリファクタリングすべき。
単体テスト
単体テストは次の3つの性質を持っている。1つでも持っていなければそれは統合テストである。
-
1単位の振る舞いを検証すること
-
実行時間が短いこと
-
他のテストケースから隔離されて実行されること
-
アルゴリズムやドメインロジックを検証する。
-
3Aパターンを用いる(Arrage,Act,Assert)