5

テストに導かれた成長するオブジェクト指向ソフトウェアを読んで、テストの分離とテストの脆弱性について学びました。各テストはコードまたは機能の一部に固有のものである必要があり、テストによるコード カバレッジの重複は最小限に抑える必要があるという考え。コードを変更するたびに 1 つのテストだけが壊れるという暗黙の理想。1 つの変更が原因であり、それがテストの変更によって修正されるかどうかを確認するために、複数の壊れたテストに時間を費やすことを避けます。

これは、単体テストには十分に簡単に思えますが、その性質上、非常に分離されています。ただし、統合テストによって示される場合、特に単体テストに加えて実行される場合、複数のテストが同じコード パスを実行することを避けるのは難しいようです。

私の質問は、統合テストを行うときにどの依存関係をモックする必要があるのですか? 何かを嘲笑する必要がありますか?単一の実行パスをテストし、このコード パスに直接関連しないすべての副作用をモックする必要がありますか?

ペアワイズ統合テストを行うというアイデアをいじっています。2 つのオブジェクト間の 1 つの関係をテストし、他のすべてをモックします。次に、これらのオブジェクトのいずれかの変更は、ペアによるエンドツーエンド テストの完全なチェーンを形成することに加えて、他の統合テストへの影響を最小限に抑える必要があります。

情報をありがとう..

編集:明確にするために、私は基本的に「通常の開発過程で多数の統合テストの失敗を回避するにはどうすればよいですか?」と尋ねています。これは、モックを使用することで達成されると思います。また、何をモックするかについて尋ねた理由。

更新: JBRainsberger による統合テストに関する非常に興味深い講演を見つけました。これは、おそらく少し物議をかもしているとしても、これにかなりよく答えていると思います。タイトルは「統合テストは詐欺です」なので、ご想像のとおり、彼は統合テスト (エンド ツー エンド タイプのテスト) をまったく提唱していません。議論は、統合テストは可能な相互作用を徹底的にテストするために必要な量を常にはるかに下回り(組み合わせ爆発による)、誤った信頼を与える可能性があるというものです. 代わりに、彼はコラボレーション テストとコントラクト テストと呼んでいるものを推奨しています。これは 90 分間の講演で、残念ながらホワイトボードはあまり明確ではなく、コード例もありません。そのため、まだ頭を悩ませています。分かりやすい説明ができたらここに書きます!他の誰かが私を打ち負かさない限り..

コントラクト テストの概要を次に示します。Design by Contract タイプのアサーションのように聞こえますが、これは C++ の非仮想インターフェイス パターンで実装できる/実装されると思います。

http://thecodewhisperer.tumblr.com/post/1325859246/in-brief-contract-tests

統合テストは詐欺のビデオ トークです: http://www.infoq.com/presentations/integration-tests-scam

概要:

統合テストは詐欺です。おそらく、徹底的にテストする必要がある統合テストの 2 ~ 5% を作成しているでしょう。おそらく、いたるところに単体テストを複製しているでしょう。統合テストは、おそらくあちこちで重複しています。統合テストが失敗した場合、何が壊れているのか誰にもわかりません。問題を解決する 2 つの攻撃 (コラボレーション テストとコントラクト テスト) を学びます。

4

4 に答える 4

2

統合テストでは、テストを機能させるために最小限の依存関係をモックする必要がありますが、少なくはなりません :-)

システムへのコンポーネントの統合は明らかに統合テスト中にテストしたいものであるため、可能な限り実際の実装を使用する必要があります。ただし、たとえば、統合テストでユーザーへのメール送信を開始したくないため、明らかにモックしたいコンポーネントがいくつかあります。これらの依存関係をモックしない場合、明らかにモックが少なすぎます。

これは、統合テストでメールを送信することを許可してはならないという意味ではありませんが、少なくとも、メール コンポーネントを内部テスト メール ボックスにのみメールを送信するコンポーネントに置き換えたいと考えています。

于 2013-07-26T11:14:39.213 に答える
1

ユニットテストにはモックオブジェクトが必要ですが、統合テストにはモックがあったとしてもほとんどありません (そうでなければ、何が統合されているのでしょうか?) ペアワイズモックを行うのはやり過ぎだと思います。これにより、それぞれに長い時間がかかる可能性のあるテストが急増し、要件が変更されたり、後で新しい機能が追加されたりした場合に変更するのが面倒な大量のコピー アンド ペースト コードが発生します。

統合テストにモックを入れなくてもいいと思います。単体テストですべてをモックして、個々のユニットが個別に期待どおりに機能することを確認する必要があります。統合テストでは、すべてが連携して機能することをテストします。

于 2013-07-26T15:23:05.423 に答える
0

Contract/Collaboratorテスト パターンの説明(上記の質問で言及されている「統合テストは詐欺である」で JB Rainsberger によって説明されています)。ここでの質問に関連して、私は彼の話を、サービス側とクライアント側の両方のコードを所有している場合、統合テストはまったく必要ないという意味であると解釈しました。代わりに、コントラクトを実装するモックに頼ることができるはずです。

この話は、パターンの高レベルの説明の良い参考資料ですが、協力者からのコントラクトを定義または参照する方法については (少なくとも私にとっては) 詳細には触れていません。

Contract/Collaboratorパターンの必要性の一般的な例の 1 つは、API のサーバー/クライアント (両方のコードを所有している) の間です。これが私がそれを実装した方法です:

コントラクトを定義します。

最初に API スキーマを定義します。API が JSON を使用している場合は、JSONSchemaを検討してください。スキーマ定義は、API の「契約」と見なすことができます。(補足として、これから実行する場合は、 RAMLまたは Swaggerについて知っておく必要があります。これにより、本質的に JSONSchema API の作成が大幅に容易になるからです)

コントラクトを実装するフィクスチャを作成します。

  • サーバー側では、クライアント リクエストをモック アウトして、リクエスト/レスポンスの単体テストを許可します。これを行うには、クライアント リクエスト フィクスチャ (別名モック) を作成します。API を定義したら、JSONSchema に対してフィクスチャを検証して、準拠していることを確認します。多くのスキーマ バリデータがあります。現在、私は AJV (Javascript) と jsonschema (Python) を使用していますが、ほとんどの言語には実装が必要です。

  • クライアント側では、リクエストの単体テストを可能にするために、サーバー レスポンスをモック アウトする可能性があります。サーバーと同じパターンに従い、JSONSchema を介してリクエストとレスポンスのフィクスチャを検証します。

クライアントとサーバーの両方がコントラクトに対してフィクスチャを検証している場合、API コントラクトが変更されるたびに、両側の古い実装が JSONSchema の検証に失敗し、フィクスチャとおそらくコードを更新する時期であることがわかります。それらの備品に依存しています。

于 2016-05-27T15:05:00.810 に答える