我正在使用BizUnit对我的Biztalk业务流程进行单元测试,但是一些业务流程使用WebService,并且测试这些似乎更像是集成测试而不是单元测试.
我熟悉使用模拟框架来模拟生成的代理对象,以便从Windows窗体应用程序测试Web服务,但我希望能够以更加集成的方式在请求 - 响应端口中执行此操作?
你会如何解决这个问题?
这是我作为BizTalk开发人员的一个主要烦恼的核心 - BizTalk不会将其自身用于单元测试.从99%的接口到BizTalk应用程序的事实是基于消息的并且具有大量可能的输入,由于编排的不透明性,BizTalk没有提供测试功能单元的真正方法......好吧......单位.
对于BizTalk来说,集成测试通常是城里唯一的游戏.
这导致,由于凯文史密斯没有过错,BizUnit(IMO)是一个误称.一个更好的名字可能是BizIntegrationIt.BizUnit提供了一系列有助于集成测试的工具,其大部分测试,例如检查文件是否已写入给定目录,或者将HTTPRequest发送到BizTalk HTTPReceive位置都严格来说,测试集成.
现在我已经得到了那个咆哮,你要求的是我长期以来一直在考虑的事情,能够创建自动单元测试,让我真正相信我对地图进行了一些小改动不要突然打破下游的其他东西,以及消除对外部服务依赖的方法.
我从来没有想过要做到这一点的好方法,但下面是一个应该有效的解决方案,我已经完成了隔离的每个部分的变体,但从未尝试过这些特定形式的所有部分.
因此,希望模拟对某些外部服务(可能甚至尚未存在)的调用,而无需实际进行任何外部调用,并希望能够设置对该服务调用的期望并指定响应的性质,我能想到的唯一方法是开发自定义适配器.
如果您构建自定义请求 - 响应适配器,则可以将其插入发送端口以代替SOAP适配器.然后,您可以指定适配器的属性,使其能够充当Web服务的模拟.适配器在概念上类似于环回适配器,但允许内部模拟逻辑.
您可能希望包含的适配器属性:
预期文档(可能是一个磁盘位置,指定您希望BizTalk应用程序发送到Web服务的示例).
响应文档 - 适配器将发送回消息传递引擎的文档.
对测试的特定期望,例如文档元素中的查找值.
您还可以让自定义适配器写入磁盘并设置BizUnit步骤以验证写出的文件.
构建一个定制的适配器是不平凡的,但有可能,你可以从一个良好的开端BizTalk适配器向导并有上部署自定义适配器的文章在这里.
向导生成的代码中存在错误,您需要更改new Guid(""),
为new Guid()
.
还有一些在BizTalk SDK中构建自定义适配器的示例.
另一种选择是使用普通的http页面和这里讨论的HTTP请求响应,所有的逻辑都在http页面中.如果你很高兴有一个http调用,并设置一个IIS端口来监听你的测试,这可能会更简单.
您可以使用.bat文件将绑定文件导入BizTalk应用程序.
如果为运行的每个测试以及标准应用程序设置创建新的绑定文件,则可以运行相应的批处理文件以应用正确的绑定.
每个绑定文件都会更改您的webservice sendport以使用模拟自定义适配器并设置该测试的特定属性.
然后,您甚至可以创建一个自定义的BizUnit步骤(可能)根据测试步骤中的设置生成绑定设置,然后运行shell命令来更新绑定.
您可能想要考虑的最后一件事,就是将所有这些结合在一起,是测试消息内容的某种方式.您可以在模拟适配器中执行此操作,但对于大型消息或大量可能的输入消息,这将非常繁琐.
一种选择是创建一个调用Schematron的自定义管道来验证它收到的文件.Schematron是一种模式语言,允许对xsd进行更丰富的文件检查,因此您可以检查"如果元素x包含此内容,我希望元素y存在".
如果您构建了一个将schematron架构作为参数的自定义管道,那么您可以在测试文件中交换特定的单元测试,验证对于此测试,当您调用Web服务时,您将获得一个实际匹配您想要的文件(并且不仅仅匹配xsd)