間違いなく良いリストです。ここにそれに関するいくつかの考えがあります:
最初にテストを記述し、次にコードを記述します。
私は、高いレベルで同意します。しかし、もっと具体的に言うと、「最初にテストを作成してから、テストに合格するのに十分なコードを作成して、繰り返します」。そうでなければ、私の単体テストは統合テストや受け入れテストのように見えるのではないかと心配しています。
依存性注入を使用してクラスを設計します。
同意しました。オブジェクトが独自の依存関係を作成する場合、それらを制御することはできません。制御の反転/依存性注入はその制御を提供し、モック/スタブなどでテスト対象のオブジェクトを分離できるようにします。これは、オブジェクトを分離してテストする方法です。
Model-View-ControllerまたはModel-View-Presenterを使用して、UIコードをその動作から分離します。
同意しました。プレゼンター/コントローラーでさえ、スタブ/モックのビューとモデルを渡すことにより、DI / IoCを使用してテストできることに注意してください。詳細については、Presenter FirstTDDをご覧ください。
静的メソッドまたはクラスを記述しないでください。
私はこれに同意するかどうかわかりません。モックを使用せずに静的メソッド/クラスを単体テストすることが可能です。だから、おそらくこれはあなたが言及したRhinoMock固有のルールの1つです。
クラスではなく、インターフェイスをプログラムします。
同意しますが、理由は少し異なります。インターフェイスは、さまざまなモックオブジェクトフレームワークのサポートだけでなく、ソフトウェア開発者に大きな柔軟性を提供します。たとえば、インターフェイスなしではDIを適切にサポートすることはできません。
外部の依存関係を分離します。
同意しました。インターフェースを使用して、(必要に応じて)独自のファサードまたはアダプターの背後に外部依存関係を非表示にします。これにより、Webサービス、キュー、データベースなど、外部の依存関係からソフトウェアを分離できます。これは、チームが依存関係(別名外部)を制御していない場合に特に重要です。
モックするメソッドを仮想としてマークします。
これがRhinoモックの制限です。モックオブジェクトフレームワークよりも手書きのスタブを好む環境では、それは必要ありません。
そして、考慮すべきいくつかの新しいポイント:
創造的なデザインパターンを使用します。これはDIに役立ちますが、そのコードを分離して、他のロジックとは独立してテストすることもできます。
BillWakeのArrange / Act / Assertテクニックを使用してテストを作成します。この手法により、必要な構成、実際にテストされているもの、および期待されるものが非常に明確になります。
自分のモック/スタブを転がすことを恐れないでください。多くの場合、モックオブジェクトフレームワークを使用すると、テストが非常に読みにくくなることがわかります。自分でローリングすることで、モック/スタブを完全に制御でき、テストを読みやすくすることができます。(前のポイントに戻って参照してください。)
単体テストからの重複を抽象基本クラス、またはセットアップ/ティアダウンメソッドにリファクタリングする誘惑を避けてください。そうすることで、単体テストを実行しようとする開発者から構成/クリーンアップコードが隠されます。この場合、重複をリファクタリングするよりも、個々のテストの明確さが重要です。
継続的インテグレーションを実装します。すべての「緑色のバー」でコードをチェックインします。ソフトウェアを構築し、すべてのチェックインで単体テストの完全なスイートを実行します。(確かに、これはそれ自体がコーディングの慣習ではありませんが、ソフトウェアをクリーンで完全に統合するための素晴らしいツールです。)