Web サービスのテスト

更新 : 2007 年 11 月

Web サービスは単体テストから Web メソッドを呼び出すことでテストできます。Web サービスのテストは、Assert ステートメントが使用でき、同じ範囲の結果が作成されることから、単体テストで他のコードをテストをするのと非常に似ています。Visual Studio Team System Test Edition の Microsoft.VisualStudio.TestTools.UnitTesting.Web 名前空間では、Web サービスをテストするための属性とメソッドが用意されています。このような属性とメソッドは「ローカルでの Web サービス テスト」で説明されています。

次のリストでは、単体テストを使用して Web サービスをテストする方法を 2 つ説明します。

  • アクティブな Web サーバーで Web サービスが稼動している場合。IIS のようなローカルまたはリモートの Web サーバーで稼動する Web サービスをテストする場合の特別な要件はありません。この操作を行うには、Web 参照を追加して、Web サービスではないプログラムのメソッドを呼び出すときと同じように、単体テストから Web サービスの Web メソッドを呼び出します。Web 参照を追加する方法については、「[Web 参照の追加] ダイアログ ボックス」を参照してください。単体テストを作成する方法については、「方法 : 単体テストを生成する」および「方法 : 単体テストを編集する」を参照してください。Web サービスをテストするために Web テストを使用する方法については、「方法 : Web サービス テストを作成する」を参照してください。

  • アクティブな Web サーバーで Web サービスがホストされていない場合。「ローカルでの Web サービス テスト」でも説明されているように、IIS のような Web サーバーではなく、ローカル コンピュータ上で稼動する Web サービスをテストできます。この操作を行うには、Team System テスト ツール で用意されている属性を使用して、ASP.NET 開発サーバーを開始します。これにより、テストする Web サービスをホストする一時サーバーがローカルホストに作成されます。ASP.NET 開発サーバーの詳細については、「Visual Web Developer における Web サーバー」を参照してください。

ローカルでの Web サービス テスト

これは、IIS ではなく、ローカル コンピュータで稼動する Web サービスをテストするための手順です。

  1. ローカルのファイル システムに Web サービスを作成します。詳細については、「チュートリアル : Visual Basic または Visual C# を使った Web サービスの作成」を参照してください。

  2. 単体テストを生成する通常の方法で、Web サービスの単体テストを生成します。詳細については、「方法 : 単体テストを生成する」を参照してください。

  3. 単体テストに AspNetDevelopmentServerAttribute 属性を追加します。この属性クラスの引数は、Web サービスのサイトと、サーバーの名前をポイントします。詳細については、「ASP.NET 開発サーバーへの確実なアクセス」を参照してください。

  4. 単体テストで、TryUrlRedirection メソッドへの呼び出しを追加して、Web サービス オブジェクトが正しいサーバーをポイントするようにします。true が返されることを確認し、リダイレクトが失敗したらテストが失敗するよう Assert ステートメントを使用します。詳細については、「TryUrlRedirection メソッドの使用」を参照してください。

  5. Web サービスを呼び出すか、十分なテストに必要と思われる他の方法があれば、その方法で Web サービスを実行します。この場合の例については、「Web サービス テスト メソッドの例」を参照してください。

ASP.NET 開発サーバーへの確実なアクセス

Web サービスのサイトがローカルのファイル システム上にある場合は、このサイトは IIS サイトではないので ASP.NET 開発サーバーを使用します。この場合、単体テスト生成のプロセスが、Web サービス用の ASP.NET 開発サーバーを開始し、テスト プロジェクトへの Web 参照を追加します。

ASP.NET 開発サーバーは一時的なものなので、サーバーが停止した後は Web 参照は失敗します。Team System テスト ツール は AspNetDevelopmentServer 属性を提供することでこの問題を解決します。この属性クラスには、2 つのコンストラクタがあります。

AspNetDevelopmentServerAttribute(string name, string pathToWebApp)
AspNetDevelopmentServerAttribute(string name, string pathToWebApp, string webAppRoot)

次のパラメータがこの属性と共に使用されます。

  • name は、ユーザー定義の名前で、サーバーに関連付けられています。

  • pathToWebApp は、テストする Web サイトへのパスで、システム ディスク上のパスになります。

  • webAppRoot は、サーバーに表示されるサイトの仮想パスです。たとえば、webAppRoot が /WebSite1 に設定されている場合は、サイトへのパスは https://localhost:<port>/WebSite1 になります。最初のコンストラクタは、既定値が https://localhost:<port>/ となっています。

