0

既存のコードベースのコードの一部を使用して新しい機能に取り組んでいるとします。私は自分のデザインをテストしています。そのため、フィーチャー パーツのスタブ化/モック化された共同作業者とのテストを分離しました。次に、それらがうまく連携するかどうかをテストしたいと思います。

一連の実際の依存関係をまとめて (外部システムなどを除いて) 1 つの巨大なテストを作成する必要がありますか? 言い換えれば、ストーリー全体の統合テストを作成する必要がありますか、それともいくつかの小さな部分に分割して、このストーリーの一部だけを実行して一緒に遊んでいる 3 ~ 4 個のオブジェクトをテストする必要がありますか? それから最後に、機能全体のテストを端から端まで書きます。しかし、1 つのテスト ケースでいくつのオブジェクトのコラボレーションを実行する必要があるでしょうか?

後者の場合は、セットアップを準備し (依存関係を配線し、それらの一部をスタブ化)、テスト データとすべてのテストの予想される条件を準備する必要があります。上に行くと(より多くのモジュールをより高いレベルにグループ化)、この準備ステップを何らかの方法で「複製」する必要があります。この「重複」が悪いのではないか?

以下のような「テストレベル」について話している:

---------------------------------------------------------------
| ------------------------------------
|| ------  ------                    |
|| |unit|  |unit|  units integration |
|| ------  ------                    | 
|-------------------------------------     integration of some
|                                          already integrated
|-------------------------------------     units, etc
|| ------  ------                    |
|| |unit|  |unit|  units integration |
|| ------  ------                    | 
|-------------------------------------
|---------------------------------------------------------------

また、「クラシック」(「嘲笑」ではない) TDD 実践者が言うように、私はできるだけ多くの実際の実装を使用する必要があります。しかし、3 レベルの依存関係を持ち、最後に DB または外部システムを持つオブジェクトをテストするということは、何かをスタブ/モックする必要があることを意味します。では、最後にこの重い/外部サービスのみをモックする必要がありますか?

この質問をするきっかけは、すべてのテストを維持し続けることが困難になり、どこかで失敗したと思うことです。コードに中程度の変更を加えるたびに、一連のテストが失敗します。何を間違えたのか知りたいです。

すべてのヒントと回答を前もって感謝します。

4

1 に答える 1

1

テストが非常に脆弱である理由を考えてみてください。(私の考えのいくつか..エンドツーエンドのテストに向けられていますが)。解決策を提案するには、あなたの状況に関する詳細情報が必要です。

機能が壊れている場合、テストは失敗するはずです。コードをリファクタリングした場合、つまり、動作を維持する変換を介して構造を変更した場合、テストは壊れません。

私の現在の方法は

  • 小規模で焦点を絞った超高速の単体テスト (各クラスをその依存関係から分離する場合のマイクロテスト) が多数あります。これは、テストの大部分を構成する必要があります
  • 統合テスト: ポートとアダプター (六角形) アーキテクチャーを参照してください。アプリは、データベースや Web などの外部サブシステムとインターフェイスします。アプリとサブシステムの間のポート (インターフェイス) を明確に定義します。次に、ポートにプラグインする実装がコントラクトに準拠していることを検証する統合テストを作成します (たとえば、実際の DB に対してテストすることにより、MySqlDataRepository が実際に情報を永続化できることをテストします)。これにより、MySqlDataRepository が機能することを確認します。これで、すべての単体テストが遅くなる必要はなくなりました..自信を失うことなくmockDatabaseを使用できます
  • 最後に、すべての部品が正しく接続されていることを確認するエンド ツー エンドのテストがいくつか必要です。あなたが言ったように、これらは維持するのが最も遅く、最も苦痛です。しかし、それらには価値があります。エンドツーエンドで実行する適切なテストを選択することで、メンテナンスの手間を最小限に抑えることができます。

より詳しい情報:

于 2012-06-22T11:14:26.773 に答える