在对被测系统(system under test,简称SUT)进行单元测试(Unit Test)的过程中,经常会出现这种情况,被测系统调用了第三方依赖组件(depended-on component,简称DOC),而这个依赖组件你无法控制(或者还未实现)。为了让单元测试顺利进行,就必须摆脱对这些对象的依赖,通常会使用测试替代(Test Double)技术合理隔离(摆脱)外部依赖项,进而以提高单元测试效率。
隔离的单元测试意味着把单元测试中的对第三方组件依赖的部分合理的提取出来,用Test Double取而代之,破除依赖,使单元测试把注意力集中放在测试“单元”的逻辑上而不是和外部依赖项的交互上。
- 在项目中,我们时常会遇到由于待测系统依赖组件无法工作而造成的测试阻碍,这是严重影响项目交付的风险之一,而Test Double就是规避这个风险的手段。在测试过程中,我们使用Test Double替代真实的依赖组件去和待测系统进行交互,Test Double不必和真实的依赖组件的实现一模一样,比如不用去实现依赖组件复杂的内部逻辑等,我们只需要在满足测试需求范围内,确保对于待测系统来说Test Double提供的API是和依赖组件提供的一样的,API是怎么实现的在这个上下文就显得不重要了。基于这个特点,Test Double多用于自动化测试比如单元测试和集成测试。
- 那么Test Double就是万能的吗?显然不是,毕竟我们是使用的是替代品而不是真实产品环境的配置,所以我们需要至少有一个测试去验证使用真实依赖对象的产品。此外,要时刻注意我们是使用Test Double去代替待测系统的依赖对象而不是直接去代替待测系统的部分功能,不然我们就在测试一个“错误”的产品。
Test Double可以细分为:
- 虚拟对象(dummy)
- Test Stub
- 间谍(spy)
- 模拟对象(mock)
- 伪对象(fake)
对于初学者来说,这些分类会让人很头疼,它们彼此之间太像了,得深入学习才能真正掌握并区分彼此。截止书稿,我也还未能区分的很清楚,得后续继续学习。
有关Test Double的更多介绍,可参考: