模拟Biztalk请求 - 响应端口消耗的WebService

时间:2008-11-02 13:48:06

标签: web-services mocking biztalk

我正在使用BizUnit对我的Biztalk业务流程进行单元测试,但是一些业务流程使用WebService,测试这些似乎更像集成测试而不是单元测试。

我熟悉使用模拟框架来模拟生成的代理对象,以便从Windows窗体应用程序测试Web服务,但我希望能够以更加集成的方式在请求中执行此操作 - 响应端口?

你会如何解决这个问题?

7 个答案:

答案 0 :(得分:7)

这是我作为BizTalk开发人员的一个主要烦恼的核心 - BizTalk不会将其自身用于单元测试。从99%的接口到BizTalk应用程序的事实是基于消息的并且具有大量可能的输入,由于编排的不透明性,BizTalk没有提供测试功能单元的真正方法......好吧......单元。

对于BizTalk,集成测试通常是城里唯一的游戏。

这导致,由于凯文史密斯没有错,BizUnit(IMO)用词不当。一个更好的名字可能是BizIntegrationIt。 BizUnit提供了一系列有助于集成测试的工具,其大部分测试,例如检查文件是否已写入给定目录,或者将HTTPRequest发送到BizTalk HTTPReceive位置都严格来说,测试集成。

现在我已经得到了那个咆哮,你要求的是我长期以来一直在考虑的事情,能够创建自动化的单元测试,让我有一些真正的信心,我做了一个小的改变地图不会突然破坏下游的其他东西,也不会消除对外部服务的依赖。

我从来没有想过要做到这一点的好方法,但下面是应该工作的解决方案,我已经独立完成了每个部分的变化,但从未尝试过,但它们都是以这种特定形式一起。

因此,希望模拟对某些外部服务(可能尚未存在)的呼叫,而无需实际进行任何外部呼叫希望能够设置对该服务的期望调用并指定响应的性质,我能想到的唯一方法是开发自定义适配器。

使用自定义适配器

模拟Web服务

如果您构建自定义请求 - 响应适配器,则可以将其插入发送端口以代替SOAP适配器。然后,您可以指定适配器的属性,使其能够充当Web服务的模拟。适配器在概念上与环回适配器类似,但允许内部模拟逻辑。

您可能希望包含为适配器属性的内容:

  • 预期文档(可能是一个磁盘位置,指定了您希望BizTalk应用程序发送到Web服务的示例)。
  • 响应文档 - 适配器将发送回消息传递引擎的文档。
  • 对测试的特定期望,例如文档元素中的查找值。

您也可以让自定义适配器写入磁盘并设置BizUnit步骤以验证写出的文件。

构建自定义适配器并非易事,但可以从BizTalk Adapter Wizard开始,并且有一篇关于部署自定义适配器的文章here

向导生成的代码中存在错误,您需要将new Guid(""),更改为new Guid()

还有一些在BizTalk SDK中构建自定义适配器的示例。

另一种选择是使用普通的http页面和所讨论的HTTP请求响应here,所有的逻辑都在http页面中。如果你很高兴有一个http调用,并设置一个IIS端口来监听你的测试,这可能会更简单。

初始化单元测试

您可以使用.bat文件将绑定文件导入BizTalk应用程序。

如果为运行的每个测试以及标准应用程序设置创建新的绑定文件,则可以运行相应的批处理文件以应用正确的绑定。

每个绑定文件都会更改您的webservice sendport以使用模拟自定义适配器并为该测试设置特定属性。

然后,您甚至可以创建一个自定义的BizUnit步骤(可能)根据测试步骤中的设置生成绑定设置,然后运行shell命令来更新绑定。

测试消息内容

您可能想要考虑的最后一件事,即将所有这些联系在一起,是测试消息内容的某种方式。您可以在模拟适配器中执行此操作,但对于大型消息或大量可能的输入消息,这将非常繁琐。

一种选择是创建一个调用Schematron的自定义管道来验证它收到的文件。 Schematron是一种模式语言,允许对xsd进行更丰富的文件检查,因此您可以检查“如果元素x包含此内容,我希望元素y存在”。

