既存のコードベースのコードの一部を使用して新しい機能に取り組んでいるとします。私は自分のデザインをテストしています。そのため、フィーチャー パーツのスタブ化/モック化された共同作業者とのテストを分離しました。次に、それらがうまく連携するかどうかをテストしたいと思います。
一連の実際の依存関係をまとめて (外部システムなどを除いて) 1 つの巨大なテストを作成する必要がありますか? 言い換えれば、ストーリー全体の統合テストを作成する必要がありますか、それともいくつかの小さな部分に分割して、このストーリーの一部だけを実行して一緒に遊んでいる 3 ~ 4 個のオブジェクトをテストする必要がありますか? それから最後に、機能全体のテストを端から端まで書きます。しかし、1 つのテスト ケースでいくつのオブジェクトのコラボレーションを実行する必要があるでしょうか?
後者の場合は、セットアップを準備し (依存関係を配線し、それらの一部をスタブ化)、テスト データとすべてのテストの予想される条件を準備する必要があります。上に行くと(より多くのモジュールをより高いレベルにグループ化)、この準備ステップを何らかの方法で「複製」する必要があります。この「重複」が悪いのではないか?
以下のような「テストレベル」について話している:
---------------------------------------------------------------
| ------------------------------------
|| ------ ------ |
|| |unit| |unit| units integration |
|| ------ ------ |
|------------------------------------- integration of some
| already integrated
|------------------------------------- units, etc
|| ------ ------ |
|| |unit| |unit| units integration |
|| ------ ------ |
|-------------------------------------
|---------------------------------------------------------------
また、「クラシック」(「嘲笑」ではない) TDD 実践者が言うように、私はできるだけ多くの実際の実装を使用する必要があります。しかし、3 レベルの依存関係を持ち、最後に DB または外部システムを持つオブジェクトをテストするということは、何かをスタブ/モックする必要があることを意味します。では、最後にこの重い/外部サービスのみをモックする必要がありますか?
この質問をするきっかけは、すべてのテストを維持し続けることが困難になり、どこかで失敗したと思うことです。コードに中程度の変更を加えるたびに、一連のテストが失敗します。何を間違えたのか知りたいです。
すべてのヒントと回答を前もって感謝します。