某设计人员习惯于把所有模块按设计要求一次全部组装起来,然后进行整体测试,这称为非增量式集成。这种方法容易出现混乱。因为测试时可能发现一大堆错误,为每个错误定位和纠正非常困难,并且在改正一个错误的同时又可能引入新的错误,新旧错误混杂,更难断定出错的原因和位置。与之相反的是增量式集成方法,程序一段一段地扩展,测试的范围一步一步地增大,错误易于定位和纠正,界面的测试亦可做到完全彻底。下面讨论两种增量式集成方法。
一、自顶向下集成
自顶向下集成是构造程序结构的一种增量式方式,它从主控模块开始,按照软件的控制层次结构,以深度优先或广度优先的策略,逐步把各个模块集成在一起。深度优先策略首先是把主控制路径上的模块集成在一起,至于选择哪一条路径作为主控制路径,这多少带有随意性,一般根据问题的特性确定。以下图为例,若选择了最左一条路径,首先将模块 M1,M2,M5 和 M8 集成在一起,再将 M6 集成起来,然后考虑中间和右边的路径。广度优先策略则不然,它沿控制层次结构水平地向下移动。仍以下图为例,它首先把M2、M3 和M4 与主控模块集成在一起,再将M5和M6 和其他模块集资集成起来。
自顶向下集成测试的具体步骤为:
(1) 以主控模块作为测试驱动模块,把对主控模块进行单元测试时引入的所有桩模块用实际模块替代;
(2)依据所选的集成策略(深度优先或广度优先),每次只替代一个桩模块;
(3)每集成一个模块立即测试一遍;
(4)只有每组测试完成后,才着手替换下一个桩模块;
(5)为避免引入新错误,须不断地进行回归测试(即全部或部分地重复已做过的测试)。
从第二步开始,循环执行上述步骤,直至整个程序结构构造完毕。
自顶向下集成的优点在于能尽早地对程序的主要控制和决策机制进行检验,因此较早地发现错误。缺点是在测试较高层模块时,低层处理采用桩模块替代,不能反映真实情况,重要数据不能及时回送到上层模块,因此测试并不充分。解决这个问题有几种办法,第一种是把某些测试推迟到用真实模块替代桩模块之后进行,第二种是开发能模拟真实模块的桩模块;第三种是自底向上集成模块。第一种方法又回退为非增量式的集成方法,使错误难于定位和纠正,并且失去了在组装模块时进行一些特定测试的可能性;第二种方法无疑要大大增加开销;第三种方法比较切实可行,下面专门讨论。
二、自底向上集成
自底向上测试是从“原子”模块(即软件结构最低层的模块)开始组装测试,因测试到较高层模块时,所需的下层模块功能均已具备,所以不再需要桩模块。
自底向上集成测试的步骤分为:
(1)把低层模块组织成实现某个子功能的模块群(cluster);
(2)开发一个测试驱动模块,控制测试数据的输入和测试结果的输出;
(3)对每个模块群进行测试;
(4)删除测试使用的驱动模块,用较高层模块把模块群组织成为完成更大功能的新模块群。
从第一步开始循环执行上述各步骤,直至整个程序构造完毕。
自底向上集成方法不用桩模块,测试用例的设计亦相对简单,但缺点是程序最后一个模块加入时才具有整体形象。它与自顶向集成测试方法优缺点正好相反。因此,在测试软件系统时,应根据软件的特点和工程的进度,选用适当的测试策略,有时混和使用两种策略更为有效,上层模块用自顶向下的方法,下层模块用自底向上的方法。
此外,在集成测试中尤其要注意关键模块,所谓关键模块一般都具有下述一或多个特征: ①对应几条需求;②具有高层控制功能;③复杂、易出错;④有特殊的性能要求。关键模块应尽早测试,并反复进行回归测试。
以上介绍了一些进行集成测试的具体方案,不同的项目,测试经理可以根据实际情况选择。但是在实施之前,必须给出实施的步骤和时间规划。
4.4.3 系统测试
系统测试应该由若干个不同测试组成,目的是充分运行系统,验证系统各部件是否都能正常工作并完成所赋予的任务。下面简单介绍几类系统测试。
(1)验证测试
以前期的用户需求规格说明书的内容为依据,验证系统是否正确无误的实现了需求中的全部内容。
(2)强度测试
强度测试检查程序对异常情况的抵抗能力。强度测试总是迫使系统在异常的资源配置下运行,验证系统的健壮性是否可靠。
(3)性能测试
对于那些实时系统,软件部分即使满足功能要求,也未必能够满足性能要求,虽然从单元测试起,每一测试步骤都包含性能测试,但只有当系统真正集成之后,在真实环境中才能全面、可靠地测试运行性能系统性能测试是为了完成这一任务。性能测试有时与强度测试相结合,经常需要其他软硬件的配套支持。
编辑评论意见 (田俊国)
测试和过程控制是构筑软件质量的两个重要环节,也是软件工程化的重要标志。然而,我国大多数中小型软件企业,对软件测试的重视还很不够, 媒体上介绍软件测试的文章也很少。因此,很多软件工程师对测试知之甚少,甚至对测试心存偏见,不少人认为测试工程师比开发工程师低一个档次。而这一点在国外正好相反,在美国,没有三年以上软件开发经验的人是不能做测试工程师的。
本文比较系统地介绍了软件测试的方方面面,有技术也有方法;有理论也有作者的实战体会;更可贵的是专业的测试理念贯穿全文,比如: 测试的目的是找错误,但不仅仅局限于找错误;测试是在软件开发过程的末尾进行的,但测试人员却要从需求分析阶段就介入项目组… …
文章深入浅出,通俗易懂, 的确是一篇不可多得的软件测试知识普及性文章。相信软件开发同行们会从中大受裨益,参加软件专业资格水平考试的朋友们更是不可不读。
编辑评论意见 (胡志华)
当我还是一名程序员的时候,我也曾为测试而焦头烂额,我也曾对测试员刁难和不顾;当我作为测试员的角色时,也因无从下手而懊恼,面对测试计划也表示怀疑和不解;我也曾制定测试计划、编写测试用例,主持或参与对软件或网站的验收。相信我所遭遇的艰难,您也曾遭遇或者您也许会遭遇,在这个时候,我们都需要交流和学习,也许阅读这篇文章就是一个选择啊。