测试 Web 服务

更新:2007 年 11 月

从单元测试中调用 Web 方法可以对 Web 服务进行测试。测试 Web 服务与使用单元测试来测试其他代码非常相似,相似之处在于可以使用 Assert 语句,并且测试可以产生相同范围的结果。但是,Visual Studio Team System Test Edition 的 Microsoft.VisualStudio.TestTools.UnitTesting.Web 命名空间提供了专门用于测试 Web 服务的属性和方法;相关内容在在本地测试 Web 服务中进行了说明。

下面的列表描述了使用单元测试对 Web 服务进行测试的两种方式:

  • Web 服务在活动的 Web 服务器上运行。对本地或远程 Web 服务器上运行的 Web 服务(如 IIS)进行测试时,没有任何特殊要求。为此,可以添加 Web 引用,然后从单元测试中调用 Web 服务的 Web 方法,如同调用不是 Web 服务的程序的方法一样。有关如何添加 Web 引用的信息,请参见 “添加 Web 引用”对话框。有关如何创建单元测试的信息,请参见 如何:生成单元测试如何:创作单元测试。有关如何使用 Web 测试对 Web 服务进行测试的信息,请参见 如何:创建 Web 服务测试

  • Web 服务未在活动的 Web 服务器中承载。如在本地测试 Web 服务中所述,可以对本地计算机而不是 Web 服务器上运行的 Web 服务(如 IIS)进行测试。为此,可以使用 Team System 测试工具 提供的属性来启动 ASP.NET Development Server。此操作将在本地主机上创建临时服务器,本地主机承载正在测试的 Web 服务。有关 ASP.NET Development Server 的更多信息,请参见 Visual Web Developer 中的 Web 服务器

在本地测试 Web 服务

此过程用于测试本地计算机而不是 IIS 中运行的 Web 服务:

  1. 在本地文件系统中创建 Web 服务。有关更多信息,请参见演练:使用 Visual Basic 或 Visual C# 创建 Web 服务

  2. 以生成单元测试的标准方式针对 Web 服务生成单元测试。有关更多信息,请参见如何:生成单元测试

  3. 向单元测试中添加 AspNetDevelopmentServerAttribute 属性。此属性类的参数指向 Web 服务的站点并对服务器进行命名。有关更多信息,请参见确保对 ASP.NET Development Server 的访问。

  4. 在单元测试内,添加对 TryUrlRedirection 方法的调用,以使 Web 服务对象指向正确的服务器。确认该调用返回 true 值;如果重定向失败,则使用 Assert 语句使测试失败。有关更多信息,请参见使用 TryUrlRedirection 方法。

  5. 调用 Web 服务,或以您认为对 Web 服务进行彻底测试所需的任何其他方式来执行 Web 服务。有关此操作的示例,请参见 Web 服务测试方法示例。

确保对 ASP.NET Development Server 的访问

如果 Web 服务的站点位于本地文件系统中,它将使用 ASP.NET Development Server,并且不是 IIS 站点。在此情况下,生成单元测试的过程将为 Web 服务启动 ASP.NET Development Server,并向测试项目中添加 Web 引用。

ASP.NET Development Server 是临时的,Web 引用在服务器停止后将会失败。Team System 测试工具 通过提供 AspNetDevelopmentServer 属性来解决此问题。此属性类有两个构造函数:

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

下列参数可用于此属性:

  • name 是用户定义的名称,与服务器关联。

  • pathToWebApp 是正在测试的网站在磁盘中的路径。

  • webAppRoot 是站点在服务器上显示的虚拟路径。例如,如果 webAppRoot 设置为 /WebSite1,则该站点的路径为 https://localhost:<port>/WebSite1。对于第一个构造函数,默认路径为 https://localhost:<port>/

说明:

AspNetDevelopmentServerAttribute 和用于 ASP.NET 单元测试的 AspNetDevelopmentServerHost 属性使用 pathToWebApp 和 webAppRoot 参数的方式相同。

如果用 AspNetDevelopmentServerAttribute 属性标记测试,则每次运行测试时,ASP.NET Development Server 就会启动。包含被测试站点 URL 的项将被添加到测试类的 TestContext.Properties 中。此项的键为 AspNetDevelopmentServer.<name>,其中

<name> 是该属性的 name 参数所保存的值。这一机制可确保测试运行时 Web 服务在 ASP.NET Development Server 中始终可用,并且 URL 在运行时为已知。

若要以此方式测试 Web 服务,可以生成单元测试,也可以手动编写单元测试并使用此属性对单元测试进行标记。手动编写需要将 Web 引用放到正确位置,这样便可以在单元测试的代码中引用 Web 服务的类型。在添加 Web 引用之前,必须启动 ASP.NET Development Server,方法是右击 Web 服务项目,然后选择“在浏览器中查看”。

使用 TryUrlRedirection 方法

具有 Web 引用后,可以在测试代码中创建 Web 服务对象的实例,但此操作在运行时可能会失败,因为引用指向的是可能不再运行的 ASP.NET Development Server 实例的 URL。若要解决此问题,请使用 TryUrlRedirection 方法修改 Web 服务对象,使其指向专门为运行的单元测试而启动的 ASP.NET Development Server。

TryUrlRedirection 是 WebServiceHelper 类的静态方法,它返回一个指示重定向是否成功的布尔值。

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

TryUrlRedirection 采用三个参数:

  • client 是要重定向的 Web 服务对象。

  • context 是类的 TestContext 对象。

  • identifier 是以下服务器的用户定义名称,Web 服务对象将被重定向到该服务器。

调用此方法后,如果成功,则可以对 Web 服务对象调用 Web 方法。这样,便可通过在启动单元测试时启动的 ASP.NET Development Server 访问 Web 服务。可以在一个单元测试中使用多个 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

其他资源

如何:生成单元测试