単体テストは設計を容易にするだけでなく、それが主要な利点の1つです。
テストファーストを書くことは、モジュール性とクリーンなコード構造を引き出します。
コードをテストファーストで記述すると、コード内でそれらを想定すると、特定のコードユニットの「条件」が(通常はモックまたはスタブを介して)依存関係に自然にプッシュされることがわかります。
「与えられた条件x、振る舞いyを期待する」は、しばしばスタブになりx
(これは、テストが現在のコンポーネントの振る舞いを検証する必要があるシナリオです)y
、モックになります。テストの終わり(「should return」でないy
場合)。この場合、テストは戻り値を明示的に検証するだけです。
次に、このユニットが指定されたとおりに動作したら、発見した依存関係(x
とy
)の記述に進みます。
これにより、クリーンでモジュール化されたコードを非常に簡単で自然なプロセスで書くことができます。
後でテストを書くと、コードの構造が不十分なときにわかります。
スタブやモックすることが多すぎるため、または物同士が密に結合されているために、コードの一部のテストを作成することが困難になる場合、コードを改善する必要があることがわかります。
単一ユニットに非常に多くの動作があるために「テストの変更」が負担になる場合、コードを改善する必要があることがわかります(または単にテストを書くアプローチで-しかし、これは通常私の経験では当てはまりません) 。
あなたのシナリオは、(「もしあまりにも複雑になった場合x
とy
し、z
あなたが抽象それ以上に必要があるため、あなたはあなたのコードで作る改善を持って知って、その後...」)。
重複と冗長性のために、2つの異なるフィクスチャで同じテストを行う場合、コードを改善する必要があることがわかります。
以下は、Michael Feathersによる優れた講演で、テスト可能性とコードのデザインとの非常に密接な関係を示しています(元々はコメントでdisplayNameによって投稿されました)。この講演では、一般的な優れた設計とテスト容易性に関する一般的な苦情と誤解についても取り上げています。