我在使用 BizUnit 单元的测试我的管理业务流程,但一些业务流程消耗服务和测试这些似乎更像一体化检测比单元的测试。

我很熟悉使用的一种嘲讽的框架,以模拟生成的代理目的,为了测试一个网络服务从一个窗形式的应用,但是我希望能够这样做在一个更加综合的方式的请求-回应的港口?

你会如何处理这个问题?

有帮助吗?

解决方案

这样下去的心脏,我的一项主要的刺激作为管理开发人员-管不适合它自己单元的测试。从实际上99%的接口进入管理应用的信息基础,并有一个巨大数量的可能投入,通过不透明性质的业务流程,管理提供没有真正的测试方式单元的功能...嗯...单元。

为管、集成试验遗憾的是常常在镇上唯一的游戏.

结果,由于没有过错的一部分,凯文*史密斯,BizUnit正(海事组织)一词不当。一个更好的名字也许是BizIntegrationIt.BizUnit提供一系列工具,协助一体化测试,其大部分的测试样检查,如果一个文件已写入一个给定的目录,或发送电http请求的一个管HTTPReceive位置都是严格来说,测试的集成。

现在,我已经得到这种夸夸其谈,什么你问的是我已经想的很长时间,能够建立自动化的单元的测试,得到一些真正的信心,我制作一个小的变化地图不会突然断裂的东西其他下游,以及作为一种方式来删除依赖于外部的服务。

我从未想到任何好的方式这样做,但下面是一个解决方案, 应该 的工作,我已经做了变化的每个部分的这个孤立的,而是从来没有尝试过,但他们都一起在这个特定的形式。

所以给予的愿望,模拟一个叫到一些外部服务(可能甚至不存在),而不需要实际上使任何外部呼叫 想要有能力设置的预期这一服务电话和指定性质的响应,唯一的方法我可以想到的是开发一个自定义的适配器。

模拟服务使用的定义适配器

如果你建立一个自定义的请求-回应器你可以把它插进你送口中的肥皂的适配器。然后你可以指定性质的适配器,允许它表现为一种嘲笑你的服务.转接器将在概念上类似于环回适配器,但会允许内部嘲讽的逻辑。

东西,你可能会想到包括作为适配器性能:

  • 预期文件(或许是一个磁盘上的位置规定一个例子什么你希望你的管理应用程序发送的服务).
  • 响应的文档的文件,适配器会送回来的消息引擎。
  • 具体的期望的测试,例如查找值号文件中的要素。

你可能还有定义适配器写入磁盘,并设置一个BizUnit步骤,以验证的文件,该文件是书面的。

建设一个自定义的适配器是非微不足道,但是可能的,你可以得到一个良好的开始 管理适配器向导 有一篇文章,在部署自定义适配器 在这里,.

有一个错误代码产生的向导,你会需要改变 new Guid(""),new Guid().

也有一些例子的建筑物定义的适配器在管SDK。

另一个选择是使用纯http页以及HTTP请求的响应作为讨论的 在这里,, 所有你的逻辑是在http页。这可能是简单的如果你是幸福的具有http呼叫,并设立一个IIS口听你的测试。

初始化单元的测试

你可以进口的结合文件管理应用程序使用。蝙蝠文件。

如果你让一个新的结合文件,对于每一个测试,你的运行,以及对标准的应用程序设置,然后可以运行相应的批文件,应用正确的结合。

每个结合文件将改变你的服务sendport要使用模拟的定义适配器和设置具体的属性测试。

你可以那么即使做一个自定义BizUnit步骤,(可能)产生的约束力的设置基础设置在检验步骤然后跑的命令更新的绑定。

测试邮件内容

最后的事情,你可能想要考虑,要真正把所有这一起,为一些方法测试的内容的信息。你可以这样做在你的模拟器,但会获得繁琐,非常迅速地对大型邮件、或大范围的可能输入信息。

一种选择是让一个定义管道,呼叫 验证的文件,它接收。在一个模式语言,它允许一个更加丰富的水平的文件,检查文件,所以你可以检查的东西像"如果元素x包含这一内容,我希望元y要存在"。

如果你建立了一个定义管道,把一个在架构作为一个参数,然后就可以交换在测试文件,用于一个特定单元的测试、验证,对于该试验,当你打电话的服务你得到一个文件,该文件实际上比赛你想要什么(而不仅仅是匹配的文件)

其他提示

作为BizUnitExtensions(www.codeplex.com/bizunitextensions)的合着者,我同意名称“unit”。在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开发人员使用它的方法,而webservice作者继续并构建实际服务。

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

现在,在有人抛出旧的“什么关于模拟对象框架”之前,栗子在,让我说上面的实用程序用于Biztalk'消费者'以及非Biztalk消费者,但我也曾与NMock2合作,并发现这是一个很好的方式来模拟接口和设置CLR消费者时的期望。 (我将很快调查MoQ和TypeMock等)。但是,由于上述原因,它不能与编排协作。

希望这有帮助。

此致

本吉

别。

不要对任意接口进行测试,也不要为它们创建模拟。

大多数人似乎将开发人员(单元)测试视为用于测试非常重要的单个功能单元(如单个类)。另一方面,对主要子系统或整个系统进行客户(验收/集成)测试也很重要。

对于Web服务,非常重要的功能单元隐藏在实际执行有意义服务的类中,位于通信线路后面。这些类应该有单独的开发人员测试类来验证他们的功能,但完全没有任何面向Web服务的通信连接。当然,但也许并不明显,这意味着您的功能实现必须与您的布线实现分开。因此,您的开发人员(单元)测试永远不应该看到任何特殊的通信线路;这是整合的一部分,它可以(适当地)被视为“演示”。问题而不是“业务逻辑”。

