WCF 单元测试

Posted

技术标签:

【中文标题】WCF 单元测试【英文标题】:WCF Unit Test 【发布时间】:2010-09-14 05:15:32 【问题描述】:

如何对 WCF 服务进行单元测试?有可用的第三方工具吗?

【问题讨论】:

【参考方案1】:

正如 aku 所说,如果您正在测试服务方法(即代码行为),那么您可以直接对其进行单元测试并绕过 WCF 基础架构。当然,如果您的代码依赖于 WCF 上下文类(如 OperationContext),那么我建议引入包装器,就像 ASP.NET MVC 为 HttpContext 所做的那样。

对于测试连接性,这取决于您配置的端点类型。在某些情况下,您可以在单元测试中自行托管您的 WCF 服务(就像使用 WCF Windows 服务一样)并对其进行测试。

但是,如果您想测试特定于这些托管环境的 WCF 行为(即 SSL、身份验证方法),您可能需要启动 ASP.NET 开发 Web 服务器甚至 IIS。这会变得很棘手,并且会开始对每个人的开发机器和构建服务器的配置提出要求,但这是可行的。

【讨论】:

你知道如何使用 MVC3 作为单元测试的包装器的教程吗? Here's 模拟 OperationContext 的具体示例。【参考方案2】:

我认为最好的方法是分别测试所有关注点;测试连接、客户端库(代理)和服务方法调用。模拟和依赖注入是独立测试连接性和服务行为的好方法,但我怀疑它能否绕过依赖于中间件的端点测试。

您可以在测试中创建一个服务主机(自托管)并加载您的服务。设置端点后,您可以使用客户端代理连接到它。这应该适用于简单的 HTTP 和 WSHTTP。在您的单元测试中,您需要为您的服务创建一个服务引用。然后您可以创建一个主机并将您的客户端与测试主机连接在一起。我会尽量避免使用“WCF 服务主机”又名 WcfSvcHost 进行任何测试。 (我提到这一点只是因为有些人提到了 Visual Studio utils;只有在你只从你的 IDE 运行测试时它才会起作用。)

如果您需要检查使用特殊中间件的特殊身份验证场景或端点,您将需要使用中间件创建测试。对于简单的完整性检查等,使用自托管就足够了。如果您使用的是构建服务器,依赖于中间件的测试可能会导致测试部署问题。

我所说的依赖于中间件的端点是指使用例如 MOM(MSMQ、RabbitMQ 等)或真正奇特的协议等的端点。也许使用自托管模拟测试客户端代理并分别测试奇特的端点是方法去。

如果你想使用依赖注入,有一些非常复杂的框架提供“服务抽象”功能,允许你注入模拟服务等。我使用 Spring.NET 和 WCF 几次。温莎城堡也有 WCF 设施。

自托管测试示例:

    ServiceHost serviceHost = null;

    try
    
        var baseAddress = new Uri("http://localhost:8000/TestService");
        serviceHost = new ServiceHost(typeof (ServiceClass), baseAddress);
        Binding binding = new WSHttpBinding();
        var address = new EndpointAddress("http://localhost:8000/TestService/MyService");
        var endpoint = serviceHost
            .AddServiceEndpoint(typeof (IServiceContract), binding, address.Uri);

        var smb = new ServiceMetadataBehavior HttpGetEnabled = true;
        serviceHost.Description.Behaviors.Add(smb);

        using (var client = new ProxyClient(endpoint.Name, endpoint.Address))
        
            endpoint.Name = client.Endpoint.Name;

            serviceHost.Open();

            // ... magic happens 
        

        serviceHost.Close();
    
    catch (Exception ex)
    
        // ... tests
    
    finally
    
        if (serviceHost != null)
        
            ((IDisposable) serviceHost).Dispose();
        
    

我想指出,功能测试工具与单元测试工具不同。单元测试应该是把你的测试分解成一堆独立的测试,而功能测试主要是关于端到端的测试工作流。

【讨论】:

ProxyClient 属于哪个命名空间/引用?【参考方案3】:

您到底想测试什么?连接方式还是服务方式?

WCF 很酷的一点是,您可以定义接口(错误、契约)并将它们作为常规代码进行测试。然后您可以假设它们将通过 WCF 支持的任何连接类型工作。

可以通过直接在 UT 或开发网络服务器上托管您的服务来测试连接性。

至于工具,有大量的单元测试框架:NUnit、Visual Studio 中的内置测试、xUnit 等。

如果我没记错的话,您可以下载“Visual Studio 2008 and .NET Framework 3.5 Training Kit”和“.NET Framework 3.5 Enhancements Training Kit”有用于 WCF 单元测试的示例

【讨论】:

【参考方案4】:

如果真的想测试 WCF 服务,最好进行集成测试,以实际执行其中的客户端-服务器连接部分。

【讨论】:

【参考方案5】:

如果您想测试实际运行的服务,那么SoapUI 是免费的,并且具有一些出色的功能。唯一需要注意的是,我只尝试了基本 HTTP 绑定。

【讨论】:

【参考方案6】:

您可以使用 Typemock 隔离器来做到这一点。这里有几篇关于测试client side 和server side 的帖子。您可以在没有任何依赖项的情况下执行此操作,包括配置文件。

吉尔·齐伯菲尔德 类型模拟

【讨论】:

【参考方案7】:

Typemock Isolator 是一个用于单元测试的工具wcf services,等等...

【讨论】:

【参考方案8】:

我已经看到SOA Test 用于评估 WCF 服务的性能和可伸缩性测试,如果这是您所寻求的。我没有关于费用或许可的信息。

在我们的例子中,我们从 UI 中捕获消息以执行自动化测试。

【讨论】:

以上是关于WCF 单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何对 WCF UriTemplates 进行单元测试?

如何对我的 WCF 客户端类进行单元测试?

单元测试 WCF 服务时,AddressAccessDeniedException“您的进程没有访问此命名空间的权限”

串行执行单元测试(而不是并行)

如何从 SOAP 响应 XML 创建 WCF 消息对象

测试 WCF - 没有端点监听