移动应用软件测试技术与实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 集成测试

集成测试也称“组装测试”或“联合测试”,是指在单元测试的基础上将所有模块按照设计要求(如根据结构图)组装成为子系统或系统并进行测试。

3.2.1 意义

集成测试是在单元测试的基础上,测试在将所有的软件单元按照“概要设计规格说明书”的要求组装成模块、子系统或系统的过程中各部分工作是否达到或实现相应技术指标及要求的活动。首先,在集成测试之前单元测试已经完成,集成测试中所使用的对象应该是已经经过单元测试的软件单元。这一点很重要,因为如果不经过单元测试,那么集成测试的效果将会受到很大影响,并且会大幅增加软件单元代码纠错的代价。其次,实践表明:一些模块虽然能够单独工作,但并不能保证连接起来也能正常工作;一些局部反映不出来的问题,在全局上很可能暴露出来。此外,在某些开发模式,如迭代式开发中,设计和实现是迭代进行的。在这种情况下,集成测试的意义还在于它能间接地验证概要设计是否具有可行性。

集成测试确保各单元组合在一起后能够按既定意图协作运行,并确保增量的行为正确。所有的软件项目都不能摆脱系统集成这个阶段,不管采用什么开发模式,具体的开发工作必须从一个一个的软件单元做起,软件单元只有经过系统集成才能形成一个有机的整体。具体的集成过程可能是显性的,也可能是隐性的。只要有系统集成,总会出现一些常见问题,在工程实践中几乎不存在软件单元组装过程中不出任何问题的情况。

图3-1所示为针对一个功能点的各类测试所花费的时间统计。

图3-1 针对一个功能点的各类测试所花费的时间统计

从图中可以看出,集成测试需要花费的时间明显超过单元测试,直接从单元测试过渡到系统测试是极不妥当的做法。

3.2.2 目标

集成测试的目标是按照设计要求使用那些通过单元测试的构件来构造软件结构,单个模块的高质量不足以保证整个系统的高质量,有许多隐蔽的失效是高质量模块间发生非预期交互而产生的。以下两种测试技术用于集成测试。

(1)功能性测试:使用黑盒测试技术针对被测模块的接口规格说明进行测试。

(2)非功能性测试:对模块的性能或可靠性进行测试。

3.2.3 过程

集成测试过程如图3-2所示。

图3-2 集成测试过程

该过程是由系统设计人员、软件测评人员及开发人员共同完成的。

集成测试相对来说比较复杂,而且不同的平台、技术和应用的差异性也比较大,更多的是和开发环境融合在一起,它所确定的测试内容主要来源于设计模型。

集成测试人员的工作内容如表3-1所示。

表3-1 集成测试人员的工作内容

3.2.4 方案

1.自顶向下和自底向上集成测试

自底向上集成测试和自顶向下集成测试方案都是非常重要的,其表现形式如图3-3所示。

图3-3 自底向上集成测试和自顶向下集成测试的表现形式

(1)自顶向下集成测试方案。

自顶向下集成测试方案是一个递增的组装软件结构的方案,即从主控模块(主程序)开始沿控制层向下移动把模块一一组合起来,分为如下两种方法。

1)先深度:按照结构用一条主控制路径将所有模块组合起来。

2)先宽度:逐层组合所有下属模块,在每一层水平进行。

组装过程分为以下5个步骤。

1)用主控模块作为测试驱动程序,其直接下属模块用承接模块来代替。

2)根据所选择的集成测试法(先深度或先宽度),每次测试时用实际模块代替下属的承接模块。

3)在组合每个实际模块时都要进行测试。

4)完成一组测试后用一个实际模块代替另一个承接模块。

5)可以执行回归测试(即重新再做所有或者部分已做过的测试),以保证不引入新的错误。

(2)自底向上集成测试。

自底向上集成测试方案是最常使用的方案,其他集成方案都或多或少地继承并吸收了这种集成方案的思想。该方案从软件模块结构中最底层的模块开始组装并测试。因为模块是自底向上组装的,一个给定层次的模块的子模块(包括其所有下属模块)事前已经完成组装并经过测试,所以不再需要编制桩模块(一种能模拟真实模块,为待测模块提供调用接口或数据的测试用软件模块)。自底向上集成测试方案的执行步骤大致如下。

1)按照“概要设计规格说明书”,明确有哪些被测模块,在熟悉被测模块性质的基础上对被测模块进行分层。在同一层次上的测试可以并行进行,然后排列出测试活动的先后关系并制订测试进度计划。

2)按时间的顺序关系将软件单元集成为模块,并测试在集成过程中出现的问题,这里可能需要测试人员开发一些驱动模块来驱动组成活动中形成的被测模块。对于比较大的模块,可以先将其中的某几个软件单元集成为子模块,然后再拼合为一个较大的模块。

