(2)域测试。这是一种基于程序结构的测试方法。这里的“域”是指程序的输入空间。域测试正是在分析输入空间的基础上,选择适当的测试点以后进行测试的。
(3)符号测试。符号测试是基于代数运算的一种结构测试方法。符号测试方法受分支问题、二义性问题和大程序问题的困扰,这些问题严重地影响着它的发展前景。
(4)数据流测试。数据流测试是指一个基于通过程序的控制流,从建立的数据目标状态的序列中发现异常的结构测试方法。
(5)定义域测试。定义域测试的重点在分类方面,它还要判断出定义域的正确性。定义域测试与集合理论密切相关。
(6)程序变异测试。这是一种基于程序错误的测试方法,它的目的是要说明程序中不含有某些特定的错误。
3.测试步骤
软件测试过程一般按四个步骤进行,即单元测试、集成测试、确认测试和系统测试。
(1)单元测试
也称模块测试,这是针对软件设计的最小单位-模块进行正确性检验的测试工作,其目的在于发现各模块内部可能存在的各种差错。单元测试的依据是详细设计描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用结构测试(白盒测试)技术,系统内多个模块可以并行地进行测试。
a.单元测试的任务
单元测试任务包括:(1)模块接口测试;(2)模块局部数据结构测试;(3)模块边界条件测试;(4)模块中所有独立执行通路测试;(5)模块的各条错误处理通路测试。
模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。测试接口正确与否应该考虑下列因素:(1)输入的实际参数与形式参数的个数是否相同;(2)输入的实际参数与形式参数的属性是否匹配;(3)输入的实际参数与形式参数的量纲是否一致;(4)调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同;(5)调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配;(6)调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致;(7)调用预定义函数时所用参数的个数、属性和次序是否正确;(8)是否存在与当前入口点无关的参数引用;(9)是否修改了只读型参数;(10)各模块对全程变量的定义是否一致;(11)是否把某些约束作为参数传递。
如果模块内包括外部输入输出,还应该考虑下列因素:(1)文件属性是否正确;(2)OPEN/CLOSE语句是否正确;(3)格式说明与输入输出语句是否匹配;(4)缓冲区大小与记录长度是否匹配;(5)文件使用前是否已经打开;(6)是否处理了文件尾;(7)是否处理了输入/输出错误;(8)输出信息中是否有文字性错误。
检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现以下几类错误:(1)不合适或不相容的类型说明;(2)变量无初值;(3)变量初始化或省缺值有错;(4)不正确的变量名(拼错或不正确地截断);(5)出现上溢、下溢和地址异常。
除局部数据结构外,如果可能,单元测试时还应该查清全局数据对模块的影响。
在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。此时设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。此时基本路径测试和循环测试是最常用且最有效的测试技术。计算中常见的错误包括:(1)误解或用错了算符优先级;(2)混合类型运算;(3)变量初值错;(4)精度不够;(5)表达式符号错。
比较判断与控制流紧密相关,测试用例还应致力于发现下列错误:(1)不同数据类型的对象之间进行比较;(2)错误地使用逻辑运算符或优先级;(3)因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等;(4)比较运算或变量出错;(5)循环终止条件不可能出现;(6)迭代发散时不能退出;(7)错误地修改了循环变量。
一个好的设计应能预见各种出错条件,并预设各种出错处理通路,出错处理通路同样需要认真测试,测试应着重检查下列问题:(1)输出的出错信息难以理解;(2)记录的错误与实际遇到的错误不相符;(3)在程序自定义的出错处理段运行之前,系统已介入;(4)异常处理不当;(5)错误陈述中未能提供足够的定位出错信息。
边界条件测试是单元测试中最后也是最重要的一项任务。众所周知,软件经常在边界上失效。采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。
b.单元测试过程
一般认为单元测试应紧接在编码之后,当源程序编制完成并通过复审和编译检查,便可开始单元测试。测试用例的设计应与复审工作相结合,根据设计信息选取测试数据,将增大发现上述各类错误的可能性。在确定测试用例的同时,应给出期望结果。
提高模块的内聚度可简化单元测试,如果每个模块只能完成一个,所需测试用例数目将显著减少,模块中的错误也更容易发现。
(2)集成测试
也称组装测试。在单元测试之后,需要按照设计时作出的结构图,将它们联结起来,进行集成测试。集成测试是组装软件的系统测试技术,按设计要求把通过单元测试的各个模块组装在一起之后,进行综合测试以便发现与接口有关的各种错误。
把所有模块按设计要求一次全部组装起来,然后进行集成测试,这称为非增量式集成。这种方法容易出现混乱。因为测试时可能发现一大堆错误,为每个错误定位和纠正非常困难,并且在改正一个错误的同时又可能引入新的错误。新旧错误混杂,更难断定出错的原因和位置。与之相反的是增量式集成方法,程序一段一段地扩展,测试的范围一步一步地增大,错误易于定位和纠正,界面的测试亦可做到完全彻底。常用的有下面两种增量式集成方法。
a.自顶向下集成
自顶向下集成是构造程序结构的一种增量式方式,它从主控模块开始,按照软件的控制层次结构,以深度优先或广度优先的策略,逐步把各个模块集成在一起。深度优先策略首先是把主控制路径上的模块集成在一起,至于选择哪一条路径作为主控制路径,这多少带有些随意性,要根据问题的特性确定。
自顶向下集成测试的具体步骤为:(1)以主控模块作为测试驱动模块,把对主控模块进行单元测试时引入的所有桩模块用实际模块替代;(2)依据所选的集成策略,每次只替代一个桩模块;(3)每集成一个模块立即测试一遍;(4)只有每组测试完成后,才着手替换下一个桩模块;(5)为避免引入新错误,须不断地进行回归测试。从第(2)步开始,循环执行上述步骤,直至整个程序结构构造完毕。
自顶向下集成的优点在于能尽早地对程序的主要控制和决策机制进行检验,因此能较早地发现错误。缺点是在测试较高层模块时,低层处理采用桩模块替代,不能反映真实情况,重要数据也不能及时回送到上层模块,因此测试并不充分。解决这个问题有几种办法,第一种是把某些测试推迟到用真实模块替代桩模块之后进行,第二种是开发能模拟真实模块的桩模块;第三种是自底向上集成模块。第一种方法又回退为非增量式的集成方法,使错误难于定位和纠正,并失去了在组装模块时进行一些特定测试的可能性;第二种方法无疑要大大增加开销;第三种方法更切实可行。
b.自底向上集成
自底向上测试是从软件结构最低层的模块开始组装测试。因测试到较高层模块时,所需的下层模块功能均已具备,所以不再需要桩模块。
自底向上集成测试的步骤分为:(1)把低层模块组织成实现某个子功能的模块群;(2)开发一个测试驱动模块,控制测试数据的输入和测试结果的输出;(3)对每个模块群进行测试;(4)删除测试使用的驱动模块,用较高层模块把模块群组织成为完成更大功能的新模块群。从第(1)步开始循环执行上述各步骤,直至整个程序构造完毕。
自底向上集成方法不用桩模块,测试用例的设计亦相对简单,但缺点是程序最后一个模块加入时才具有整体形象。它与自顶向上集成测试方法优缺点相反。因此,在测试软件系统时,应根据软件的特点和工程的进度,选用适当的测试策略。有时混和使用两种策略更为有效,上层模块用自顶向下的方法,下层模块用自底向上的方法。
此外,在集成测试中尤其要注意关键模块。所谓关键模块一般都具有下述一个或多个特征:(1)对应几条需求;(2)具有高层控制功能;(3)复杂、易出错;(4)有特殊的性能要求。关键模块应尽早测试,并反复进行回归测试。
(3)确认测试
也称合格性测试,这是检验所开发的软件是否按用户要求运行。确认测试应检查软件能否按合同要求进行工作,即是否满足软件需求说明书中的确认标准。
a.确认测试标准
实现软件确认要通过一系列黑盒测试。确认测试同样需要制订测试计划和过程,测试计划应规定测试的种类和测试进度,测试过程则定义一些特殊的测试用例,旨在说明软件与需求是否一致。无论是测试计划还是测试过程,都应该着重考虑软件是否满足合同规定的所有功能和性能,文档资料是否完整、准确,人机界面、可移植性、兼容性、可维护性等是否令用户满意。
确认测试的结果有两种可能,一种是功能和性能指标满足软件需求说明的要求,用户可以接受;另一种是软件不满足软件需求说明的要求,用户无法接受。项目进行到这个阶段才发现严重错误和偏差一般很难在预期内改正,因此必须与用户协商,寻求一个妥善解决问题的方法。
b.配置复审
确认测试的另一个重要环节是配置复审。复审的目的在于保证软件配置齐全、分类有序,并且包括软件维护所必须的细节。
c.α、β测试
事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误地理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解。因此,软件是否真正满足最终用户的要求,应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以是有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题。
α测试是指软件开发公司组织内部人员模拟各类用户对即将面市的软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。
(4)系统测试
软件开发完成后,还要与系统中其他部分配套运行,进行系统测试。包括恢复测试、安全测试、强度测试和性能测试等。
计算机软件是基于计算机系统的一个重要组成部分,软件开发完毕后应与系统中其他成分集成在一起,此时需要进行一系列系统集成和确认测试。对这些测试的详细讨论已超出软件工程的范围,这些测试也不可能仅由软件开发人员完成。
在系统测试之前,软件工程师应完成下列工作:(1)为测试软件系统的输入信息设计出错处理通路;(2)设计测试用例,模拟错误数据和软件界面可能发生的错误,记录测试结果,为系统测试提供经验和帮助;(3)参与系统测试的规划和设计,保证软件测试的合理性。
系统测试应该由若干个不同测试组成,目的是充分运行系统,验证系统各部件是否都能工作并完成所赋予的任务。下面简单介绍几类系统测试。
(1)恢复测试
恢复测试主要检查系统的容错能力。当系统出错时,能否在指定时间间隔内修正错误并重新启动系统。恢复测试首先要采用各种办法强迫系统失败,然后验证系统是否能尽快恢复。对于自动恢复需验证重新初始化、检查点、数据恢复和重新启动等机制的正确性;对于人工干预的恢复系统,还需估测平均修复时间,确定其是否在可接受的范围内。
(2)安全测试
安全测试检查系统对非法侵入的防范能力。安全测试期间,测试人员假扮非法入侵者,采用各种办法试图突破防线。
例如:
①想方设法截取或破译口令;
②专门定做软件破坏系统的保护机制;
③故意导致系统失败,企图趁恢复之机非法进入;
④试图通过浏览非保密数据,推导所需信息。
理论上讲,只要有足够的时间和资源,没有不可进入的系统。因此系统安全设计的准则是使非法侵入的代价超过被保护信息的价值。此时非法侵入者已无利可图。
(3)强度测试
强度测试检查程序对异常情况的抵抗能力。强度测试总是迫使系统在异常的资源配置下运行。例如,当中断的正常频率为每秒一至两个时,运行每秒产生十个中断的测试用例;定量地增长数据输入率,检查输入子功能的反映能力;运行需要最大存储空间(或其他资源)的测试用例;运行可能导致虚存操作系统崩溃或磁盘数据剧烈抖动的测试用例等等。
(4)性能测试
对于那些实时和嵌入式系统,软件部分既使能满足功能要求,也未必能够满足性能要求。虽然从单元测试起,每一测试步骤都包含性能测试,但只有当系统真正集成之后,在真实环境中才能全面、可靠地测试运行性能系统。性能测试是为了完成这一任务。性能测试有时与强度测试相结合,经常需要其他软硬件的配套支持。
只有经过上述测试过程测试后,软件才能基本满足开发要求。测试宣告结束,经验收后,将软件提交用户使用。
《涉外信息综合管理系统》软件测试的组织实施
北京市公安局出入境管理处《涉外信息综合管理系统》采用UNIX和Windows NT操作系统,ORACLE数据库,Compaq小型机为主服务器,多台高档PC服务器支持关键应用,采用C/S及B/S方式实现临时入境人员业务、公民因私出境业务、外国人签证业务、三资企业业务、港澳台暂住人员业务、外国长住人员业务、涉外违法案件业务等几大类信息的采集、取像、审批、制证等业务工作的信息化管理。同时,对公安内部用户提供综合查询、统计、数据析取分析处理等功能。此应用系统信息涉及单位所有业务,应用软件设计比较复杂,软件测试工作在保障软件质量,开发出高质量的软件中起到了重要作用。
北京市公安局出入境管理处在软件开发初期就建立专门的软件测试小组来实现软件测试过程的组织与管理。测试小组的主要职能就是查找软件中的错误,且这个小组不直接参与开发,这样就能排除测试期间开发者可能遇到的心理上的“利益冲突”,即开发者大多不情愿看到自己的工作遭到否定。建立测试小组的另一好处是避免了开发者在测试过程中容易陷入的“思维定式”,能够从多方面观察问题。
软件测试本身是一个复杂的过程。因此,早在需求分析和设计阶段,北京市公安局出入境管理处测试小组的测试人员就对各种说明书进行仔细分析,提取了有关的测试信息,编写了测试计划和测试规程。适时采用各种软件测试方法对软件进行测试,在测试过程中,把发现的错误及时反馈给开发人员,确保测试人员与开发人员的及时沟通。对开发人员修正过的软件,还要分析修改部分对整个系统的影响,有针对性地对受影响的部分进行重新测试。测试人员在测试的同时还完成了各种测试文件的编写工作。
作为保证系统软件质量的一种重要手段,软件测试是必不可少的,但是仅仅依靠测试来保证软件质量是不够的,还需要有良好的质量管理体系。软件质量管理的一条主要途径就是建立质量保证小组,这个小组要参与软件开发和确认的各个阶段,并承担以下任务:
(1)保证对系统需求说明书、设计文本、软件代码和测试步骤的严格控制,确保被测软件与设计需求、文本的高级要求说明一致;(2)代码化之前复审软件设计;(3)参与设计和开发活动的技术审查和复审;(4)进行复审以保证软件与标准和规程一致;(5)记录软件的问题和不一致之处并监控正确的操作;(6)复审并核准合格的测试计划和测试规程;(7)监控测试操作。
总结
软件质量是软件产品的生命之所在,软件测试作为保证软件质量的手段,愈来愈受到人们的重视。而如何提高软件产品质量,严格的测试是重要的一环。
软件测试理论和方法在不断完善,测试工具也在蓬勃发展。测试已从简单的检查程序逻辑走向“确认、验证和测试”,又走向全面形式化的道路。
本文介绍了软件测试的各种方法、测试过程的管理及我处《涉外信息综合管理系统》的软件测试组织实施。限于篇幅,有些部分不得不简略叙述。我热切地期望,从事软件开发人员能予软件测试以足够的重视,并应用先进的技术、管理手段,使开发出的软件产品具备卓越的品质。
文章来源于领测软件测试网 https://www.ltesting.net/