自动测试Web服务通信
我有一个将消息发送到外部Web服务的应用程序。我使用MSBuild和Cruisecontrol.NET构建和部署此应用程序。在CCNET构建和部署应用程序时,它还使用NUnit运行一组测试。我现在也想测试Web服务通信。
我的想法是,作为构建过程的一部分,应生成一个Web服务(基于外部Web服务WSDL)并将其部署到构建服务器本地Web服务器。 Web服务应该做的就是接收消息并将其放置在文件系统上,这样我就可以使用例如普通的NUnit对其进行检查。这也将使开发更容易,因为新开发人员只需运行构建脚本并启动并运行(不必花费时间来建立与第三方服务的连接)。
是否有现有的实用程序可以轻松模拟基于WSDL的Web服务?有人使用MSBuild做过类似的事情吗?
还有其他方法可以测试这种情况吗?
解决方案
回答
我刚刚开始研究http://www.soapui.org/,它似乎可以很好地测试Web服务。
另外,也许看看在Web服务中添加一个抽象层,每个服务调用将直接调用一个可测试的方法(在Web范围之外)?我只是在做一个更大的项目来做到这一点,它的可测试性很好。
回答
通常,测试此类事物的一种很好的方法是使用模拟对象。
在工作中,我们使用产品TypeMock来测试Web服务通信和其他外部依赖项。它要花钱,所以出于这个原因,它可能不适合需求,但是我认为这是一个很棒的产品。我可以从个人经验告诉我们,它与NUnit和CCNet集成得很好。
它有一个非常简单的语法,我们基本上会说:"当调用此方法/属性时,我希望我们返回此值。"它非常适合测试诸如网络故障,文件不存在以及当然还有Web服务之类的东西。
回答
看一下NMock2. 它是一种开放源代码的模拟产品,允许我们为支持丰富和深度交互的接口创建"虚拟"实现。
例如,如果WS接口名为IService
并具有Data GetData()
方法,则可以创建一个模拟,要求该方法被调用一次并返回一个新的Data
对象:
var testService = mockery.NewMock<IService>(); Expect .Once .On(testService) .Method("GetService") .WithNoArguments() .Will( Return.Value(new Data());
在测试结束时,调用mockery.VerifyAllExpectationsHaveBeenMet()
以确保实际调用了GetData方法。
附注:请勿将" NMock2"项目与" NMock RC2"(在sourceforge上也称为" nmock2")混淆。 NMock2-该项目似乎已取代NMock。
回答
这也可能是MockingBird。看起来很有用。
回答
在我的工作场所,我们使用Typemock和nUnit进行单元测试。