WCFunit testing

如何unit testingWCF服务? 任何第三方工具可用?

正如aku所说,如果您正在testing服务方法(即代码行为),那么您可以直接进行unit testing并绕过WCF基础结构。 当然,如果你的代码依赖于WCF上下文类(比如OperationContext),那么我build议像ASP.NET MVC那样为HttpContext引入包装器。

要testing连通性,将取决于您configuration的端点types。 在某些情况下,您可以在unit testing中自行托pipe您的WCF服务(就像使用WCF Windows服务一样)并testing它。

但是,如果要testing特定于这些托pipe环境(即SSL,身份validation方法)的WCF行为,则可能需要启动ASP.NET开发Web服务器甚至IIS。 这变得棘手,并且可以开始对每个人的开发机器和构build服务器的configuration提出要求,但是是可行的。

我认为最好的办法是单独testing所有关心的问题; testing连通性,客户端lib(代理)和服务方法调用。 模拟和dependency injection是独立testing连通性和服务行为的好方法,但我怀疑它可以绕过中间件依赖端点testing。

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

如果您需要检查特殊的身份validationscheme或使用特殊中间件的端点,则需要使用中间件创buildtesting。 对于简单的理智检查等使用自托pipe就足够了。 如果使用构build服务器,则依赖中间件的testing会导致testing部署问题。

中间件依赖端点是指使用例如MOM(MSMQ,RabbitMQ等)或真正的asynchronous协议等的端点。也许用自主模拟来testing客户端代理,并分别testing异国情调的端点是要走的路。

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

自主testing示例:

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(); } } 

我想指出的是,functiontesting工具与unit testing工具不一样。 unit testing应该是将testing分解为一系列独立testing,而functiontesting主要是关于testing工作stream的端到端。

你想要testing什么? 连接或服务方法?

关于WCF很酷的事情是你可以定义接口(错误,合同),并testing它们作为普通的代码。 那么你可以假设他们将通过WCF支持的任何连接types工作。

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

至于工具,你有大量的unit testing框架:NUnit,Visual Studio中的内置testing,xUnit等等。

如果我记得有正确的WCFunit testing样本,您可以下载“ Visual Studio 2008和.NET Framework 3.5培训工具包 ”和“ .NET Framework 3.5增强培训工具包 ”

如果真的想要testingWCF服务,最好使用实际运行客户端 – 服务器连接function的集成testing。

如果你想testing实际的运行服务,那么SoapUI是免费的,并有一些优秀的function。 唯一的警告是,我只用基本的HTTP绑定尝试过。

你可以使用Typemock Isolator来做到这一点。 这里有几个关于testing客户端和服务器端的post。 你可以做到这一点,没有任何依赖,包括一个configuration文件。

吉尔Zilberfeld Typemock

Typemock Isolator是一个unit testingwcf服务的工具,其他的东西…

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

在我们的例子中,我们从我们的用户界面捕获消息,以执行自动化testing。