首页>文章>软件开发与管理

xUnit测试模式:测试双模式

Gerard Meszaros讨论了双重测试模式,包括双重测试用法和双重测试结构。
这一章摘自这本书

本章的模式

  • 测试双
  • 测试双重使用
    • 测试存根
    • 测试的间谍
    • 模拟对象
    • 假的对象
  • 试验双结构
    • 可配置测试双
    • 硬编码测试双
  • 浪费子类

测试双

当逻辑所依赖的代码不可用时,我们如何独立地验证逻辑?

我们如何避免慢测试?

我们用“特定于测试的等价物”替换SUT所依赖的组件。

有时测试SUT非常困难,因为它依赖于不能在测试环境中使用的其他组件。出现这种情况可能是因为这些组件不可用,因为它们不会返回测试所需的结果,或者因为执行它们会产生不希望出现的副作用。在其他情况下,我们的测试策略要求我们对SUT的内部行为有更多的控制或可见性。

当我们在编写一个我们不能(或选择不)使用真正依赖组件(DOC)的测试时,我们可以用一个测试双。的测试双不必完全像真正的DOC;它只需要提供与实际DOC相同的API,以便SUT认为这是真的!

它是如何工作的

当电影的制片人想要拍摄一些有潜在风险或危险的事情,让主角执行时,他们会雇佣一个“特技替身”来代替演员在场景中表演。特技替身是一个训练有素的人,能够满足现场的特定要求。特技替身可能不会表演,但他或她知道如何从高处坠落,撞车,或做任何场景要求的事情。特技替身与演员的相似程度取决于场景的性质。通常情况下,事情可以这样安排,一个在身材上与演员模糊相似的人可以代替演员的位置。

出于测试目的,我们可以用我们的相当于“特技替身”的是测试双。在我们的夹具设置阶段四阶段测试,我们把真正的DOC换成我们的测试双。方法的行为可以硬编码,这取决于我们正在执行的测试的类型测试双或者我们可以在设置阶段配置它。当SUT与测试双,它不会意识到它不是在和真正的麦考伊说话,但我们将实现我们的目标,使不可能的测试成为可能。

不管是哪种变异测试双当我们选择使用时,我们必须记住,我们不需要实现DOC的整个接口。相反,我们只提供特定测试所需的功能。我们甚至可以建造不同的测试双打对于涉及相同DOC的不同测试。

何时使用它

我们可能需要使用某种测试双在我们的测试中,在以下情况下:

  • 如果我们有未经测试的要求(见生产错误),因为SUT及其文档都没有为SUT的间接输出提供观测点,我们需要使用它进行验证行为验证
  • 如果我们有未测试的代码(见生产错误),而DOC并没有提供一个控制点,让我们可以使用必要的间接输入来执行SUT
  • 如果我们有缓慢的测试我们希望能够更快、更频繁地运行我们的测试

每个场景都可以通过使用测试双。当然,我们在使用的时候一定要小心测试双打因为我们在测试SUT时使用的配置与在生产环境中使用的配置不同。由于这个原因,我们确实应该至少有一个测试来验证SUT在没有测试双。我们需要小心不要替换我们试图验证的SUT部分,因为这种做法可能导致测试错误的软件!还有,过度使用测试双打会导致脆弱的测试作为…的结果Overspecified软件

测试双打有几种主要的口味,如总结在图23.1。在相应的模式文章中更详细地描述了这些模式的实现变化。

图23.1测试双打的类型。虚拟对象实际上是值模式的替代方案。测试存根用于验证间接输入;测试间谍和模拟对象用于验证间接输出。伪对象提供了另一种实现。

这些变化是根据我们如何/为什么使用测试双。我们会处理一些变化构建测试双打在“实现”部分中。

变体:测试存根

我们用a测试存根替换SUT所依赖的真实组件,以便测试对SUT的间接输入有一个控制点。它的包含允许测试强制SUT沿着它可能不会执行的路径运行。我们可以进一步分类测试存根通过它们注入SUT的间接输入。一个应答器(见测试存根)注入有效值,而a破坏者(见测试存根)注入错误或异常。

有些人使用术语“测试存根”来表示仅在实际对象或过程可用之前使用的临时实现。我更愿意称这种用法为a临时测试存根(见测试存根)以避免混淆。

变体:Test Spy

