单元测试(Unit testing)是对最小的软件设计单元(模块或源程序单元)的验证工作。 在面向对象的设计(Object Oriented Design)里,最小单元永远是类,可能是基/父类、 抽象类或派生/子类。

单元测试对构件的五方面进行测试:
 (1)模块或构件接口;
 (2)局部数据结构;
 (3)边界条件;
 (4)独立路径;和
 (5)处理错误的路径

在控制结构中的所有独立路径(基本路径)都要走遍,以保证在一个模块中的所有语句都能执行至少一次

基本路径测试和循环测试是发现更多的路径错误的一种有效技术。

计算中常见的错误有:
 (1)误解的或者不正确的算术优先级;
 (2)混合模式的操作;
 (3)不正确的初始化;
 (4)精度不够精确;
 (5)表达式的不正确符号表示。

集成测试(Integration testing),有时也称作集成与测试(I&T)是软件测试的一个阶段,在这个阶段单独的软件模块被结合在一起,作为一个群接受测试。

什么时候进行集成测试? 在三种情况下进行需要进行集成测试:
 (1)由若干单元或模块要组成一个构件;
 (2)由若干构件组成为一个工件;
 (3)由若干工件组成为一个系统。

集成测试被定义为在单元测试与系统测试之间级别的测试。

在所有的模块都已经完成单元测试之后,有人或许会问这样一个似乎很合理的问题:“如果它们每一个都能单独工作得很好,那么你为什么要怀疑把它们放在一起就不能正常工作呢?”当然,这个问题就在于“把它们放在一起”- 即接口连接问题。

数据可能在通过接口的时候丢失;
 在连接时一个模块可能对另外一个模块产生无法预料的副作用;
 当子函数被联到一起的时候,可能不能达到期望的功能;
 在单个模块中可以接受的不精确性在联起来之后可能会扩大到无法接受的程度;
 全局数据结构可能也会存在问题。

集成测试被看作是一种系统化技术,来构造程序并实施测试以发现
与接口连接有关的错误,
 它的目标是把通过了单元测试的模块拿来,构造一个在设计中所描述的程序
结构。
 有两种集成测试策略:
 瞬时集成测试,和
 增量集成测试。

瞬时集成测试(创世大爆炸)

由Myers在1979年定义的一种方法,当所有的被隔离的构件通过了测试,就把它们组合成一个最终系统,并观察它是否运转正常。

许多程序员在开发小程序的时候都会用到瞬时集成测试技术,但对大型程序不太适用。
 事实上,瞬时集成方法有这样几个缺点:
 (1)对独立组件测试需要驱动程序和树桩程序的支持;
 (2)由于所有组件都是一次性的结合在一起,所以很难找出错误的原因;
 (3)不容易辨别接口错误和其他类型的错误。
 一般情况下,不推荐瞬时集成用于任意系统,而是推荐使用增量集成策
略。

增量集成测试

是创世大爆炸的方法的对立面。
 程序先分成小的部分进行构造和测试,这个时候错误比较容易分离和修正;接口也更容易进行彻底地测试;而且也可以应用一种系统化的测试方法。
 增量集成测试会有格外的开销,但会大大减少发现和改正错误的时间,最佳的增量方法本质上取决于各个项目和不同利弊选择的考虑。

**

自顶向下集成

自顶向下的集成是一种构造程序结构的增量实现方法。模块集成的顺序是首先集成主控模块(主程序),然后按照控制层次结构向下进行集成。
隶属于(和间接隶属于)主控模块的模块按照深度优先或者广度优先的方式集成到整个结构中去。
深度优先集成是集成结构中的某一个主控路径上的所有模块。

 主控路径的选择是有些任意的,它依赖于应用程序的特性,例如,选择图中最左边的路径,模块M1, M2,和M5,将会首先进行集成,然后是M8; 或者是(如果对M2的适当的功能是必要的) M6,然后开始构造中间的和右边的控制路径。
 广度优先的集成是沿着水平的方向,把每一层中所有直接隶属于上一层模块的模块集成起来,从图中来说,模块M2, M3和M4首先进行集成,然后是下一层的M5, M6,然后继续。

在自顶向下的测试开始的时候,程序桩代替了低层的模块,因此,在程序结构中就不会有重要的数据向上传递,测试者只有下面的三种选择:
 (1)把测试推迟到程序桩被换成实际的模块之后再进行,
 (2)开发能够实现有限功能的程序桩,用来模拟实际模块,或者
 (3)从层次结构的最底部向上来对软件进行集成。

简单总结一下自顶向下的优点:

 (1)对高层行为进行早期确认:
 (2)至多只需一个驱动程序;
 (3)每步可以只加一个模块;
 (4)支持深度优先和宽度优先。

自顶向下的缺点:

 (1)对低层行为确认比较晚;
 (2)对缺少的元素需要编写树桩程序;
 (3)测试用例的输入和输出可能很难明确表示。

自底向上集成

自底向上的测试,就象它的名字中所暗示的一样,是从原子模块(也就是在程序结构的最低层的模块)开始来进行构造和测试的。每个模块由测试装置(test harness)进行测试。

自底向上的集成策略可以使用下列步骤来实现:

  1. 低层模块组合成能够实现软件特定子功能的造件(builds),有时也称为簇
    (clusters)。
  2. 写一个测试装置(一个供测试用的控制程序)来协调测试用例的输入输出。
  3. 对簇进行测试。
  4. 撤去测试装置,沿着程序结构的层次向上对造件进行组合。

总结一下自底向上的优点:

 (1)对底层行为早期进行确认;
 (2)不需要写程序桩;
 (3)对一些子树而言比较容易明确表示输入,比较容易解释对其他的输出。

自底向上的缺点:

 (1)推迟对高层行为的确认;
 (2)需要驱动程序;
 (3)当组合子树的时候,一大堆元素要进行集成

混合式集成策略可以使用下列步骤来实现:

  1. 用程序桩独立地测试用户界面。
  2. 用驱动程序测试最低层功能模块。
  3. 当集成整个系统时,只有中间层是要进行测试的对象集

混合集成测试

在实际中测试通常是结合了自顶向下和自底向上这两种方法,称作混合式集成测试(mixed testing),也称作三明治式集成测试(sandwich testing)

在由几个小组一起开发的大的软件项目中,或者一个小项目但不同模块是由不同的人进行构建的情况下,小组或个人可以对自己开发的模块采用自底向上测试,然后再由集成小组进行自顶向下测试。

混合式集成策略可以使用下列步骤来实现:

  1. 用程序桩独立地测试用户界面。
  2. 用驱动程序测试最低层功能模块。
  3. 当集成整个系统时,只有中间层是要进行测试的对象集

三种增量测试策略的比较


我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2p5qjwxvujms4