6.5.2 集成测试
集成测试的目的是确保各单元组合在一起后能够按既定意图协作运行,并确保增量的行为正确。它所测试的内容包括单元间的接口以及集成后的功能。一般使用黑盒测试方法测试集成的功能,并且对以前的集成进行回归测试。
集成测试关注的是组装系统或者子系统的各个软件单元之间的交互,测试的主要任务是发现软件单元之间的接口、接口之间的数据传递关系和其他与接口有关的各种错误,以及各个软件单元组合后是否实现预期的功能。
(1)集成测试任务
①将各个软件单元组装起来时,各个软件单元在通过接口进行数据交互的时候,数据是否会发生丢失的情况;
②将各个软件单元组装成系统或者子系统时,能否达到预期设计的各项功能要求;
③某一个软件单元的功能会不会对其他的软件模块产生不良的影响;
④全局数据结构是否有问题,是否会被不正常修改;
⑤每个软件单元所产生的误差累积起来,是否会被放大,从而造成整个系统的误差达到不能接受的程度。
(2)集成测试原则。
为了保证在进行集成测试的时候,能够很好地完成测试工作,应该遵循以下11个基本原则。
①所有的公共接口都要被测试到;
②所有的关键模块必须进行充分的测试;
③集成测试应当按照一定的层次进行;
④集成测试的策略选择应当综合考虑质量、成本和进度之间的关系;
⑤集成测试应当尽早开始,并以总体设计为基础;
⑥在模块和接口的划分上,测试人员应当和开发人员进行充分的沟通;
⑦当测试计划中的结束标准满足时,集成测试才能结束;
⑧当接口发生修改时,涉及的相关接口必须进行再次的测试;
⑨集成测试应该根据集成测试计划和方案进行,不能随意测试;
⑩项目管理者应该保证测试用例经过审核;
⑪测试执行结果应当如实记录。
(3)集成测试方法。
一般集成测试有两种方法,一种方法是分别测试各个模块,再把这些模块组合起来进行整体测试,这种方法称为非增量集成测试。另一种方法是把一个要测试的模块组合到已测试好的模块中,测试完后再将一个需要测试的模块组合进来测试,逐步把所有模块组合在一起,并完成测试,该方法称为增量集成测试。
1)非增量集成测试
非增量集成测试可以对模块进行并行测试,能充分利用人力,加快工程进度,但这种方法容易混乱,且错误不容易被查找和定位。非增量集成测试的范围是一步步扩大的,因此,错误容易定位,而且已测试的模块可在新的条件下进行测试,程序测试将会更彻底。
例6.1 图6.4所示为采用非增量集成测试的一个实例,被测试程序的结构如图6.4(a)所示,它由7个模块组成。在进行单元测试时,根据它们在结构图中的位置,对模块C和D配备了驱动模块和被调用模拟子模块。对模块B、E、F、C配备了驱动模块。主模块A由于处于结构图的顶端,无其他模块调用它,因此仅为它配备了三个被调用模拟子模块,以模拟被它调用的3个模块B、C、D,如图6.4(b)至图6.4(h)所示,分别进行单元测试后,再按图6.4(a)所示的结构图形式连接起来进行集成测试。

