我目前正在调查难以进入的领域的单元测试(这是一个非常高级的观点,我知道)并且我遇到了这个问题:存根/模拟或服务虚拟化?
我正在阅读以寻求答案,但我能找到的唯一资源似乎来自SV供应商(显然有偏见)。
当一个人比另一个人更合适时,是否可以想到一些例子?为什么?如果答案是“它取决于”,那么请建议为什么/什么。似乎可以通过任何一种方式实现相同的结果 - 这是时间问题(开发)或可用资金(GreenHat等并不便宜!)。
提前致谢!
编辑:
检查了下面发布的其中一个链接(1),我认为这就是我所得到的:
“虚拟服务只是您可以自己创建的测试存根。
虽然您可以编写自己的存根,但是一旦您通过非常简单的行为,在整个软件开发生命周期中模拟您依赖的所有系统的工作量和成本就会变得非常大。服务虚拟化要求自动化,因为模拟和建模可以通过软件的直接观察来进行,而不需要手动编码和调整。否则,您可能会花费尽可能多的时间维护存根环境,就像构建和测试应用程序功能本身一样。“
基本上与任何工具相同,嗯?
答案 0 :(得分:4)
好问题。基本上,存根将测试套件与环境断开连接,服务虚拟化模拟环境以便更好地实现测试的真实意图。
更详细......
Stubs为对象,方法或函数提供替换实现,以便删除外部依赖项。存储器通常在单元和组件测试期间用于两个主要目的: 1)将待测代码与集成环境隔离 2)在无法访问外部资源或有问题的方法/功能/对象时启用测试。
如果您正在尝试编写单元测试并需要替换对数据库,外部库(例如,文件I / O)或其他系统API的简单调用,则存根可能非常适合您的需求。
虽然存根/模拟通常用于“跳过”不可用的系统组件,但服务虚拟化允许团队成员模拟环境(或特定组件)并使其行为可供整个团队使用。例如,服务虚拟化可能用于模拟正在发展,尚未可用或难以访问/配置的从属组件(如第三方服务,数据库,大型机,打包应用程序等)的行为。测试
服务虚拟化可以代表比简单存根和模拟更加真实的行为。如果可以访问从属应用程序,则可以通过从实时系统进行记录来捕获其在“虚拟资产”中的当前行为。或者,您可以对表示预期行为的虚拟资产建模。然后,您可以通过参数化其条件行为,性能标准和测试数据来配置此虚拟资产。此外,您可以轻松修改虚拟资产,以生成适当的故障条件,异常等,以便验证所有系统行为。
Parasoft,我工作的公司,解决了这两个用例。我们的开发测试平台促进了单元测试的存根生成和管理,我们获得Jolt奖项的Parasoft Virtualize产品提供了服务虚拟化。有关详细信息,请参阅http://www.parasoft.com/service-virtualization和http://www.parasoft.com/development-testing。
答案 1 :(得分:1)
IMO,单元测试不应依赖外部服务,包括服务虚拟化。
在编写集成测试,功能测试,端到端测试时,您只需要在外部服务上连接这些依赖项。
虽然所有这些类型都可以在JUnit等测试框架中编写或驱动,但它们是不同类型的测试。
答案 2 :(得分:1)
以下是InfoQ文章,其中概述了差异:Stubbing, Mocking and Service Virtualization Differences for Test and Development Teams
来自文章:
Stub :接口的最小实现,通常返回与测试套件紧密耦合的硬编码数据。当测试套件很简单并且在存根中保留硬编码数据不是问题时,它是最有用的。一些存根是手写的;有些可以通过工具生成。存根通常由开发人员编写以供个人使用。它可以与测试人员共享,但更广泛的共享通常受到与软件平台和硬编码的部署基础架构依赖关系相关的互操作性问题的限制。通常的做法是,存根在进程中直接使用单元,模块和验收测试的类,方法和函数。一些开发人员会说存根也可以启动,但是你无法验证存根上的调用。存根也可以“通过网络”进行通信,例如HTTP,但有些人认为在这种情况下它们应该被称为虚拟服务。
模拟:可编程接口观察器,可根据测试定义的预期验证输出。它经常使用第三方库创建,例如在Java中,即Mockito,JMock或WireMock。当您拥有大量测试并且存根不足时,它是最有用的,因为每个测试需要不同的数据设置并且将它们保存在存根中将是昂贵的。模拟让我们在测试中保持数据设置。模拟器通常由开发人员编写供个人使用,但可以与测试人员共享。但是,更广泛的共享通常受到与软件平台和硬编码的部署基础架构依赖关系相关的互操作性问题的限制。他们通常直接使用类,方法和函数进行单元,模块和验收测试。 Mock基于满足预定义标准的给定请求(也称为请求或参数匹配)提供响应。模拟也关注交互而不是状态,因此模拟通常是有状态的。例如,您可以验证调用给定方法的次数或对给定对象的调用顺序。
虚拟服务:通常作为软件即服务(SaaS)提供的测试对象,始终是远程调用的,并且永远不会直接使用方法或函数进行处理。通常通过使用其中一个服务虚拟化平台记录流量来创建虚拟服务,而不是基于接口或API文档从头开始构建交互模式。虚拟服务可用于为团队建立共同基础,以便与其他开发团队以及测试团队进行通信和促进工件共享。远程调用虚拟服务(通过HTTP,TCP等)通常支持多种协议(例如HTTP,MQ,TCP等),而存根或模拟通常仅支持一种。有时,虚拟服务需要用户进行授权,尤其是在具有企业范围可见性的环境中部署时。用于创建虚拟服务的服务虚拟化工具通常具有用户界面,这些用户界面允许较少精通技术的软件测试人员在深入了解特定协议如何工作的细节之前立即投入运行。它们有时由数据库支持。它们还可以模拟系统的非功能特性,例如响应时间或慢速连接。有时,您可以找到为给定请求条件提供一组存根响应的虚拟服务,并将每个其他请求传递给实时后端系统(部分存根)。与模拟类似,虚拟服务可以具有相当复杂的请求匹配器,允许为许多不同类型的请求返回一个响应。有时,虚拟服务通过基于请求属性和数据构建响应的一部分来模拟系统行为。
通常很难确定测试双重适合以下哪个类别。它们应被视为光谱而不是严格的定义。
答案 3 :(得分:0)
我们的意思是SV可以比存根更能真实地表示行为。服务虚拟化不需要作为孤岛运行;它们可以代表复合行为。例如,在一个虚拟端点中转移资金的呼叫可以触发另一个虚拟端点的帐户余额更新。这允许虚拟资产以有状态的方式运行,并允许您轻松地模拟整个系统的行为 - 即使行为跨越多个连接,协议或接口。