传统的单元测试包括了驱动模块(driver) 和桩模块(stub)。
驱动模块
-
概述
- 在大多数场合称为"主程序",它接收测试数据并将这些数据传递到被测试模块.
- 单元测试一个函数单元时,被测单元本身是不能独立运行的,需要为其传送数据,为此写驱动
- 驱动模块是用来模拟被测试模块的上一级模块,相当于被测模块的主程序。
- 它接收数据,将相关数据传送给被测模块,启用被测模块,并打印出相应的结果。
- 驱动模块(Driver)可以通过模拟一系列用户操作行为,比如选择用户界面上的某一个选项或者按下某个按钮等,自动调用被测试模块中的函数。
- 驱动模块(Driver)设置,使对模块的测试不必与用户界面真正交互。
-
驱动模块主要完成以下事情:
- 1、接受测试输入;
- 2、对输入进行判断;
- 3、将输入传给被测单元,驱动被测单元执行;
- 4、接受被测单元执行结果,并对结果进行判断;
- 5、将判断结果作为用例执行结果输出测试报告。
桩模块
-
概述
- 桩模块是指模拟被测试的模块所调用的模块,而不是软件产品的组成的部分。
- 主模块作为驱动模块,与之直接相连的模块用桩模块代替。
- 在集成测试前要为被测模块编制一些模拟其下级模块功能的“替身”模块,以代替被测模块的接口,接受或传递被测模块的数据,这些专供测试用的“假”模块称为被测模块的桩模块。
- 如果被测试的单元模块需要调用其他模块中的功能或者函数(method),我们就应该设计一个和被调用模块名称相同的桩模块来模拟被调用模块。这个桩模块本身不执行任何功能仅在被调用时返回静态值来模拟被调用模块的行为。
-
举例说明:
- 如果被测试单元中需要调用另一个模块customer的函数 getCustomerAddress(customerID: Integer),这个函数应该查询数据库后返回某一个客户的地址。
- 我们设计的同名桩模块(Stub)中的同名函数并没有真正对数据库进行查询而仅模拟了这个行为,直接返回了一个静态的地址例如"123 Newton Street"。桩模块的设置使得单元测试的进行成为一个相对独立且简单的过程。
总结
- 桩模块的使命除了使得程序能够编译通过之外,还需要模拟返回被代替的模块的各种可能返回值(什么时候返回什么值需要根据测试用例的情况来决定)。
- 驱动模块的使命就是根据测试用例的设计去调用被测试模块,并且判断被测试模块的返回值是否与测试用例的预期结果相符