測試 Web 服務

您可以藉由呼叫單元測試中的 Web 方法,以測試 Web 服務。測試 Web 服務就像藉由可以使用 Assert 陳述式的單元測試來測試其他程式碼一樣,並且測試會產生相同的結果範圍。然而,Team Edition for Testers 的 Microsoft.VisualStudio.TestTools.UnitTesting.Web 命名空間提供專用於測試 Web 服務的屬性 (Attribute) 和方法,如需它們的詳細資訊,請參閱在本機測試 Web 服務。

下列清單說明兩種使用單元測試,測試 Web 服務的方式:

  • Web 服務在現用 Web 伺服器上執行。測試執行於本機或遠端 Web 伺服器 (例如 IIS) 上的 Web 服務,沒有任何特殊需求。若要進行測試,請加入 Web 參考,然後從單元測試呼叫 Web 服務的 Web 方法,就如同單元測試呼叫不是 Web 服務的程式方法一樣。如需如何加入 Web 參考的詳細資訊,請參閱加入 Web 參考對話方塊。如需如何建立單元測試的詳細資訊,請參閱 HOW TO:產生單元測試HOW TO:撰寫單元測試。如需如何使用 Web 測試以測試 Web 服務的詳細資訊,請參閱 HOW TO:建立 Web 服務測試

  • Web 服務未裝載在現用 Web 伺服器中。如在本機測試 Web 服務所述,您可以測試執行於本機電腦,但未在 Web 伺服器 (例如 IIS) 中的 Web 服務。若要進行測試,請使用 Team System 測試工具 提供的屬性啟動 ASP.NET 程式開發伺服器。這會在 localhost 建立暫時伺服器,而 localhost 會裝載您正在測試的 Web 服務。如需 ASP.NET 程式開發伺服器的詳細資訊,請參閱 Visual Web Developer 中的 Web 伺服器

在本機測試 Web 服務

這個程序是用來測試執行於本機電腦,但未在 IIS 中的 Web 服務:

  1. 在本機檔案系統上建立 Web 服務。如需詳細資訊,請參閱逐步解說:使用 Visual Basic 或 Visual C# 建立 XML Web Service

  2. 根據產生單元測試的標準方法,產生 Web 服務的單元測試。如需詳細資訊,請參閱 HOW TO:產生單元測試

  3. AspNetDevelopmentServerAttribute 屬性加入至單元測試。這個屬性類別的引數會指向 Web 服務的網站,並為伺服器命名。如需詳細資訊,請參閱確定可以存取至 ASP.NET 程式開發伺服器。

  4. 在單元測試中,加入對 TryUrlRedirection 方法的呼叫,以便將 Web 服務物件指向正確的伺服器。請驗證它會傳回 true,並且使用 Assert 陳述式,讓測試在重新導向未成功時失敗。如需詳細資訊,請參閱使用 TryUrlRedirection 方法。

  5. 呼叫 Web 服務,或是以您認為有必要的任何其他方式,以完整測試 Web 服務。如需範例,請參閱 Web 服務測試方法的範例。

確定可以存取至 ASP.NET 程式開發伺服器

如果 Web 服務的網站位於本機檔案系統上,它便會使用 ASP.NET 程式開發伺服器,而它並非 IIS 站台。在這個情況中,產生單元測試的程序會啟動 Web 服務的 ASP.NET 程式開發伺服器,並將 Web 參考加入至測試專案。

ASP.NET 程式開發伺服器是暫時伺服器,在伺服器停止之後,Web 參考可能會失敗。Team System 測試工具 藉由提供 AspNetDevelopmentServer 屬性解決了這個問題。這個屬性類別具有兩個建構函式 (Constructor):

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

下列參數可以與這個屬性搭配使用:

  • name 是與伺服器關聯之使用者定義的名稱。

  • pathToWebApp 是指向測試網站的磁碟路徑。

  • webAppRoot 為其網站顯示在伺服器上的虛擬路徑。例如,如果 webAppRoot 是設定為 /WebSite1,則網站的路徑即為 http://localhost:<port>/WebSite1。如果是第一個建構函式,則預設值為 http://localhost:<port>/

Note注意事項

參數 pathToWebAppwebAppRoot 的用法與 AspNetDevelopmentServerAttribute 相同,如同它們用於 AspNetDevelopmentServerHost 屬性一樣,而該屬性是用於 ASP.NET 單元測試。

當您使用屬性 AspNetDevelopmentServerAttribute 標記測試時,無論是否執行測試,都會啟動 ASP.NET 程式開發伺服器。含有要測試之網站 URL 的項目會加入至測試類別的 TestContext.Properties。這個項目的索引鍵為 AspNetDevelopmentServer.<name>,其中

<name> 是屬性的 name 引數所持有的值。這個機制會確保當測試執行時以及在執行階段 URL 是已知的,Web 服務永遠可以在 ASP.NET 程式開發伺服器中使用。

若要以這種方式測試 Web 服務,您可以產生單元測試,或手動撰寫單元測試,並使用這個屬性標記測試。若要手動撰寫,您必須具備 Web 參考,以便參考單元測試之程式碼中的 Web 服務型別。加入 Web 參考之前,您必須先以滑鼠右鍵按一下 Web 服務專案並選取 [在瀏覽器中檢視],以啟動 ASP.NET 程式開發伺服器。

使用 TryUrlRedirection 方法

有了 Web 參考之後,您就可以在測試程式碼中建立 Web 服務物件的執行個體,但這可能會在執行階段失敗,因為參考會指向 ASP.NET 程式開發伺服器之執行個體的 URL,而 ASP.NET 程式開發伺服器可能不再執行。若要解決這個問題,請使用 TryUrlRedirection 方法以修改 Web 服務物件,使 Web 服務物件指向為了執行單元測試而特別啟動的 ASP.NET 程式開發伺服器。

TryUrlRedirectionWebServiceHelper 類別的靜態方法,該類別會傳回布林值 (Boolean) 指出重新導向是否成功。

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

TryUrlRedirection 會使用三個引數:

  • client 是要重新導向的 Web 服務物件。

  • context 是類別的 TestContext 物件。

  • identifier 是伺服器的使用者定義名稱,該伺服器即為 Web 服務物件將會重新導向的目標伺服器。

呼叫這個方法之後,如果成功了,您就可以呼叫 Web 服務物件上的 Web 方法。如此,便會透過啟動單元測試時所啟動的 ASP.NET 程式開發伺服器,存取 Web 服務。只要您提供不同的伺服器名稱,就可以在單一單元測試上使用多個 AspNetDevelopmentServer 屬性,以啟動多個伺服器。

單元測試產生不會自動加入 AspNetDevelopmentServer 屬性或 TryUrlRedirection 方法呼叫。您必須自行加入這個實體 (Entity)。屬性和方法都在 Microsoft.VisualStudio.TestTools.UnitTesting.Web 中,因此,您將需要 usingImports 陳述式,如下列範例所示。

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."
                     );
}

請參閱

工作

HOW TO:產生單元測試
HOW TO:撰寫單元測試
HOW TO:參數化 Web 伺服器

參考

Microsoft.VisualStudio.TestTools.UnitTesting.Web
AspNetDevelopmentServerAttribute
TryUrlRedirection

概念

Visual Web Developer 中的 Web 伺服器