リファクタリングとテストの関係
t-wadaさんのリファクタリングとテストの関係では、テストとリファクタリング、TDDの考え方が分かりやすく説明されている。
「動作する」を満たしてから、「きれいな」にとりかかる
- Red, Green, Refactor
- Red, Green, Commit, Refactor, Green, Commit
そのほか印象に残ったスライドを引用:
テストの目的に戻ろう
- 何のためにテストするのか
- 誰のためにテストをするのか
- テストで何を知りたいのか
テストをロールによって分類する
- Developer(Programmer) Test
- 開発者が行う、開発促進のためのテスト
- 単体、ユニット、結合 …などなど
- Customer Test
- 顧客(のロールを担うひと)が行うテスト
- 従来の「受け入れテスト」が多くを占める
- QA Test
- 品質保証のためのテスト
- 行う人は開発者かもしれないし、テスト担当者
かもしれない
それぞれのテストの目的
- Developer Test
- 開発促進
- フィードバックを伴う設計行為
- Customer Test
- 進捗管理
- 機能要件の検証
- QA Test
- 品質保証
- 非機能要件の検証
リファクタリングの目的はコードの理解や修
正が簡単になるようにすること
リファクタリングの「何のために」
- シンプル設計
- コードを理解しやすく
- コードを修正しやすく
- コードをシンプルにすること ≒ 設計をシンプルにすること
大目的「理解や修正が簡単になるように」
リファクタリングは何ではないのか
- 非公開メソッドの中だけではない
- パフォーマンスチューニングではない
- バグフィクスではない
- 他人のひどいコードの手直しではない
- 手戻りではない (Refactoring is not rework)
道はひとつではない
- 「動作する、きれいなコード」
- きれいな、から攻めるか
- 動作する、から攻めるか
リターンマッチは可能だ
- 設計の善し悪しは、最初に設計したときには決まらない
- だんだんと「より良い」設計に変えていくことが出来る
リファクタリングをサポートするテストとは何か
Developer Testを目的と粒度で分類する
- Unit Test
- テスト対象以外は全てMock
- Assembly Test
- テスト対象のコラボレータは本物を使う
- Functional Test
インタラクションベーステスト
- テスト対象のオブジェクトがコラボレータと
きちんと相互作用するかどうかを検証する
- Mockを多用する
- テストの初めでコラボレータのMockを作成
- Mockにexpectationをセット
- テストの最後でMockをverify
ステートベーステスト
- テスト対象のオブジェクトの振る舞いの事前
条件、事後条件を検証する
- setUpでデータを準備
- assertEquals等で事後条件のチェック
リファクタリングの最中には
- ステートベースのテストは失敗しない
- インタラクションベースのテストは失敗して
もいい
- 内部設計を改善するということは、オブジェクトたちの相互作用(インタラクション)も変わる可能性が高いため