如果您构建了一个将schematron架构作为参数的自定义管道,那么您可以在测试文件中交换特定的单元测试,验证对于此测试,当您调用Web服务时,您会得到一个实际匹配的文件你想要什么(并且不仅仅匹配xsd)

答案 1 :(得分:3)

作为BizUnitExtensions(www.codeplex.com/bizunitextensions)的合着者,我同意BizUnit中的“单位”这个名称可能令人困惑,但对于Biztalk,“集成测试”是单元测试。一些Biztalk民众成功地使用模拟测试管道组件和其他测试工具(+ BizUnit / Extensions)来测试模式和地图。

不幸的是,业务流程是不透明的。但是有充分的理由。

(a)由于消息框中的庞大订阅系统 - 业务流程在激活等时使用,因此无法启动一些“虚拟”进程来托管业务流程(可以对管道进行管理.Tomas Restrepo在这些方面做了一些事情)。

(b)此外,这个虚拟过程将如何处理持久性和脱水?我敢打赌,使用WF的人在尝试完全测试工作流程时会遇到同样的问题。

(c)我们不直接使用C#,所以我们无法“注入”模拟 接口到业务流程代码。

(d)编排不是真正的“单元”。它是一个复合元素。单位是进出消息框的消息和通过表达形状调用的外部组件。即使您可以注入模拟Web服务接口,也无法注入模拟消息框和相关集以及其他内容。

可以为业务流程完成的一件事(我一直在考虑添加到BizUnitExtensions库中)来链接OrchestrationProfiler工具,因为该工具提供了所有形状的非常详细的报告,并以某种方式检查各个步骤是否已执行(也许是执行所花费的时间)。这可能会使业务流程更加白色。也考虑到业务流程调试器显示了很多变量值,当然必须有可能通过API获取该信息以显示变量的值对于给定的实例,它处于给定的点。

回到理查德的问题,我之前的开发团队有一个解决方案。基本上我们所做的是编写一个通用的可配置HttpHandler,它解析传入的服务请求并返回预设的响应。发回的响应可以根据XPath等条件进行配置。在BUILD和DEV绑定文件中,Web服务端点是模拟。这在将BUILD和DEV环境与实际的第三方Web服务隔离开来方面非常出色。这也有助于我们构建模拟和orch开发人员使用它的“契约优先”方法,同时web服务作者继续并构建实际服务。

[更新:17-FEB-09:此工具现在位于codeplex:http://www.codeplex.com/mockingbird。 如果这种方法听起来很有趣,请查看并告诉我您对该工具的看法]

现在,在有人抛出旧的“关于MOCK OBJWORK FRAMEWORKS的东西”板栗之前,让我说上面的实用程序用于Biztalk'消费者'以及非Biztalk消费者,但我也使用过NMock2和发现在编写CLR消费者时,这是一种模拟界面和设定期望的绝佳方法。 (我将很快调查MoQ和TypeMock等)。但是,由于上述原因,它不能与编排协作。

希望这有帮助。

此致

本吉

答案 2 :(得分:1)

答案 3 :(得分:0)

免责声明:我在Typemock工作。

我不确定你需要做什么,但我认为以下链接是一个好的开始:

答案 4 :(得分:0)

这是一个非常有趣的问题,我仍然没有看到一个很好的通用答案。有人建议使用SoapUI,但我还没来得及实际测试。 This page可能会很有趣。

另一种方法可能是以某种方式包装WebDev.WebHost.dll并使用它...... Phil Hakkck在this post中讨论了这个问题。

之前也在SO here上进行了讨论。

如果您找到另一种解决方案,请告诉我们!

答案 5 :(得分:0)

这是做到这一点的方法:

  

回到理查德的问题,我的   之前的开发团队有一个解决方案   基本上我们所做的就是写一个   通用可配置的HttpHandler   解析传入的服务请求和   返回预先设定的回复。该   发回的响应是可配置的   基于XPath等条件

答案 6 :(得分:-1)

我有一段时间不必这样做,但是当我测试我的Biztalk应用程序时,我总是使用soap ui或web service studio。我能够毫不费力地测试不同的输入值。

相关问题