しないでください。
任意のインターフェイスに対してテストしないでください。また、それらのモックを作成しないでください。
ほとんどの人は、開発者 (ユニット) テストを、単一のクラスなどの重要な機能の個々のユニットをテストすることを目的としていると考えているようです。一方で、主要なサブシステムまたはシステム全体の顧客 (受け入れ/統合) テストを実行することも重要です。
Web サービスの場合、重要な機能単位は、通信配線の背後にある、意味のあるサービスを実際に実行するクラスに隠されています。これらのクラスには、その機能を検証する個別の開発者テスト クラスが必要ですが、Web サービス指向の通信配線はまったく必要ありません。当然のことですが、明らかにではないかもしれませんが、これは、機能の実装はワイヤリングの実装とは別にする必要があることを意味します。そのため、開発者 (単体) テストでは、そのような特別な通信配線がまったく見られないようにする必要があります。これは統合の一部であり、(適切に) 「ビジネス ロジック」ではなく「プレゼンテーション」の問題と見なすことができます。
顧客 (受け入れ/統合) テストは、より大規模な機能に対処する必要がありますが、「プレゼンテーション」の問題にはまだ焦点を当てていません。これは Facade パターンの使用が一般的である場所であり、統合された粗粒度のテスト可能なインターフェイスでサブシステムを公開します。ここでも、Web サービス通信の統合は無関係であり、個別に実装されます。
ただし、実際に Web サービス統合を含む別個のテスト セットを実装すると非常に便利です。ただし、その統合の片側だけをテストすることは強くお勧めしません。つまり、エンドツーエンドでテストしてください。つまり、実際の本番コードと同じように、Web サービス クライアントであるテストを構築します。実際のアプリケーションとまったく同じ方法で Web サービスを使用する必要があります。つまり、これらのテストは、そのようなアプリケーションを実装する必要がある人 (ライブラリを販売している場合の顧客など) の例として役立ちます。
それで、なぜそんなに面倒なことをするのですか?
開発者テストでは、アクセス方法に関係なく (すべてがビジネス ロジック層内にあるため、プレゼンテーション層とは関係なく) 機能が小規模で機能することを確認します。
顧客テストでは、ビジネス ロジック層のインターフェイス境界で、アクセス方法に関係なく、機能が大規模に機能することを確認します。
統合テストは、プレゼンテーション層がビジネス ロジック層と連携することを確認します。これは、基礎となる機能を無視できるようになったため (上記で個別にテストしたため)、管理可能になりました。言い換えれば、これらのテストは、きれいな顔 (GUI?) と通信インターフェイス (Web サービス?) の薄いレイヤーに焦点を当てています。
機能にアクセスする別の方法を追加する場合、その新しい形式のアクセス (プレゼンテーション層) の統合テストを追加するだけで済みます。開発者と顧客のテストにより、コア機能が変更されておらず、壊れていないことが保証されます。
Web サービス専用のテスト ツールなど、特別なツールは必要ありません。本番コードで使用するのとまったく同じように、本番コードで使用するツール/コンポーネント/ライブラリ/テクニックを使用します。これにより、他の人のツールをテストしていないので、テストがより意味のあるものになります。特別なツールを購入、展開、開発、保守する必要がないため、時間とお金を大幅に節約できます。ただし、GUI を使用してテストする場合 (そうしないでください!)、その部分には特別なツールが 1 つ必要になる場合があります (たとえば、HttpUnit?)。
それでは、具体的に説明しましょう。カフェテリアの日替わりメニューを追跡するための機能を提供したいとします (私たちのように、建物内に独自のカフェを持つ巨大企業で働いているため)。C# を対象としているとしましょう。
メニュー、メニュー項目、およびその他のきめ細かな機能とその関連データ用にいくつかの C# クラスを作成します。nUnit を使用して開発者テストを実行する nAnt を使用して自動ビルドを確立し (そうしますよね?)、毎日のメニューを作成して、これらすべての小さな部分からそれを確認できることを確認します。
私たちはどこに向かっているのかある程度わかっているので、細粒度の部分のほとんどを隠しながら、いくつかのメソッドを公開する単一のクラスを作成することで、Facade パターンを適用します。クライアントと同じように、その新しいファサードを介してのみ動作する顧客テストの別のセットを追加します。
ここで、巨大企業のナレッジ ワーカーが今日のカフェテリアのメニューをチェックできるように、Web ページを提供することにしました。ASP.NET ページを作成し、ファサード クラス (MVC を実行している場合はこれがモデルになります) を呼び出してデプロイします。すでに顧客テストを通じてファサード クラスを徹底的にテストしており、単一の Web ページは非常に単純であるため、Web ページに対して自動テストを作成することは控えます。数人のナレッジ ワーカーを使用した手動テストでうまくいきます。
その後、その日のランチを事前注文できるようにするなど、いくつかの主要な新機能の追加を開始します。既存のテストが既存の機能を壊さないように保護していることを知って、きめの細かいクラスと対応する開発者テストを拡張します。同様に、ファサード クラスを拡張し、インターフェースの成長に合わせて新しいクラス (MenuFacade や OrderFacade など) を分割し、顧客テストに同様の追加を行います。
さて、おそらく、Web サイトへの変更 (2 ページが Web サイトですよね?) により、手動テストは満足のいくものではなくなります。そこで、nUnit が Web ページをテストできるようにする HttpUnit に匹敵するシンプルなツールを導入しました。一連の統合/プレゼンテーション テストを実装しますが、ファサード クラスのモック バージョンに対して行います。これは、ここでのポイントは単に Web ページが機能することであるためです。ファサード クラスが機能することは既にわかっています。テストは、データが反対側に正常に送信されたことをテストするためだけに、モック ファサードを介してデータをプッシュおよびプルします。これ以上何もない。
もちろん、私たちの大成功により、CEO は Web アプリケーションを巨大企業の BlackBerry に公開するよう要求 (要求) するようになりました。そのため、いくつかの新しいページと一連の新しい統合テストを実装します。新しいコア機能を追加していないため、開発者または顧客のテストに触れる必要はありません。
最後に、CTO は、私たちのカフェテリア アプリケーションを巨大企業のすべてのロボット ワーカーに拡張するよう要求 (要求) しました。そこで、ファサードを介して通信する Web サービス層を追加します。繰り返しになりますが、コア機能、開発者テスト、顧客テストに変更はありません。同等の Web サービス API を使用してファサードを公開するクラスを作成することで Adapter/Wrapper パターンを適用し、その API を使用するクライアント側クラスを作成します。新しい一連の統合テストを追加しますが、それらは単純な nUnit を使用してクライアント側 API クラスを作成し、Web サービス ワイヤリングを介してサービス側 API クラスと通信し、モック ファサード クラスを呼び出し、ワイヤリングが機能することを確認します。
このプロセス全体を通して、本番プラットフォームとコード、選択した開発プラットフォーム、自動化されたビルドとテスト用のいくつかのオープンソース コンポーネント、およびいくつかの明確に定義された一連のテスト以外に、重要なものは何も必要ありませんでした。また、本番環境で使用しないものは何もテストしておらず、2 回もテストしていないことにも注意してください。
最終的に、機能のコア (ビジネス ロジック層) が成熟していることが証明されました (仮想的に)。デスクトップを対象とする Web サイト、BlackBerry を対象とする Web サイト、および Web サービス API の 3 つの個別のプレゼンテーション層の実装があります。
では、長い回答をお許しください。不十分な回答にはうんざりしており、提供したくありませんでした。そして、私が実際にこれを行ったことに注意してください(ただし、カフェテリアのメニューではありません).