这正是我作为 BizTalk 开发人员的主要烦恼之一 - BizTalk 不适合进行单元测试。从您进入 BizTalk 应用程序的 99% 的接口是基于消息的并且有大量可能的输入这一事实,到编排的不透明性质,BizTalk 没有提供测试功能单元的真正方法......以及......单位。
对于 BizTalk,遗憾的是,集成测试通常是唯一的游戏。
这导致,由于 Kevin Smith 没有过错,BizUnit 被 (IMO) 用词不当。一个更好的名字可能是 BizIntegrationIt。 BizUnit 提供了一系列辅助集成测试的工具,其大部分测试,例如检查文件是否已写入给定目录或向 BizTalk HTTPReceive 位置发送 HTTPRequest 严格来说都是测试集成。
既然我已经吐槽了,你所要求的是我考虑了很长时间的东西,即创建自动化单元测试的能力,让我真正相信我做一个小的改变地图不会突然破坏下游的其他东西,也是一种消除对外部服务依赖的方法。
我从来没有想过这样做的好方法,但下面是一个应该工作的解决方案,我已经单独完成了每个部分的变体,但从未尝试过以这种特定的形式在一起。
因此,鉴于希望模拟对某些外部服务(甚至可能还不存在)的调用,而不需要实际进行任何外部调用并且希望能够设置对该服务的期望调用并指定响应的性质,我能想到的唯一方法是开发一个自定义适配器。
使用自定义适配器模拟网络服务
如果您构建自定义请求-响应适配器,您可以将其插入您的发送端口以代替 SOAP 适配器。然后,您可以为适配器指定属性,使其能够充当 Web 服务的模拟。该适配器在概念上类似于环回适配器,但允许内部模拟逻辑。
您可能希望作为适配器属性包含的内容:
- 预期的文档(可能是一个磁盘位置,指定了您希望 BizTalk 应用程序发送到 Web 服务的内容示例)。
- 响应文档 - 适配器将发送回消息传递引擎的文档。
- 对测试的特定期望,例如文档元素中的查找值。
您还可以让自定义适配器写入磁盘并设置 BizUnit 步骤来验证写出的文件。
构建自定义适配器并非易事,但有可能,您可以从BizTalk Adapter Wizard 开始,还有一篇关于部署自定义适配器here 的文章。
向导生成的代码有bug,需要将new Guid(""),改为new Guid()。
还有一些在 BizTalk SDK 中构建自定义适配器的示例。
另一种选择是使用普通的 http 页面和 HTTP 请求响应,如 here 所讨论的那样,您的所有逻辑都在 http 页面中。如果您很高兴有一个 http 调用并设置一个 IIS 端口来监听您的测试,这可能会更简单。
初始化单元测试
您可以使用 .bat 文件将绑定文件导入 BizTalk 应用程序。
如果您为运行的每个测试以及标准应用程序设置创建一个新的绑定文件,那么您可以运行相应的批处理文件以应用正确的绑定。
每个绑定文件都会更改您的 Web 服务发送端口以使用模拟自定义适配器并为该测试设置特定属性。
然后,您甚至可以创建一个自定义 BizUnit 步骤,该步骤(可能)根据测试步骤中的设置生成绑定设置,然后运行 shell 命令来更新绑定。
测试消息内容
您可能要考虑的最后一件事是将所有这些真正联系在一起,是测试消息内容的某种方式。您可以在模拟适配器中执行此操作,但对于大型消息或大量可能的输入消息,这将很快变得乏味。
一种选择是创建一个调用Schematron 的自定义管道来验证它接收到的文件。 Schematron 是一种模式语言,它允许比 xsd 更丰富的文件检查级别,因此您可以检查诸如“如果元素 x 包含此内容,我希望元素 y 存在”之类的内容。
如果您构建了一个将 schematron 模式作为参数的自定义管道,那么您可以为特定的单元测试交换一个测试文件,验证该测试是否适用于该测试,当您调用 Web 服务时,您会得到一个实际匹配的文件你想要什么(不只是匹配 xsd)