【转】扩展知识系列之----01 Test Double

Test Double

06年Gerard Meszaros提出了这个概念。Test Double代表为了达到测试目的并且减少被测试对象的依赖,使用“替身”代替一个真实的依赖对象,从而保证了测试的速度和稳定性。

在单元测试时,使用Test Double有下列好处:
1、减少对被测对象的依赖,使得测试更加单一
2、让测试案例执行的时间更短,运行更加稳定
3、对SUT(待测系统)内部的输入输出进行验证,让测试更加彻底深入

备注:若待测系统使用的语言环境比较容易使用依赖注入,那么就较容易实现Test Double,否则比较费劲。
Test Double是测试中替换待测系统的某个部分从而实施测试的通用术语,包含下列几种类型:

1、Test Stub

测试桩是单元测试最常用的术语之一。用于接受特定的输入参数调用,然后返回特定的值;不在约定范围的调用没有响应或都是采用默认响应。Test Stub实际就是在SUT内部打的一个桩,按照之前约定返回特定的内容给调用者。

Test Stub最主要特点是:交互完全在待测系统内部,它不会返回内容给测试用例,此外也不会对SUT内部的输入进行验证。

书中示意代码如下:

2、Test Spy

就跟Test Spy名字中间谍一样,它是安插在待测系统内部,专门负责将待测系统内部的间接输出传到外部。

它的主要特点是将内部的间接输出返回给测试用例,由测试用例进行验证。

注意:Test Spy只负责获取内部信息,并把这些信息发出去,不负责验证信息的正确性。

事例代码如下:

3、Mock Object

Mock Object是最常见的形式,存在xMock框架等。

它类似于Test Spy,安插在待测系统内部,获取到待测系统内部的间接输出,一般根据调用者输入,按照约定执行操作,然后返回调用者事先编码写好的预期结果。

Mock Object主要的特点是它还会对调用进行验证,若碰到不在预期范围的调用还会抛出异常。

4、Fake Object

它拥有几乎和实际对象一样的功能,一般为了规避生产环境复杂性或真实系统还没有研发出来而引入替代系统或模块,最常见情况如通过内存数据库来代替实际生产数据库等。

5、Dummy Object

指在测试中须传入的对象,但实际又不使用。通过仅仅是为了能调用被测对象而必须传入的参数,比如用于填充参数列表。

书中事例代码如下。

下面列出了一些可用的Test Double工具

Java
mockito
wiremock
moco

Python
doublex - Powerful test doubles framework for Python
mock - (Python standard library) A mocking and patching library
httpretty - HTTP request mock tool for Python.

JavaScript
jsmockito
sinonjs

参考:

http://xunitpatterns.com/Test Double.html
https://www.jianshu.com/p/7a04f28b08a6
https://zuozewei.blog.csdn.net/article/details/118087539

posted @ 2021-12-10 17:06  雨 燕  阅读(201)  评论(0)    收藏  举报