我们可以用一个更有能力的测试存根,测试的间谍,作为SUT间接输出的观测点。就像一个测试存根,一个测试的间谍可能需要向SUT提供值以响应方法调用。的测试的间谍但是,它还捕获SUT在运行时的间接输出,并将它们保存下来晚些时候通过测试进行验证。因此,在许多方面,测试的间谍是" just a "测试存根有一些记录功能。而一个测试的间谍的基本用途与模拟对象,我们使用a编写的测试样式测试的间谍看起来更像是用测试存根

变体:模拟对象

我们可以用a模拟对象作为观测点来验证SUT的间接输出作为它是经过锻炼的。通常,模拟对象的功能测试存根因为它必须返回值给SUT,如果它还没有通过测试,但empha姐姐[1]是对间接输出的验证。因此,一个模拟对象不仅仅是一个测试存根plus断言:它以一种完全不同的方式使用。

变体:假物体

我们用a假的对象为了验证SUT的间接输入和输出以外的原因,在测试中取代真实DOC的功能。通常,一个假的对象实现了与实际DOC相同的功能,但方式简单得多。而一个假的对象通常是专门为测试而构建的,测试不使用它作为控制点或观察点。

使用a的最常见原因假的对象真正的DOC还不可用,太慢,或者由于有害的副作用而不能在测试环境中使用。侧栏“没有共享fixture的更快测试”描述了我们如何将所有数据库访问封装在持久层接口之后,然后用内存中的散列表替换数据库,从而使我们的测试运行速度提高50倍。第六章,测试自动化策略,第11章,使用测试双打,提供各种可用于简化SUT测试的技术的概述。

变体:虚拟对象

SUT的某些方法签名可能需要对象作为参数。如果测试和SUT都不关心这些对象,我们可以选择传入a虚拟的对象,它可以像空对象引用、object类的实例或类的实例一样简单Pseudo-Object(见硬编码测试双)。在这个意义上,a虚拟的对象不是真的吗?测试双而是价值模式的替代品文字值派生值,生成的值

变体:过程测试存根

一个测试双用过程式编程语言实现的测试存根通常被称为“测试存根”,但我更喜欢称之为“测试存根”程序测试存根(见测试存根)来区分这种用法与现代用法测试存根的变化测试双打。通常,我们用a程序测试存根允许测试/调试在等待其他代码可用时继续进行。这些对象很少在运行时“交换”,但有时我们使代码以“调试”标志为条件-一种形式的生产中的测试逻辑

实现注意事项

当我们建造时,必须考虑到几个因素测试双图23.2):

  • 是否测试双应该特定于单个测试还是跨多个测试重用
  • 是否测试双应该存在于代码中还是在运行中生成
  • 我们如何告诉SUT使用测试双(安装)

第一点和最后一点在这里讨论。的讨论测试双Generation留给了上一节可配置的测试双精度。

因为建筑技术测试双打是否完全独立于它们的行为(例如,它们适用于两者测试存根模拟对象),我选择将我们可以构建的各种方式的描述分开硬编码测试双精度可配置测试双组分成不同的模式。

图23.2带有实现选择的测试double类型。只有测试存根、测试间谍和模拟对象需要由测试进行硬编码或配置。虚拟对象没有实现;假对象被安装但不受测试控制。

变化:不可配置的测试双

既不虚拟的对象也不假的物品需要配置的,各有各的原因。接收方不应该使用假人,所以它们不需要“真正的”实现。假的物品相比之下,它们需要一个“真正的”实现,但要比它们所取代的对象更简单或“更轻”。因此,测试和测试自动化都不需要配置“固定的”响应或期望;我们只需要安装测试双让SUT把它当成真的来使用。

变体:硬编码测试Double

当我们计划使用特定的测试双在单个测试中,通常最简单的方法是硬编码测试双返回特定的值(为测试存根)或期望特定的方法调用(模拟对象)。硬编码测试双精度通常是由测试自动化人员手工制作的。它们有几种形式,包括自并励(见硬编码测试双在哪里Testcase类作为测试双;的匿名内部测试双(见硬编码测试双在哪里使用语言特性来创建测试双测试方法;和测试双独立实现考试双班(见硬编码测试双)。每个选项都将在硬编码测试双。

变化:可配置测试双

当我们想用相同的测试双实现在许多测试中,我们通常更喜欢使用可配置测试双。尽管测试自动化器可以手动构建这些对象,但是xUnit家族的许多成员都有可用于生成的可重用工具包可配置测试双组

安装测试双管

在我们可以使用SUT之前,我们必须告诉它使用测试双而不是对象测试双替换。我们可以用任何可替换的依赖的模式来安装测试双在我们的夹具设置阶段四阶段测试可配置测试双组需要在运行SUT之前进行配置,并且我们通常在安装它们之前执行此配置。

示例:Test Double

因为有各种各样的原因使用的变化测试双打,很难提供一个单独的例子来描述每种风格背后的动机。请参考前面提到的每个更详细的模式中的示例。

金宝搏188亚洲体育真人始乐InformIT促销邮件和特别优惠

我希望收到独家报价,并听到有关InformIT及其品牌家族的产品。金宝搏188亚洲体育真人始乐我可以随时退订。

概述


培生教育有限公司(Pearson Education, Inc., 221 River Street, Hoboken, New Jersey 07030)提供本网站,提供可通过本网站购买的产品和服务的信息。

本隐私声明概述了我们对隐私的承诺,并描述了我们如何收集、保护、使用和共享通过本网站收集的个人信息。请注意,培生的其他网站和在线产品及服务有其单独的隐私政策。

信息的收集和使用


为了开展业务并提供产品和服务,培生通过与本网站相关的几种方式收集和使用个人信息,包括:

问题及查询

对于查询和问题,我们会收集查询或问题,以及姓名、联系方式(电子邮件地址、电话号码和邮寄地址)以及通过“联系我们”表格或电子邮件自愿提交给我们的任何其他附加信息。我们使用这些信息来解决询问和回答问题。

在线商店

对于通过本网站上的在线商店下达的订单和购买,我们会收集订单详细信息、名称、机构名称和地址(如适用)、电子邮件地址、电话号码、送货和账单地址、信用卡/借记卡信息、送货选项和任何指示。我们使用这些信息来完成交易、履行订单、与下订单或访问在线商店的个人沟通,以及用于相关目的。

调查

培生可能提供提供反馈或参与调查的机会,包括评估培生产品、服务或网站的调查。参与是自愿的。培生收集调查问题中要求的信息,并使用这些信息来评估、支持、维护和改进产品、服务或网站,开发新产品和服务,进行教育研究以及调查中指定的其他目的。

比赛及绘图

偶尔,我们可能会赞助比赛或绘画。参与是可选的。培生收集参赛者姓名、联系方式和其他填写在参赛表格上的信息,以进行比赛或抽奖。培生可能会根据法律要求,从竞赛或抽奖的获胜者那里收集额外的个人信息,以便颁发奖品和用于税务报告目的。

时事通讯

如果您已选择接收电子邮件通讯或促销邮件和特别优惠,但想取消订阅,只需电子邮件information@金宝搏188亚洲体育真人始乐informit.com

服务公告

在极少数情况下,有必要发布严格与服务相关的公告。例如,如果我们的服务因维护而暂时停止,我们可能会向用户发送电子邮件。一般来说,用户不能选择退出这些通信,但他们可以停用他们的帐户信息。然而,这些通信在本质上不是促销。

客户服务

我们定期与用户沟通,以提供所要求的服务,并且当用户通过我们的网站提交信息时,我们会根据用户的意愿通过电子邮件或电话回复与他们的帐户有关的问题联络表格

其他信息的收集和使用


应用和系统日志

培生自动收集日志数据,以帮助确保本网站的交付、可用性和安全性。日志数据可能包括有关用户或访问者如何连接到本网站的技术信息,例如浏览器类型、计算机/设备类型、操作系统、互联网服务提供商和IP地址。我们将此信息用于支持目的和监控站点的运行状况、识别问题、改进服务、检测未经授权的访问和欺诈活动、预防和响应安全事件以及适当地扩展计算资源。

网络分析

培生可能会使用第三方网络趋势分析服务(包括Google Analytics)来收集访问者信息,如IP地址、浏览器类型、参考页面、访问过的页面以及在特定网站上花费的时间。虽然这些分析服务以匿名方式收集和报告信息,但它们可能会使用cookie来收集网络趋势信息。收集的信息可能使Pearson(但不是第三方web趋势服务)能够将信息与应用程序和系统日志数据链接起来。培生将这些信息用于系统管理、识别问题、改进服务、检测未经授权的访问和欺诈活动、预防和响应安全事件、适当扩展计算资源以及支持和提供本网站及其服务。

Cookies及相关技术

本网站使用cookie和类似的技术来个性化内容,测量流量模式,控制安全性,跟踪本网站信息的使用和访问,并提供基于兴趣的消息和广告。用户可以通过浏览器管理和阻止cookie的使用。禁用或阻止某些cookie可能会限制本网站的功能。

不要跟踪

本网站目前不响应禁止跟踪信号。

安全


培生采用适当的物理、管理和技术安全措施来保护个人信息免遭未经授权的访问、使用和披露。

孩子们


本网站不面向13岁以下儿童。

市场营销


培生可以向用户发送或直接发送营销信息,前提是

  • 培生不会将作为K-12学校服务提供商收集或处理的个人信息用于定向或有针对性的广告。
  • 这种营销符合适用法律和培生的法律义务。
  • 培生不会故意直接或发送营销通信给个人谁表示了偏好不接受营销。
  • 在适用法律要求的情况下,对营销的明示或默示同意存在且未撤销。

培生可以在有限的基础上向第三方服务提供商提供个人信息,仅代表培生或培生作为其服务提供商的关联公司或客户进行营销。营销偏好可能随时发生变化。

更正/更新个人资料


如果用户的个人身份信息发生变化(例如您的邮寄地址或电子邮件地址),我们将提供一种方法来更正或更新用户提供给我们的个人数据。这可以在帐户页面。如果用户不再需要我们的服务,并希望删除他或她的帐户,请联系我们customer-service@金宝搏188亚洲体育真人始乐informit.com我们将处理用户帐户的删除。

选择/退出


用户可以在知情的情况下选择是否继续使用InformIT提供的某些服务。金宝搏188亚洲体育真人始乐如果您选择从我们的邮件列表中删除自己,只需访问以下页面并取消您不再希望接收的任何通信:www.金宝搏188亚洲体育真人始乐informit.com/u.aspx

出售个人资料


培生不会出租或出售个人信息以换取任何金钱。

虽然皮尔逊不出售个人信息,根据内华达州法律的定义,内华达州居民可以通过电子邮件请求不出售他们的个人信息NevadaDesignatedRequest@pearson.com

加州居民补充隐私声明


加州居民应该读读我们的加州居民补充隐私声明连同本私隐声明一并提交。的加州居民补充隐私声明解释培生遵守加州法律的承诺,并适用于通过本网站和服务收集的加州居民的个人信息。

分享与披露


培生可能会在以下情况下披露个人信息:

  • 这是法律规定的。
  • 经个人同意(或其父母同意,如果个人是未成年人)
  • 在法律允许或要求的范围内响应传票、法院命令或法律程序
  • 根据适用法律保护个人、数据、资产和系统的安全
  • 与出售、合资或以其他方式转让部分或全部公司或资产有关,但须遵守本隐私声明的规定
  • 调查或处理实际的或涉嫌的欺诈或其他非法活动
  • 行使其合法权利,包括执行本网站的使用条款或其他合同
  • 培生的附属公司以及为培生工作的其他公司和组织,他们有义务按照本隐私声明保护个人信息的隐私
  • 对于学校、组织、公司或政府机构,培生在学校或代表这些组织、公司或政府机构收集或处理个人信息。

链接


本网站包含到其他网站的链接。请注意,我们不负责此类其他网站的隐私做法。我们鼓励我们的用户在离开我们的网站时保持警惕,并阅读每个收集个人信息的网站的隐私声明。本隐私声明仅适用于本网站收集的信息。

请求及联络


联系我们查阅本私隐声明,或对您的个人资料私隐有任何要求或疑问。

本隐私声明的变更


我们可能会通过更新发布来修改本隐私声明。我们将在公告中注明修订的生效日期。通常,进行更新是为了提供更大的清晰度或符合法规要求的变化。如果更新涉及个人信息的收集、保护、使用或披露的重大变化,培生将通过本网站的显著通知或其他适当方式提供变更通知。在已发布的修改证明生效日期后继续使用本网站。如果您对本隐私声明有任何疑问或疑虑,或对任何修订有任何异议,请与我们联系。

最后更新:2020年11月17日