单元测试是软件测试过程中的重要组成部分,指的是对程序中单个子程序或过程进行测试的过程。单元测试针对的不是整个程序,而是针对构成整体的较小的程序模块上进行的测试。单元测试的目的是将模块实现后的功能与与需求规定的模块的功能说明进行比较,并发现实现与需求不满足的部分。
1、测试用例的设计
单元测试总体上是面向白盒测试的。相对于程序的总体测试,白盒测试相对更加容易;另外对于后续模块而言,当前模块测试完成后可以着眼于发现其他类型的错误。
单元测试中测试用例的设计过程:
①使用一种或多种白盒测试方法分析模块的逻辑结构;
②使用黑盒测试方法依照需求说明补充测试用例(如进行边界条件测试等)。
2、增量测试和非增量测试
在进行模块测试的过程中,除了设计有效的测试用例之外,也需要重点考虑如何将单元测试组装到工作程序中。这部分涉及到以下内容:
- 测试用例的编写形式;
- 测试工具类型;
- 模块编码和测试顺序;
- 生成测试用例成本及调试成本。
在实际测试中,可以选择两种方法:
- 非增量测试:先独立地测试每一个模块,再将各个模块组装成完整的程序;
- 增量测试:现将下一步要测试的模块组装到测试完成的模块集合中在进行测试。
在进行非增量测试时,需要对每一个模块开发一个驱动模块(用于传递测试用例)和多个桩模块(用来模拟输出模块)。在对每一个模块进行测试完成后。将这些模块组装为一个完整的程序。
再进行增量测试时,需要考虑采用自顶向下还是自底向上的方法。在自底向上的方法中,首先针对最终端的模块设定驱动模块(不需要桩模块)。待测试完成后,将上一级的模块与刚测试完成的底层模块组合起来 ,再制定驱动模块进行测试。循环这个过程直到最后一个模块测试完成。
增量测试和非增量测试的特点:
- 非增量测试需要更多的工作量,因为需要针对每一个模块制定驱动模块和桩模块。增量测试一般只需要二者其一。
- 增量测试可以更早地发现模块间接口的不匹配,而非增量测试只有在最后的集成阶段才能发现类似错误。
- 增量测试更容易调试,尤其是对于模块间接口相关的错误。
- 增量测试更为彻底,因为在集成过程中可能会暴漏之前未发现的新问题。
- 非增量测试占用机器运行时间较少,因为避免了多个模块一起运行和已经测试过模块的重复运行。
- 非增量测试更容易并行操作,因为各个模块之间耦合度较低。
3、自顶向下测试与自底向上测试
自顶向下测试和自底向上测试都是增量测试的方法,这里主要讨论二者的不同。
(1)自顶向下测试
自顶向下测试从程序的顶部或初始模块开始。对于此类测试,需要对每一个待测试模块的输出结果设定“桩模块”来模拟后续模块的功能。需要注意的是,桩模块并非仅仅起到一个标识“该模块已被调用”的角色。很多时候后续模块需要向前面的模块返回信息供后续操作,这时“桩模块”将在测试中起到远比标识更加重要的角色,即可以影响模块的行为。
(2)自底向上的测试
自底向上测试与自顶向下测试相对。自底向上测试以软件的终端模块开始,对每一个模块都需要一个特殊的驱动模块用于输入有效的测试输入、调用被测试模块并显示输出或比较结果。在自底向上测试中不存在早起程序框架的概念,因为只有完成最后一个模块之后才形成完整的、可工作的程序。