WCF单元测试

时间:2008-09-30 09:15:12

标签: wcf unit-testing

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

8 个答案:

答案 0 :(得分:26)

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

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

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

答案 1 :(得分:22)

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

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

如果您需要检查使用特殊中间件的异乎寻常的身份验证方案或端点,则需要使用中间件创建测试。对于简单的健全性检查,使用自托管的等等就足够了。如果您使用构建服务器,则依赖于中间件的测试可能会导致测试部署问题。

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

如果你想使用依赖注入,有一些非常复杂的框架提供“服务抽象”功能,允许你注入模拟服务等。我使用Spring.NET和WCF几次。 Castle Windsor酒店还提供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();
        }
    }

我想指出功能测试工具与单元测试工具不同。单元测试应该是将测试分解为一系列独立测试,而功能测试主要是关于端到端测试工作流。

答案 2 :(得分:12)

您想要测试什么?连接或服务方法?

关于WCF的一件好事是你可以定义接口(错误,合同)并将它们作为常规代码进行测试。然后,您可以假设它们将通过WCF支持的任何连接类型工作。

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

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

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

答案 3 :(得分:5)

如果真的想测试WCF服务,最好采用实际运行客户端 - 服务器连接部分的集成测试。

答案 4 :(得分:4)

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

答案 5 :(得分:2)

您可以使用Typemock Isolator来完成此操作。以下是有关测试client sideserver side问题的几篇文章。您可以在没有任何依赖性的情况下执行此操作,包括配置文件。

Gil Zilberfeld Typemock

答案 6 :(得分:2)

Typemock Isolator是一个单元测试工具wcf services,其中包括......

答案 7 :(得分:0)

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

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