ms243399.alert_note(ja-jp,VS.90).gifメモ :

pathToWebApp パラメータおよび webAppRoot パラメータは、AspNetDevelopmentServerAttribute と同じように使用されます。これらのパラメータは、ASP.NET の単体テストで使用する AspNetDevelopmentServerHost 属性用であるためです。

AspNetDevelopmentServerAttribute 属性をテストに付けると、テスト実行時に ASP.NET 開発サーバーが開始します。テスト対象サイトの URL を含むエントリが、テスト クラスの TestContext.Properties に追加されます。このエントリの鍵となるのは、AspNetDevelopmentServer.<name> です。

<name> は、この属性の name 引数が持つ値です。これにより、テスト実行時に ASP.NET 開発サーバーで Web サービスが常に使用でき、実行時に URL がわかる状態になります。

この方法で Web サービスをテストするには、単体テストを生成するか、単体テストを手動で記述し、この属性を付け加えます。テストを手動で記述する場合、自分で Web 参照を用意する必要があります。これにより単体テストのコード内で、Web サービスの種類を参照できるようになります。Web 参照を追加する前に、Web サービス プロジェクトを右クリックして [ブラウザで表示] を選択し、ASP.NET 開発サーバーを開始する必要があります。

TryUrlRedirection メソッドの使用

Web 参照を行った後、テスト コードで Web サービス オブジェクトのインスタンスを作成できますが、参照が、停止している ASP.NET 開発サーバーのインスタンスの URL をポイントしているために、Web サービスを実行する時点で失敗する可能性があります。この問題を解決するには、TryUrlRedirection メソッドを使用して Web サービス オブジェクトを変更し、単体テストの実行専用に開始した ASP.NET 開発サーバーをポイントするようにします。

TryUrlRedirection は WebServiceHelper クラスの静的メソッドで、リダイレクトが成功したかどうかを示すブール値を返します。

bool TryUrlRedirection(System.Web.Protocols.WebClientProtocol client, TestContext context, string identifier)

TryUrlRedirection は引数を 3 つ受け取ります。

  • client は、リダイレクトされる Web サービス オブジェクトです。

  • context は、クラスの TestContext オブジェクトです。

  • identifier は、ユーザー定義によるサーバー名で、Web サービス オブジェクトがこのサーバーにリダイレクトされます。

このメソッドの呼び出しに成功した場合は、Web サービス オブジェクトの Web メソッドを呼び出すことができます。これにより、Web サービスは、単体テストの実行時に開始した ASP.NET 開発サーバーを介してアクセスされます。それぞれのサーバーに異なる名前が付いていれば、1 つの単体テストで複数の AspNetDevelopmentServer 属性を使用して、複数のサーバーを開始できます。

単体テストを生成しても、AspNetDevelopmentServer 属性や TryUrlRedirection メソッドへの呼び出しは自動的に追加されません。エンティティは手動で追加する必要があります。属性とメソッドは両方とも、Microsoft.VisualStudio.TestTools.UnitTesting.Web に含まれます。そのため次の例で示すように、using ステートメントまたは Imports ステートメントが必要になります。

Web サービス テスト メソッドの例

これは、Web サービスの HelloWorld() Web メソッドをテストする簡単なテスト メソッドです。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting.Web;
using TestProject1.localhost;

[TestMethod]
[AspNetDevelopmentServer("HelloWorldServer", @"C:\Documents and Settings\user\My Documents\Visual Studio 2005\WebSites\WebSite1")]
public void HelloWorldTest()
{
     HelloWorldService target = new HelloWorldService();

     Assert.IsTrue( WebServiceHelper.TryUrlRedirection
                         (
                          target,
                          testContextInstance,
                          "HelloWorldServer"
                         ),
                   "Web service redirection failed."
                   );

     string expected = "Hello World";
     string actual;

     actual = target.HelloWorld();

     Assert.AreEqual(
                     expected,
                     actual,
                     "TestProject1.localhost.HelloWorldService.HelloWorld did not return the expected value."
                     );
}

参照

処理手順

方法 : 単体テストを編集する

方法 : Web サーバーをパラメータ化する

概念

Visual Web Developer における Web サーバー

参照

Microsoft.VisualStudio.TestTools.UnitTesting.Web

AspNetDevelopmentServerAttribute

TryUrlRedirection

その他の技術情報

方法 : 単体テストを生成する