图6.4 非增量集成测试
非增量集成测试的优点如下。
①非增量集成测试可以并行地测试所有的软件单元,能够加快测试工作的速度,充分利用了人力和物力资源。
②非增量集成测试需要用到测试用例数量较少,因此,对设计测试用例的工作量相对较小。
③非增量集成测试的测试方法较为简单,容易执行。
非增量式集成测试的缺点如下。
①非增量集成测试是将软件单元一次性集成起来,如果集成的软件单元数量较多,集成测试过程中可能会出现较多的错误,而且因为一次性集成,很难判断出现错误的位置。而且,在对某个软件单元的某处错误进行修改之后,可能会在系统的其他地方带来新的错误,这样给整个系统的修正会带来较大的难度。
②非增量集成测试因为是一次性集成,各个软件单元之间的接口没有进行充分的测试,因此,有可能会遗漏一些潜在的接口错误,即使在集成测试通过后,这些接口可能也会存在问题。
2)增量集成测试
增量集成测试有自顶向下的增量集成测试和自底向上的增量集成测试两种测试方法。
①自顶向下的增量集成测试。
自顶向下的增量集成测试是模块按程序的控制结构从上到下的组合方式。在增量集成测试时,有深度优先和广度优先两种策略。
深度优先策略首先集成在结构中的一个主控路径下的所有模块,主控路径的选择是任意的,一般根据问题的特性来确定。
广度优先策略首先沿着水平方向,把每层中所有直接隶属于上一层的模块集成起来,直至最底层。(https://www.daowen.com)
图6.5所示为采用自顶向下的深度优先集成方式进行集成测试的过程。读者可以自行求解广度优先方式。

图6.5 深度优先策略自顶向下增量集成测试
自顶向下的增量集成测试可以较早地验证控制和判定点,如果出现问题能够及时纠正。在测试时不需要编写驱动模块,但需要编写被调用模拟子模块。另外,如果高层模块依赖性很大,需要返回大量信息,在用被调用模拟子模块代替时,被调用模拟子模块的编写就复杂,必然会增加开销。这时可以用下面的自底向上的增量集成测试。
自顶向下增量集成测试的优点如下。
A.在集成测试的过程当中,可以首先验证主要的控制和判断点,即主控软件单元,在功能划分合理的程序模块结构中,对于较高层次中的主控软件单元,可以首先做出测试,能够提前发现问题,以便及时对程序做出相应的修改,减少人力资源消耗。
B.选择深度优先的集成方式,可以首先实现和验证一个完整的软件功能,能够首先对逻辑输入的分支进行组装和测试,检测出潜在的错误和缺陷,验证其功能的正确性,为之后的主要分支的组装和测试提供保证。
C.能够较早的验证软件功能的可用性,给软件的开发者和软件的用户奠定了信心。
自顶向下增量集成测试的缺点如下。
A.采用自顶向下的集成测试方法,在测试时需要给每个软件单元的下层软件单元设计开发测试用被调用模拟子模块,对于被调用模拟子模块的开发以及维护成本较大。
B.当底层的软件单元的发生变更时,例如,需求发生变化导致软件单元发生变化,这种变更可能会影响到整个软件中的其他软件单元,可能会需要修改整个软件系统中的多个上层软件单元,进而容易破坏之前已经构造好的测试包。
C.随着自顶向下集成测试的进行,新的底层软件单元不断加入,这会让整个系统变得越来越复杂,这可能会导致之后加入的底层软件单元的测试不够充分。
②自底向上的增量集成测试。
自底向上的增量集成测试是从最底层的功能模块开始,边组合边测试,从下向上地完成整个程序结构的测试。在单元测试的基础上,从最底层模块开始,按功能组合模块,从下而上地进行测试。这样的测试方式可以较早地发现底层关键性模块出现的错误。在测试时不需要编写被调用模拟子模块,但需要驱动模块。另外,对程序中的主要控制错误发现较晚。
图6.6所示为自底向上的集成测试过程。

图6.6 自底向上增量集成测试
自底向上增量集成测试的优点如下。
A.能够尽早验证底层软件单元的功能。任何一个底层软件单元通过单元测试之后,就可以开始进行集成测试。
B.在集成测试开始时,可以同时对系统层次结构中的每个分支集成测试,这样极大地提高了测试的效率。
C.减少了设计开发测试用被调用模拟子模块的工作量。
D.更容易对被测系统的错误进行定位。
自底向上增量集成测试的缺点如下。
A.只有在被测系统的最顶层的最后一个软件单元组装起来之后才能看到整个系统的框架。
B.测试用驱动模块的开发以及维护工作量大。
C.由于顶层的软件单元要到集成测试的最后阶段才能进行测试,因此不能及时发现高层模块设计上的错误,对于那些在整个体系结构中控制结构非常关键的产品来说,受到的影响就更大。
集成测试方法的选择取决于软件的特点和进度安排。在实际工程中,通常将这两种方法结合起来使用,即对位于软件结构中较上层的模块使用自顶向下的方法,而对较底层的模块使用自底向上的方法。
3)“三明治”集成测试方法
“三明治”集成(也称为混合测试方法)是一种混合增量集成测试方法,综合了自顶向下和自底向上两种集成方法的优点。
“三明治”集成测试方法的基本步骤如下:
①确定以哪一层作为运用“三明治”集成测试方法的分界层;
②对分界层及其所在层下面的各个层次使用自底向上的集成测试方法;
③对分界层上面的各个层次使用自顶向下的集成测试方法;
④对被测系统进行整体测试。
在应用“三明治”集成测试方法进行测试工作的时候,应该注意尽量减少设计开发测试用驱动模块和测试用被调用模拟子模块的数量。
“三明治”集成测试的优点如下:
①同时具有自顶向下集成测试和自底向上集成策略的优点;
②通过一定集成技巧,可以减少被调用模拟子模块和驱动模块的开发。
“三明治”集成测试的缺点如下:
在被集成之前,中间层不能够尽早得到充分的测试。