1.6.1任务描述
项目中,通过以上的学习,各个基本功能已实现,我们现在需要按照概要设计和详细设计规格说明书来实现整个系统的集成,可以实现基本功能, 并做简单的集成测试。如何做好系统测试,才能更好的发觉问题?我们使用几种常用测试方法进行编写测试用例来做进一步测试:等价类划分方法、边界值分析方法。
1.6.2任务目的
本任务的目的是通过对功能模块进行集成,并调试成功正确运行,进一步提高学生系统集成的能力,让学生养成团队协作的能力;通过对软件的测试,掌握常用测试方法,挖掘出设计中存在逻辑上缺陷及语法上的错误,培养学生软件测试意识,从而进一步完善软件功能;明白软件设计规范化的重要性。
1.6.3知识准备
1、系统集成
将不同的系统,根据应用需要,有机地组合成一个一体化的、功能更加强大的新型系统的过程和方法,称为系统集成。
有很多开发组,到最后将各程序员所做的功能模块集成起来特别困难,分析其原因是开发前大家信誓旦旦,要按照软件开发规范来做,实际开发过程中可能就有很多人开小差了,我行我素,置开发规范于不顾。开发规范包括文件对象的命名规范,变量定义的规则,代码的书写风格等,总之要使软件从外到内要有统一的风格,界面的一致性给用户的是感觉是你的软件上手快,让用户在不同的程序模块中适应不同的操作风格,恐怕他们要叫苦连天;而代码风格的一致性,则给项目组长或其他人员阅读修改方便,当然注释写的要尽量详细。这样,起码不会一个人员跳槽,此人负责的部分要重新写的尴尬局面。还有大家要注意软件和程序的区别,程序就是代码,可以运行并完成既定的功能,而软件还要有详细的文档说明。
系统集成是一个复杂的工程,但我们这里所谈的是简单化系统集成。若某人独自写的代码,只需将各功能模块有机集成起来;若开发组组员共同参与者编写代码,只需将每个组员做的功能模块有机集成起来。我们这里没有涉及到硬件系统等。
2、集成测试
集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图〕组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。在此项目开发中,集成测试由项目开发组实现。
方法:
集成测试应该考虑以下问题:
①在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失;
②各个子功能组合起来,能否达到预期要求的父功能;
③一个模块的功能是否会对另一个模块的功能产生不利的影响;
④全局数据结构是否有问题;
⑤单个模块的误差积累起来,是否会放大,从而达到不可预测的错误。
单元测试后,有必要进行集成测试,发现并排除在模块连接中可能发生的上述问题,最终构成要求的软件子系统。 任何合理地组织集成测试,即选择什么方式把模块组装起来形成一个可运行的系统,直接影响到模块测试用例的形式、所用测试工具的类型、模块编号和测试的次序、生成测试用例和调试的费用。通常,有两种不同的组装方式:一次性组装方式和增值式组装方式。
集成测试是一种正规测试过程,必须精心计划,并与单元测试的完成时间协调起来。集成测试的实施方案有很多种,如自底向上集成测试、自顶向下集成测试、Big-Bang集成测试、三明治集成测试、核心集成测试、分层集成测试、基于使用的集成测试等。在此,笔者将重点讨论其中一些经实践检验和一些证实有效的集成测试方案。
(1)自顶向下集成测试
自顶向下集成(Top-Down Integration)方式是一个递增的组装软件结构的方法。从主控模块(主程序)开始沿控制层向下移动,把模块一一组合起来。分两种方法:
第一:先深度:按照结构,用一条主控制路径将所有模块组合起来;
第二:先宽度:逐层组合所有下属模块,在每一层水平地
组装过程分以下五个步骤:
步骤一:用主控模块作为测试驱动程序,其直接下属模块用承接模块来代替;
步骤二:根据所选择的集成测试法(先深度或先宽度),每次用实际模块代替下属的承接模块
步骤三:在组合每个实际模块时都要进行测试;
步骤四:完成一组测试后再用一个实际模块代替另一个承接模块;
步骤五:可以进行回归测试(即重新再做所有的或者部分已做过的测试),以保证不引入新的错误。
(2)自底向上集成测试
自底向上的集成(Bottom-Up Integration)方式是最常使用的方法。其他集成方法都或多或少地继承、吸收了这种集成方式的思想。自底向上集成方式从程序模块结构中最底层的模块开始组装和测试。因为模块是自底向上进行组装的,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)事前已经完成组装并经过测试,所以不再需要编制桩模块(一种能模拟真实模块,给待测模块提供调用接口或数据的测试用软件模块)。自底向上集成测试的步骤大致如下:
步骤一: 按照概要设计规格说明,明确有哪些被测模块。在熟悉被测模块性质的基础上对被测模块进行分层,在同一层次上的测试可以并行进行,然后排出测试活动的先后关系,制定测试进度计划。利用图论的相关知识,可以排出各活动之间的时间序列关系,处于同一层次的测试活动可以同时进行,而不会相互影响。
步骤二: 在步骤一的基础上,按时间线序关系,将软件单元集成为模块,并测试在集成过程中出现的问题。这里,可能需要测试人员开发一些驱动模块来驱动集成活动中形成的被测模块。对于比较大的模块,可以先将其中的某几个软件单元集成为子模块,然后再集成为一个较大的模块。
步骤三: 将各软件模块集成为子系统(或分系统)。检测各自子系统是否能正常工作。同样,可能需要测试人员开发少量的驱动模块来驱动被测子系统。
步骤四: 将各子系统集成为最终用户系统,测试是否存在各分系统能否在最终用户系统中正常工作。
方案点评: 自底向上的集成测试方案是工程实践中最常用的测试方法。相关技术也较为成熟。它的优点很明显: 管理方便、测试人员能较好地锁定软件故障所在位置。但它对于某些开发模式不适用,如使用XP开发方法,它会要求测试人员在全部软件单元实现之前完成核心软件部件的集成测试。尽管如此,自底向上的集成测试方法仍不失为一个可供参考的集成测试方案。
3、黑盒测试
黑盒测试(Black-box Testing,又称为功能测试或数据驱动测试)是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。在此项目开发中,黑盒测试由项目测试组实现。
采用黑盒技术设计测试用例的方法有:等价类划分、边界值分析、错误推测、因果图和综合策略。黑盒测试注重于测试软件的功能性需求,也即黑盒测试使软件工程师派生出执行程序所有功能需求的输入条件。黑盒测试并不是白盒测试的替代品,而是用于辅助白盒测试发现其他类型的错误。
黑盒测试试图发现以下类型的错误:功能错误或遗漏、界面错误、数据结构访问错误、性能错误、初始化和终止错误。
黑盒测试的测试用例设计方法:等价类划分方法、边界值分析方法、错误推测方法、因果图方法、判定表驱动分析方法、正交实验设计方法、功能图分析方法。
下面我重点介绍一下两种测试法:等价类划分方法、边界值分析方法
(1)等价类划分方法
此方法是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法.
1)划分等价类
等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试。因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据,取得较好的测试结果。等价类划分可有两种不同的情况:有效等价类和无效等价类。
有效等价类:是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
无效等价类:与有效等价类的定义恰巧相反。
设计测试用例时,要同时考虑这两种等价类。因为,软件不仅要能接收合理的数据,也要能经受意外的考验。这样的测试才能确保软件具有更高的可靠性。
2)划分等价类的方法
下面给出六条确定等价类的原则:
①在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。
②在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可确立一个有效等价类和一个无效等价类。
③在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。
④在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。
⑤在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
⑥在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。
3)设计测试用例
在确立了等价类后,可建立等价类表,列出所有划分出的等价类:
输入条件 有效等价类 无效等价类
... ... ...
... ... ...
然后从划分出的等价类中按以下三个原则设计测试用例:
①为每一个等价类规定一个唯一的编号。
②设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步。直到所有的有效等价类都被覆盖为止。
③设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步。直到所有的无效等价类都被覆盖为止。
(2)边界值分析方法
边界值分析方法是对等价类划分方法的补充。
1)边界值分析方法的考虑:
长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。
使用边界值分析方法设计测试用例,首先应确定边界情况。通常输入和输出等价类的边界,就是应着重测试的边界情况。应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。
2)基于边界值分析方法选择测试用例的原则:
①如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
②如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。
③根据规格说明的每个输入条件,使用前面的原则①。
④根据规格说明的每个输出条件,应用前面的原则②。
⑤如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
⑥如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。
⑦分析规格说明,找出其它可能的边界条件。
1.6.4任务实现
1、系统集成及集成测试方法选取
此项目是通过建立不同的开发组来分组学习的,该项目是入门级项目,组内成员在需求分析、概要设计、详细设计及系统集成、测试合作完成此工作任务,但编程任务需每个组员各自实现,所以做系统集成就是将各功能模块集成起来,在集成的时候,同时做集成测试。我们选择增值组装方式集成,选择自顶向下集成测试方案进行集成测试。
3、选择编写测试用例方法
(1)等价类划分方法
(2)边界值分析方法
4、编写测试用例
测试用例(TestCase)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。
我们使用等价类划分方法、边界值分析方法进行分析,编写简单的测试用例。我们可以从游戏的功能进行划分。
5、按照测试用例进行测试
按照测试用例进行测试,记录相应结果,将测试结果反馈给开发组。
软件测试并不仅仅是按照测试用例(testcase)进行测试,研究显示,在一个项目中,超过3/4的bug并不能仅仅根据testcase的descrīption得来。那也就是说,一个好的测试人员相对于一个仅仅根据testcase来测试的测试人员,其发现的bug数可以是后者的4倍之多。所以软件测试的工作也许看起来简单和直接,但事实是,实际的工作远远超过testcase本身。