客户(接受/整合)测试应该解决更大规模的功能,但仍然没有关注“演示”和“演示”。的问题。这就是使用Facade模式的常见方式 - 使用统一的,粗粒度的,可测试的接口来暴露子系统。同样,Web服务通信集成是无关紧要的,并且是单独实现的。

但是,实现一组实际包含Web服务集成的单独测试非常有用。但我强烈建议不要只测试该集成的一方:端到端测试。这意味着构建像Web服务客户端一样的测试,就像真正的生产代码一样;他们应该完全按照真实应用程序的方式使用Web服务,这意味着那些测试然后作为必须实现此类应用程序的任何人的示例(如果您销售库,则像客户一样)。 / p>

那么,为什么要去那么麻烦?

  1. 您的开发人员测试验证您的功能是否在小型工作,无论其如何访问(独立于表示层,因为它都在业务逻辑层内)。

  2. 您的客户测试会在业务逻辑层的界面边界验证您的功能是否在大型工作,无论其访问方式如何。

  3. 您的集成测试验证您的表示层是否适用于您的业务逻辑层,现在可以管理,因为您现在可以忽略基础功能(因为您在上面单独测试了它)。换句话说,这些测试主要集中在漂亮的脸层(GUI?)和通信界面(Web服务?)上。

  4. 当您添加另一种访问功能的方法时,您只需为该新访问形式(表示层)添加集成测试。您的开发人员和客户测试可确保您的核心功能保持不变且不会中断。

  5. 您不需要任何特殊工具,例如专门用于Web服务的测试工具。您可以使用在生产代码中使用的工具/组件/库/技术,就像在此类生产代码中使用它们一样。这使您的测试更有意义,因为您没有测试其他人的工具。它可以为您节省大量时间和金钱,因为您不会购买,部署,开发和维护特殊工具。但是,如果您正在通过GUI进行测试(不要这样做!),那么您可能需要一个特殊工具(例如,HttpUnit?)。

  6. 所以,让我们具体化吧。假设我们想要提供一些功能来跟踪自助餐厅的每日菜单(因为我们在一个巨型公司工作,因为它有自己的咖啡馆,我的)。假设我们的目标是C#。

    我们为菜单,菜单项和其他细粒度的功能及其相关数据构建了一些C#类。我们使用使用nUnit执行开发人员测试的nAnt建立一个自动构建(你这样做,对吧?),我们确认我们可以构建一个每日菜单并通过所有这些小块来查看它。

    我们已经了解了我们的目标,因此我们通过创建一个暴露少数方法的类来应用Facade模式,同时隐藏大部分细粒度的碎片。我们添加了一组单独的客户测试,只能通过新的外观运行,就像客户一样。

    现在我们决定为我们的超级公司知识工作者提供一个网页,以检查今天的自助餐厅菜单。我们编写一个ASP.NET页面,让它调用我们的外观类(如果我们正在进行MVC,它将成为我们的模型)并部署它。由于我们已经通过客户测试对外观类进行了全面测试,并且由于我们的单个网页非常简单,因此我们放弃对网页编写自动化测试 - 使用一些知识工作者进行手动测试就可以了。 / p>

    稍后,我们开始添加一些主要的新功能,例如能够预订我们当天的午餐。我们扩展了细粒度类和相应的开发人员测试,因为我们已经存在的测试可以防止我们破坏现有功能。同样,我们扩展了我们的Facade类,甚至可能随着接口的增长而拆分一个新的类(例如,MenuFacade和OrderFacade),并添加了类似的客户测试。

    现在,或许,对网站的更改(两个页面是一个网站,对吗?)使手动测试不能令人满意。因此,我们引入了一个与HttpUnit相当的简单工具,允许nUnit测试网页。我们实现了一系列集成/演示测试,但是针对我们的外观类的模拟版本,因为这里的重点只是网页的工作 - 我们已经知道外观类的工作。测试通过模拟外观推送和拉取数据,只是为了测试数据成功地将其传递到另一侧。没什么。

    当然,我们的成功促使首席执行官要求(要求)我们将网络应用程序暴露给mega-corp的黑莓手机。因此,我们实施了一些新页面和一组新的集成测试。我们不必触及开发人员或客户测试,因为我们没有添加新的核心功能。

    最后,CTO要求(要求)我们将我们的自助餐厅应用程序扩展到所有mega-corp的机器人工作者 - 您在过去几天内注意到了它们?所以,现在我们添加一个通过我们的外观进行通信的Web服务层。同样,我们的核心功能,开发人员测试或客户测试都没有变化。我们通过创建使用等效Web服务API公开Facade的类来应用Adapter / Wrapper模式,并创建客户端类来使用该API。我们添加了一组新的集成测试,但他们使用普通的nUnit来创建客户端API类,它们通过Web服务连接与服务端API类进行通信,这些类调用模拟外观类,这确认了我们的布线工作。

    请注意,在整个过程中,除了我们的生产平台和代码,我们选择的开发平台,一些用于自动化构建和测试的开源组件以及一些定义明确的测试电池之外,我们不需要任何重要的内容。另请注意,我们没有测试任何我们在生产中不使用的内容,也没有测试过两次。

    我们最终拥有一个可靠的核心功能(业务逻辑层),已证明自己已经成熟(假设)。我们有三个独立的表示层实现:一个针对桌面的网站,一个针对黑莓的网站,以及一个Web服务

免责声明:我工作在Typemock.

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

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

另一种方式可能是以某种方式包装WebDev.WebHost.dll并使用它... Phil Hakkck在这篇文章

之前还要讨论过这个问题,如这里

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

这是做到这一点的方法:

  

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top