首页 增量测试
文章
取消

增量测试

软件测试是否应先独立地测试每个模块,然后再将这些模块组装成完整的程序?还是先将下一步要测试的模块组装到测试完成的模块集合中,然后再进行测试?

第一种方法称为非增量测试“崩溃(big-bang)​”测试,而第二种方法称为增量测试集成测试

针对如下程序的各个模块

alt text

矩形框代表程序的6个模块(子程序或过程)​,连接模块间的线条代表程序的控制层次,也就是说,模块A调用模块B、C和D,模块B调用模块E等。

非增量测试

首先,对6个模块中的每一个模块进行单独的模块测试,将每个模块视为一个独立实体。根据环境(例如,是人机交互式的,还是使用批处理计算工具)和参与人数,这些模块可以同时或按次序进行测试。最后,将这些模块组装或集成(例如“连接编辑”​)为完整的程序。

首先,对6个模块中的每一个模块进行单独的模块测试,将每个模块视为一个独立实体。根据环境(例如,是人机交互式的,还是使用批处理计算工具)和参与人数,这些模块可以同时或按次序进行测试。最后,将这些模块组装或集成(例如“连接编辑”​)为完整的程序。

即需要一些mock对象。

当所有6个模块的模块测试都完成之后,就将这些模块组装成完整的程序。

增量测试

不同于独立地测试每个模块,增量测试首先将下一个要测试的模块组装到前面已经测试过的模块集合中去。然后,对这个集合进行测试。

根据从程序的顶部开始,还是从底部开始进行测试有不同的增量方式。

自底而上的增量测试

自底向上的策略开始于程序中的终端模块(此类模块不再调用其他任何模块)​。测试完这些模块之后,同样没有最佳的方法来挑选要进行增量测试的下一个模块;惟一正确的原则是,要成为合乎条件的下一个模块,该模块所有的从属模块(它调用的模块)都已经事先经过了测试。

第一步先测试模块E、C和F,可以并行测试(由三个人进行)​,也可串行进行。请注意,我们必须要为每个模块准备一个驱动模块,但不是桩模块。下一步是测试模块B和D,但不是单独地测试它们,而是分别将其与模块E和F组装在一起。换言之,要测试模块B,应编写驱动模块并集成测试用例,将模块B和E组合起来测试。将下一个要测试的模块组装到前面已经测试过的模块集合或子集中去,这个增长的过程会一直进行到测试完最后一个模块(本例中是模块A)为止。请注意,这个过程也可以自顶向下进行。

自顶向下的测试

自顶向下的测试是从程序的顶部或初始模块开始。测试开始之后,挑选哪一个后续模块进行增量测试没有惟一正确的方法;惟一的原则是:要成为合乎条件的下一个模块,至少一个该模块的从属模块(调用它的模块)事先经过了测试。

以图中程序为例子,自顶向下的测试就是先测试A模块,在测试A模块过程中,需要编写模拟B、C、D模块的桩模块。测试完A模块后,再测试B、C、D模块,以此类推。

增量测试的优点

  1. 非增量测试所需的工作量要多一些。对于图所示的程序,需要准备5个驱动模块和5个桩模块(假设顶部的模块不需要驱动模块)​。自底向上的增量测试需要5个驱动模块,但不需要桩模块。自顶向下的增量测试需要5个桩模块,但不需要驱动模块。增量测试所需的工作量要少一些,因为使用了前面测试过的模块来取代非增量测试中所需要的驱动模块(如果从顶部开始测试)或桩模块(如果从底部开始测试)​。
  2. 如果使用了增量测试,可以较早地发现模块中与不匹配接口、不正确假设相关的编程错误。这是由于尽早地对模块组合进行了集成测试。然而,如果采用非增量测试,只有到了测试过程的最后阶段,模块之间才能“互相看到”​。
  3. 如果使用了增量测试,调试会进行得容易一些。我们假定存在着与模块间接口或假设相关的编程错误(根据经验而来的合理假设)​,那么,如果使用非增量测试,直到整个程序组装之后,这些错误才会浮现出来。到了这个时候,我们就难以定位错误,因为它可能存在于程序内部的任何位置。相反,如果使用增量测试,这种类型的错误就很容易发现,因为该错误很可能与最近添加的模块有关。
  4. 增量测试会将测试进行得更彻底。如果当前正在测试模块B,要么是模块E,要么是模块A(取决于测试是从底部还是从顶部开始的)被当做结果而执行。虽然模块E或模块A先前已经进行了完全的测试,但将其作为B的模块测试结果而执行,则会诱发出一个新的情况,可能会暴露出先前测试过的模块E或模块A中存在的一个新缺陷。另一方面,如果使用的是非增量测试,对模块B的测试仅影响到其本身。换言之,增量测试使用先前测试过的模块,取代了非增量测试中使用的桩模块或驱动模块。因此,到最后一个模块测试完成时,实际的模块经受到了更多的检验。

增量测试一些小的不足

  1. 非增量测试所占用的机器时间显得少一些。
  2. 模块测试阶段开始时,如果使用的是非增量测试,就会有更多的机会进行并行操作(也就是说,所有的模块可以同时测试)​。对于大型的软件项目(模块和人员都很多)​,这可能十分重要,因为在模块测试开始之时,项目的人员数量常常处于最高峰。

两种增量测试的对比

alt text

本文由作者按照 CC BY 4.0 进行授权

设计模式 - 策略模式

-