我有一个将消息发送到外部Web服务的应用程序。我使用MSBuild和Cruisecontrol.NET构建和部署此应用程序。当CCNET构建和部署应用程序时,它还使用NUnit运行一组测试。我现在也想测试Web服务通信。
我的想法是,作为构建过程的一部分,应该生成Web服务(基于外部Web服务WSDL)并将其部署到构建服务器本地Web服务器。所有Web服务应该做的是接收消息并将其放在文件系统上,这样我就可以使用普通的NUnit来检查它。这也可以使开发更容易,因为新开发人员只需要运行构建脚本并启动并运行(不必花时间建立与第三方服务的连接)。
是否有现有的实用程序可以轻松地基于WSDL模拟Web服务?任何人使用MSBuild做了类似的事情?
是否有测试此方案的其他方法?
答案 0 :(得分:3)
我刚开始研究http://www.soapui.org/,看起来它可以很好地测试网络服务。
另外,也许可以考虑在Web服务中添加抽象层,每个服务调用都会直接调用可测试的方法(在Web范围之外)?我刚刚做了一个我正在研究的更大的项目,它的可测试性很好。
答案 1 :(得分:1)
通常,测试此类内容的一种非常好的方法是使用mock objects。
在工作中,我们使用产品TypeMock来测试Web服务通信和其他外部依赖项。这需要花钱,因此可能不适合您的需求,但我认为这是一个很棒的产品。我可以从个人经验告诉你,它与NUnit和CCNet很好地集成。
它有一个非常简单的语法,您基本上会说“当调用此方法/属性时,我希望您返回此值。”它非常适合测试网络故障,文件不存在,当然还有网络服务等。
答案 2 :(得分:1)
看看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
方法。
P.S。:不要将“NMock2”项目与“NMock RC2”混淆,后者在sourceforge上也称为“nmock2”。 NMock2-the-project似乎已经取代了NMock。
答案 3 :(得分:1)
这也可能是 - MockingBird。看起来很有用。
答案 4 :(得分:0)