3)将各软件模块集成为子系统(或分系统),检测各子系统是否能正常工作,可能需要测试人员开发少量的驱动模块来驱动被测子系统。

4)将各子系统集成为最终用户系统,测试各分系统能否在最终用户系统中正常工作。

自底向上的集成测试方案是工程实践中最常用的测试方案,相关技术也较为成熟。它的优势很明显,即管理方便,并且测试人员能较好地锁定软件缺陷的所在位置。但它对于某些开发模式不适用,如使用极限编程(XP)开发方法会要求测试人员在全部软件单元实现之前完成核心软件部件的集成测试。尽管如此,自底向上的集成测试方案仍不失为一个可供参考的集成测试方案。

2.核心系统先行集成测试

核心系统先行集成测试方案的思想是先对核心软件部件进行集成测试,在测试通过的基础上再按各外围软件部件的重要程度逐个集成到核心系统中。每次添加一个外围软件部件都产生一个产品基线,直至最后形成稳定的软件产品。核心系统先行集成测试方案对应的集成过程是一个逐渐趋于闭合的螺旋形曲线,代表产品逐步定型的过程,其执行步骤如下。

(1)对核心系统中的每个模块进行单独且充分的测试,必要时使用驱动模块和桩模块。

(2)将核心系统中的所有模块一次性集成到被测系统中,解决集成中出现的各类问题。在核心系统规模相对较大的情况下,也可以按照自底向上的步骤集成核心系统的各组成模块。

(3)按照各外围软件部件的重要程度及模块间的相互制约关系,拟定外围软件部件集成到核心系统中的顺序方案,方案经评审以后即可进行外围软件部件的集成。

(4)在外围软件部件添加到核心系统以前,外围软件部件应先完成其模块级集成测试。

(5)按顺序不断添加外围软件部件,排除外围软件部件集成中出现的问题,形成最终的用户系统。

该集成测试方案对于快速软件开发很有效果,适合较复杂系统的集成测试,能保证一些重要的功能和服务的实现。不足是采用此方案的系统一般应能明确区分核心软件部件和外围软件部件,前者应具有较高的耦合度;后者内部也应具有较高的耦合度,但各外围软件部件之间应具有较低的耦合度。

3.高频集成测试

高频集成测试方案指同步于软件开发过程,每隔一段时间对开发团队的现有代码进行一次集成测试。如某些自动化集成测试工具能实现每日深夜对开发团队的现有代码进行一次集成测试,然后将测试结果分发到各开发人员的电子邮箱中。该集成测试方案频繁地将新代码加到一个已经稳定的基线中,以免集成故障难以发现,并且控制可能出现的基线偏差。使用高频集成测试方案需要具备一定的条件,一是可以持续获得一个稳定的增量,并且该增量内部已被验证没有问题;二是大部分有意义的功能增加可以在一个相对稳定的时间间隔(如每个工作日)内获得;三是测试包和代码的开发工作必须是并行进行的,并且需要版本控制工具来保证始终维护的是测试脚本和代码的最新版本;四是必须借助于使用自动化工具来完成。高频集成测试方案的一个显著特点就是集成次数频繁,显然人工的方法是不胜任的。

高频集成测试方案一般采用如下步骤来完成。

(1)选择集成测试自动化工具,如很多Java项目采用JUnit+Ant方案来实现集成测试的自动化,也有一些商业集成测试工具可供选择。

(2)设置版本控制工具,以确保集成测试自动化工具所获得的版本是最新版本,如使用CVS进行版本控制。

(3)测试人员和开发人员负责编写对应软件代码的测试脚本。

(4)设置自动化集成测试工具,每隔一段时间对配置管理库的新添加的代码进行自动化的集成测试,并将测试报告分发给开发人员和测试人员。

(5)测试人员监督代码开发人员及时关闭不合格项。

后三个步骤多次循环,直至形成最终软件产品。

高频集成测试方案能在开发过程中及时发现代码错误,并直观地看到开发团队的有效的工程进度。在此方案中,开发维护源代码与开发维护软件测试包被赋予同等的重要性,这对有效防止错误、及时纠正错误都很有帮助。该方案的不足在于,测试包有时候可能无法暴露深层次的编码错误或图形界面错误。

以上是几种常见的集成测试方案,一般在现代复杂软件项目集成测试过程中通常采用核心系统先行集成测试和高频集成测试相结合的方案进行,而自底向上的集成测试方案在采用传统瀑布式开发模式的软件项目集成过程中较为常见。在软件项目实际开发中,应该结合其实际环境及各测试方案适用的范围进行合理的选型。