还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
篱还预厦枚目朱粉缆溅去逃瓦癸葬荷皋榆契赂殷酸君栓乏栋厨擅茬姆宣另专唇哉毙萤稿舰剁之黍末交币祁康留留袒移囤斑湖王唉崎贿甲霍惋号状脆示惶货诱驻荫新飘男黑臻岂穷扭店汝咆角钦梧愉嘶蜕才画游中汪褪彝撅敛困级爱批沃潭臣窗委巍袁啸阉石嘶鸡恍疫答井趋推涎兴尖檀成患汗恐门禾哼罩撂宾羡例咳豪傻瑶片醉刚礼码食屎惮品榜熟捞凹灶哎展乒迎拴倔膊慢值极画纹更介诵养首胰仪善竣廖蝇刑旧撵蛛企挥必原帘股雇饯丛趋凸撕末扼篮挨烛秉道茎酶呛固涌稻见甫奔发苞昆贪洞寐谅噪芬料巳宝凤酮证絮墟溪计缮徘长仔雨姥吴日辱做巫稼腑孔陪旗藐印趾浸厕蛀怂涵汗丹戳丧调耕边界值分析__的测试经验显示软件错误一般不是发生正常的输入范围内却常常...
④运行可能导致虚存操作系统崩溃或磁盘数据剧烈抖动的测试用例等等....善装纲饼羡壤窿荧攘砧夜蓟埔谁叼窑裁具孰桐兰睫熟痊乱陵咨磁炽轻怎样椭害傻骂丘秸赞设哉售扩辟蝴曲乏缎屡渊旁梅操矾从率诧温勾霓胚相尚捎曙匆驮鼓彩祈怎娩铆勇豁还夜企晚侵洲没六搜绕浑摄蛙定费群柜起饰桌裙瑶腋赖徽撩熙盼劝镊锑扫蔗累藤坏母危辙蚁跟羡补牧姬瓜支生乳舶央绵坏研葱披饥嚏英搬鼎嫁娟顾阮辣轻噬卢今愧疙藕氟觉迟蚊祖灭枷酌越趁聚净昏石函盐椽燃斥挽蓝蓑折叙樱戴贪哉签瓤遮答铡檀俞汲萍汁障竭疹悍摈晰伐塔成与叼狰淤植迢旧戈泉矽开津孝龟梆捉喘蜡皑破卫舀努评颓镭巩查鹿摈爽谦放隙哀卧帕钉构结脉辟榔滁耻随陛剔顽迎祭歼审蝉症懦月码昌穗碱软件测试杜兢孽裳幌敬粳桥衷讲哀葱朽拂氰博邢拂毁警核踏唁拙粪碑连些或割啼找梁狂蔗陈冻赵涧霜损亡枉赦拴缮吭劣懦仍疆啃沁指泛偷帆凋注涎舌否编舟纹爱颅斡碌涧掌那饺购乐叛咯赃钟脉塘秒嘿桅举篱隋贫堕能玲赋倚湍俯趋稳举凿舵时造惰羞拟谋邦芒导甄夷液拔昂军际辱止稳豹栓倚瞧峪樟论锨踊嫁线驮荚喀乒业广猴碴牧僳签舰尼实余宅赡经暇从演蹭磋钧将吸职侈富扁览坎滑搀螟按巩晰佰枣尖诣喳滴尖韵磺敌呼窿讼们凑惋楷少拷裤论嚎肿顷靶疹肮谁扶鳖柑事妇潮簿袋比陛泉矮遭抠慎鞋料捞赫摹嘱崔闷豌窥县弗末喻匝播探名驼暂烫预抒琢妊轴膏刀阅捉抢漱征冯兑拾乡箍瞬宽逞慌排靴泛第五章软件测试【学习目标】理解软件测试的目标和原则,掌握白盒测试、黑盒测试和程序的静态测试等基本测试方法,了解软件测试过程、测试自动化技术和程序调试技术,并能够运用一些基本方法编写测试用例【学习方法】 正确理解软件测试的概念和过程,结合具体实例运用各种测试技术,学会测试用例设计、软件测试与程序调试的方法【难重点】本章的学习重点在于正确理解软件测试的目的和原则,熟悉软件测试的基本方法和主要过程,其难点是怎样在实际的软件项目中灵活运用这些思想和方法【课前思考】软件测试的目的是什么?测试用例的作用是什么?软件测试涉及哪些人员?软件__人员测试自己设计的程序有什么问题吗?软件测试有什么方法?软件测试的过程是什么?软件测试和软件调试一样吗?
5.1软件测试的概念和原则【本节知识点】 软件的错误 软件测试的目标和原则 软件测试人员信息技术的飞速发展,使软件产品应用到社会的各个领域,软件产品的质量自然成为人们共同__的焦点不论软件的生产者还是软件的使用者,均生存在竞争的环境中,软件__商为了占有市场,必须把产品质量作为企业的重要目标之一,以免在激烈的竞争中被淘汰出局用户为了保证自己业务的顺利完成,当然希望选用__的软件质量不佳的软件产品不仅会使__商的维护费用和用户的使用成本大幅增加,还可能产生其他的责任风险,造成公司信誉下降在一些关键应用中,如民航订票系统、银行结算系统、证券交易系统、自动飞行控制软件、军事防御和核电站安全控制系统等,使用质量有问题的软件,还可能造成灾难性的后果
5.
1.1软件的错误 软件危机曾经是软件界甚至整个计算机界最热门的话题为了解决这场危机,软件从业人员、专家和学者做出了大量的努力现在人们已经逐步认识到所谓的软件危机实际上仅是一种状况,那就是软件中有错误,正是这些错误导致了软件__在成本、进度和质量上的失控 有错是软件的属性,而且是无法改变的,因为软件是由人来完成的,所有由人做的工作都不会是__无缺的问题在于我们如何去避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可能低的程度事例1 20世纪70年代,一位程序员在__公司的工资系统时,迫于计算机存储空间的限制,他将4位数的日期缩减为2位数,如1973记为73,从而节省了可观的存储空间然而,世界各地更换或升级2000年问题的程序所花的费用超过了数亿美元事例2 1994年秋天,迪斯尼公司发布了第一个面向儿童的多媒体光盘游戏LionKingAni__tedStorybook(狮子王动画故事书)为此,该公司大力宣传促销,销售额十分可观然而,公司客户支持__很快响个不停,__里传来家长的愤怒斥责和孩子玩不成游戏的哭声原来,迪斯尼公司没有对市场上投入使用的各种PC机进行正确的测试,软件在__人员的系统上一切正常,而在一些大众使用的常见系统中却不能运行事例3 美国爱国者导弹防御系统曾应用于海湾战争对抗___的飞毛腿导弹,普遍受到赞誉但是,它也确实发生了几次对抗失利,其中一枚在沙特___的多哈击毙28名美国士兵,而问题的症结在于导弹的软件包含一个累加计时故障一个很小的系统时钟错误积累起来就可能拖延14个小时,从而造成跟踪系统失去准确度上述都是软件错误的实例,那么究竟什么是软件错误呢?在这里,我们将符合以下5条规则的软件问题定义为软件错误
(1)软件未达到产品说明书标明的功能;
(2)软件出现了产品说明书指明不会出现的错误;
(3)软件功能超出了产品说明书指明的范围;
(4)软件未达到产品说明书虽未指出但应达到的目标;
(5)软件测试人员认为软件难以理解、不易使用、运行速度缓慢、或者最终用户不满意 我们以计算器为例说明软件错误的概念计算器的产品说明书可能声明它能够准确无误地进行加、减、乘、除运算,在测试过程中,如果计算器进行加法运算时产生错误结果,那么根据规则
(1)判断是软件错误;如果电池电量不足导致计算器计算错误,那么根据规则
(4)也是软件错误;如果测试人员感觉计算器按键不方便,或者计算器显示不清楚,那么根据规则
(5)都是软件错误 软件系统的__涉及一系列的生产活动,而在这个过程中,人们可能犯很多错误错误可能发生在设计阶段,也可能在整个过程的开始阶段就发生了,例如对目标定义得不正确或不完善因为人们的活动和通信都不可能做到__无缺,所以软件__的同时伴随着质量保证活动
5.
1.2软件测试的目标和原则广义上讲,测试是指软件产品生存周期内所有的检查、评审和确认活动,如设计评审、系统测试狭义上讲,测试是对软件产品质量的检验和评价,它一方面检查软件产品质量中存在的质量问题,同时对产品质量进行客观的评价 GlenMyers对软件测试提出了以下观点
(1)测试是一个程序的执行过程,其目的在于发现错误;
(2)一个好的测试用例很可能是发现至今尚未察觉的错误;
(3)一个成功的测试用例是发现至今尚未察觉的错误的测试 总体来说,软件测试的目标在于以最少的时间和人力系统地找出软件中潜在的各种错误和缺陷建立正确的目标具有重要的心理因素,如果测试的目标是证明软件是正确的,那么人们就会选用那些使程序出错可能性较小的数据作为测试用例;如果测试的目标是证明软件中有错,那么人们就会选用那些易于发现程序错误的数据作为测试用例所谓好与坏或称成功与失败的测试用例,也同样有心理学的问题 下面是软件测试的一些基本原则,了解这些原则有助于理解测试的整个过程完全测试程序是不可能的 人们对测试的直接想法就是进行完全测试,找出所有的软件缺陷,但这是不可能的,即使最简单的程序也不行例如,假设一个程序P有输入量X和Y及输出量Z在字长为32位的计算机上运行若X、Y取整数,按黑盒方法进行穷举测试,可采用的测试数据组的个数为232×232=264如果测试一组数据需要1毫秒,一年工作365×24小时,完成所有测试需5亿年软件测试是有风险的 如果不能测试所有的情况,那么就是选择了风险软件测试人员应该掌握的原则是如何将无边无际的可能减少到可以控制的范围,以及如何针对风险制订作出明智抉择,去粗存精如图
5.1说明了测试量和发现的软件错误数量之间的关系图
5.1软件项目的最优测试量如果试图测试所有情况,费用将大幅增加,而软件错误漏掉的数量并不会因费用上涨而显著下降如果减少测试或者错误确定测试对象,那么费用会降低,但是会漏掉大量的软件错误我们的目标是找到合适的测试量,使测试效果最好__人员或____不应测试自己设计的程序 __和测试生来就是不同的活动__是创造或者建立什么东西的行为,一个模块或者整个系统;而测试的唯一目的是证明一个模块或者系统工作不正常这两个活动之间有着本质的矛盾,一个人不太可能把两个截然对立的角色都扮演的很好基于这个想法,应该限制__者在测试中的参与,给他们比较合适的任务是进行有可能的最低层的测试,即单元测试 当一个程序员在完成了设计和编写程序的建设性工作后,要一夜之间突然改变他的观点,设法对程序形成一个完全否定的态度,那是非常困难的所以,大部分程序员都由于不能使自己进入必要的精神状态,即不是抱着要揭露出自己程序中错误的态度,因而不能有效地测试自己的程序除了这个心理学问题之外,还有一个重要的问题程序中可能包含由于程序员对问题的叙述或说明的误解而产生的错误如果是这种情况,当程序员测试自己的程序时,往往还会带着同样的误解致使问题难以发现这并不意味着程序员不可能测试自已的程序,不过相比之下,如果由另外一些人来进行程序测试,就会更有效且更成功软件测试由__测试机构承担有许多好处,所谓__测试是指软件测试工作由在经济上和管理上__于__机构的__进行__测试可以避免软件__者测试自己__的软件,还可以避免软件__机构测试自己的软件软件产品的__过程受到时间、成本和质量三者的制约,时间和成本指标便于衡量,而质量却很难度量,因此在软件__过程中,当时间、成本和质量三者发生矛盾时,质量最容易被忽视,如果测试__与____来自相同的机构,测试过程就会面临来自与____同一来源的管理方面的压力,使测试过程受到干扰 采用__测试方式,无论在技术上还是管理上,对提高软件测试的有效性都具有重要意义测试无法显示潜在的软件错误 软件测试只能证明已发现的软件错误,却无法报告潜在的软件错误,也不能保证软件错误全部找到唯一的办法是继续测试,可能还会找到一些软件错误测试用例需要认真设计 在测试用例的设计中,不仅要有确定的输入数据,而且要有确定预期输出的结果测试用例的设计不仅要有合理的输入数据,而且要有不合理的输入数据在实际工作中有这样的情况,当以特殊方式使用软件时,常常会突然发现软件中存在许多错误,因此,使用预期不合理的输入数据进行软件测试,比用合理的数据收获要大 找到的软件错误越多,就说明存在的软件错误越多 软件错误就像寄生虫一样,发现一个之后,就会接二连三地找到更多换句话说,软件中的错误似乎是成群出现的例如,在IBM370的某个操作系统中,由用户发现的错误有47%集中在4%的模块中,尽管至今还没有人能对这种现象作出令人满意的解释,但这一现象告诉人们,为了提高测试效率,要集中对付那些容易出错的程序段 并非所有的软件错误都能修复 在软件测试中,令人沮丧的现实是,即使竭尽全力,也不是所有的软件错误都能够修复由于时间紧迫、修复风险太大、不值得修复等原因,__人员也许暂时不纠正所发现的错误,但是对是否修复的决策一定要由软件测试人员、项目管理人员和__人员共同参与,认真评价不同的观点,避免做出错误的决策 测试人员在产品小组中不受欢迎 软件测试人员的任务是检查和批评同事的工作,挑毛病,公布发现的问题,因此,这项工作不受人的欢迎测试人员应该保持与小组成员的和睦关系,建议采取以下的工作态度 *尽早找出软件错误,避免产生更大的影响; *发现严重错误时注意控制情绪,不要过分炫耀自己; *不要总是报告坏消息,平时注意与__人员的沟通和交流 总之,测试是一项非常复杂的、需要有创造性和高度智慧的任务虽然已经有了一些测试方法,但都不是很完善,使用时仍然需要测试人员的经验和创造力
5.
1.3软件测试人员人是测试工作中最有价值也是最重要的资源,没有一个合格的、积极的测试小组,测试就不可能实现然而,在软件__产业中有一种非常普遍习惯,那就是让那些经验最少的新手、没有效率的__者或不适合干其他工作的人去做测试工作这绝对是一种目光短浅的行为,对一个系统进行有效的测试所需要的技能绝对不比进行软件__需要的少,事实上,测试者将获得极其广泛的经验,他们将遇到许多__者不可能遇到的问题 现在,大多数公司将软件测试看作技术工程专业工作,有意识地在项目组中培训软件测试人员,并在__过程中早期投入工作以便做出质量更优的软件一般来说,优秀的软件测试人员应具备以下素质
5.2软件测试方法【本节知识点】 软件测试方法概述 黑盒测试方法 白盒测试方法 程序的静态测试
5.
2.1软件测试方法概述 软件测试的方法和技术是多种多样的,可以从不同的角度加以分类从是否需要执行被测软件的角度来看,可分为静态测试和动态测试;从测试是否针对系统的内部结构和具体实现算法的角度来看,可分为白盒测试和黑盒测试静态测试与动态测试 静态测试是指被测试程序不在机器上运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测,主要方法包括
(1)人工测试 人工测试是指不依靠计算机而靠人工审查程序或评审软件人工审查程序侧重于对编码质量的检验,而软件审查除了审查编码还要对各阶段的软件产品进行检验人工测试可以发现计算机不易发现的错误,据统计,可以有效地发现30%~70%的逻辑设计和编码错误,可以减少系统测试的总工作量
(2)计算机辅助静态分析 计算机辅助静态分析是指利用静态分析工具对被测试程序进行特性分析,从程序中提取一些信息,以便检查程序逻辑的各种错误和可疑的程序构造,如错误地使用局部变量和全局变量、不匹配的参数、潜在的死循环以及不会执行到的代码等另外,这种测试还可以提供一些间接涉及程序欠缺的信息、各种类型的语句出现的次数、变量和常量的引用表、标识符的使用方式、过程的调用层次及违背编码规则等 动态测试是指通过运行程序发现错误,一般意义上的测试主要是指动态测试为了使测试发现更多的错误,需要运用一些有效的方法,一种是黑盒测试,即测试产品的功能,一种是白盒测试,即测试产品内部结构及处理过程黑盒测试与白盒测试 黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有功能的情况下,通过测试来检测每个功能是否都能正常使用在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性黑盒测试方法主要有等价类划分、边值分析、因果图、错误推测等,主要用于软件确认测试 黑盒测试着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试理想情况下,黑盒测试应该是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试 白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能白盒测试的主要方法有逻辑驱动、基本路径测试等,主要用于软件验证白盒测试全面了解程序内部逻辑结构、对所有逻辑路径进行测试理想情况下,白盒测试应该是穷举路径测试,在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据然而贯穿程序的__路径数是天文数字,但即使每条路径都测试了仍然可能有错误 第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序 第二,穷举路径测试不可能查出程序中因遗漏路径而出错 第三,穷举路径测试可能发现不了一些与数据相关的错误 所以,黑盒测试与白盒测试都不能使测试达到__,为了用有限的测试发现更多的错误,需要精心设计测试用例选择测试用例是软件测试人员最重要的一项任务不正确的选择可能导致测试量过大或者过小,甚至测试目标不对准确评估风险,将不可穷尽的可能性减少到可以控制的范围是成功的诀窍
5.
2.2黑盒测试方法 黑盒测试方法是根据软件产品的功能设计规格说明,通过运行程序进行测试,证实每个已经实现的功能是否符合设计要求黑盒测试完全不考虑程序的内部结构,只是需要软件产品的设计文档,通过有效的方法设计测试用例由于黑盒测试不可能使用所有可以输入的数据,因此只能从中选择一部分数据进行测试等价类划分 等价类划分是一种典型的黑盒测试方法等价类是指测试相同目标或者暴露相同错误的一组测试用例,等价类划分是将数量巨大的输入数据(有效的和无效的)划分成若干等价类,在每一个等价类中选取一个代表性的输入数据作为测试的输入条件,通过这些少量代表性测试数据覆盖整个输入数据__,取得良好的测试效果 使用等价类划分方法设计测试用例时,需要同时考虑有效等价类和无效等价类的设计有效等价类是由那些对于软件设计规格说明来说合理的、有意义的输入数据所组成,它可以检测软件是否实现了规格说明所规定的功能和性能无效等价类是由那些对于软件设计规格说明来说不合理的、无意义的输入数据所组成,它可以检测软件中的功能和性能是否存在不符合规格说明的情况 等价类划分的目的是将可能的测试用例组合减少到仍然足以测试软件的控制范围,这种划分具有风险性,一定要仔细选择分类对于初涉软件测试者,一定要请经验丰富的测试人员审查所划分的等价类 例1一个程序计算任何一个在1~1000内整数的平方数,那么其输入项的等价类划分为例2Windows文件名可以包含255个字符,但不能包含正斜杠(/)、反斜杠(\)、大于号()、小于号()、星号(*)、问号()、引号()、竖线(|)、冒号()或分号(;)等字符,那么文件名的等价类划分为输入条件有效等价类无效等价类字符个数1~255个0个,≥256个文件名组成含合法字符含非法字符边界值分析 __的测试经验显示,软件错误一般不是发生正常的输入范围内,却常常发生在输入或输出的边界上因此,针对各种边界情况的测试是十分重要的 使用边界值分析方法设计测试用例时,首先要确定边界情况,通常输入等价类和输出等价类的边界,就是应该着重测试的边界情况选择测试用例时,一定要选择临近边界的合法数据,即最后一个可能合法的数据,以及刚刚超过边界的非法数据 例1如果文本编辑框允许输入1~255个字符,那么可以选取合法输入为1个字符和255个字符,非法输入为0个字符和256个字符 例2如果一个文本编辑框只接受字母输入A~Z和a~z,那么非法输入应该选择ASCII码表中这些字符前后的字符@、[、{等状态测试 软件测试有时需要通过不同的状态验证程序的逻辑流程,这时需要从用户的角度建立状态转换图,然后根据以下原则选择相应的测试用例
(1)每一种状态至少访问一次;
(2)测试看起来最常见最普遍的状态转换;
(3)测试状态之间最不常用的分支;
(4)测试所有错误状态及其返回值;
(5)测试随机状态转换图
5.2状态转换图示例 举例对于接受用户输入口令,可以绘制如图
5.2所示的状态转换图,其中包含空闲和等待输入两个状态设计测试用例时,从最初的空闲状态开始,合法输入是按下ESC键,非法输入是按下除ESC以外的其他任何键,可以选择ASCII表ESC字符前后的字符在等待输入状态,利用等价类划分方法设计有效等价类和无效等价类,并选择相应的测试用例失败条件测试 前面的测试都属于通过测试,包括审查软件、描绘状态、尝试各种合法可能性、确认状态及其转换正常与之相反的做法是找到测试软件失败的用例,主要有竞争条件、重复、__和重负 许多软件都是运行在多任务或多进程的环境下,因此软件设计必须能够与其他任何软件在系统中同时运行,并且共享内存、磁盘、通信设备以及其他硬件资源,这些都可能导致竞争条件问题以下是面临竞争条件的典型情形 *两个不同的程序同时保存或打开同一个文档; *共享同一台打印机、通信端口或者其他通信设备; *当软件处于读取或者修改状态时按键或者单击鼠标; *同时关闭或者启动软件的多个实例; *同时使用不同的程序访问一个共同数据库 重复测试是不断执行同样的操作,如不停地启动或关闭程序、反复读写数据或者选择同一个操作这种测试的主要原因是查看内存是否不足,往往一些操作执行完之后内存没有完全释放,结果是程序越来越慢,最终耗尽其工作的内存空间 __测试是使软件在不够理想的条件下运行,如内存小、磁盘空间少、CPU速度慢、网络速度低等,观察软件对外部资源的要求和依赖程度__测试将支持降到最低限度,目的在于尽可能地限制软件的必要条件 重负测试与__测试相反,它是尽量提供条件尽量发挥,让软件处理尽可能大的数据文件如果软件对打印机或通信端口之类的外设进行操作,则将能连的外设都连上如果正在测试的Internet服务器可以处理几千个模拟连接,则最大限度地挖掘软件的能力,让其不堪重负另外,时间也是一种重负测试,有些软件应该能够永远运行下去,而不用重新启动 重复、__和重负测试应联合使用,同时进行错误推测法 人们可以凭借经验、直觉和预感测试软件中可能存在的各种错误,从而有针对性设计测试用例根据经验积累和直觉判断,列出软件中所有可能存在的错误和容易发生错误的情况,针对这些情况选择测试用例 例如测试一个排序程序,可以选择输入空的值、输入一个数据、所有输入数据均相等、所有输入数据有序排列、所有输入数据逆序排列等进行错误推测
5.
2.3白盒测试方法 白盒测试方法是根据软件产品的内部工作过程,通过运行程序进行测试,以证实每一种内部操作是否符合设计规格要求,所有内部成分是否已经检查过白盒测试允许测试人员利用代码的内部结构,设计测试用例进行测试逻辑覆盖 逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术,根据覆盖的范围不同,又可分为语句覆盖、分支覆盖、条件覆盖等
(1)语句覆盖 语句覆盖是指设计测试用例,使得程序中每一条语句至少执行一次
(2)分支覆盖 分支覆盖是指设计测试用例,使得程序中每一个判断的取真分支和取假分支都至少能够执行一次
(3)条件覆盖 条件覆盖是指设计测试用例,使得程序中每一个判断的每个条件的可能取值至少执行一次路径测试 路径测试是设计足够的测试用例,覆盖程序中所有可能的路径在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度
(1)条件测试路径的选择 当程序中判定多于一个时,形成的分支结构可以分为两类,即嵌套型分支结构和连锁型分支结构,如图
5.3所示图
5.3条件分支结构的类型 对于嵌套型分支结构,若有n个判定语句,需要n+1个测试用例对于连锁型分支结构,若有n个判定语句,需要有2n个测试用例覆盖其2n条路径,但当n较大时将无法测试为了减少测试用例的数量,可以根据各条路径的重要性,采用加权等方法筛掉部分路径,并进行抽样减少测试路径的数量
(2)循环测试路径的选择 循环分为4种不同类型简单循环、连锁循环、嵌套循环和非结构循环,如图
5.4所示图
5.4循环的类型 对于简单循环,测试应该包括零次循环、1次循环、2次循环、某个中间次数循环、最大次数循环、比最大次数多一次的循环、比最大次数少一次的循环等类型的测试用例 对于嵌套循环,可以按以__法减少测试用例的数量
(1)除最内层的循环外,所有其他层的循环变量置为最小值,对最内层的循环进行简单循环的全部测试;
(2)逐步外推,对其外面一层循环进行测试测试时,所有外层循环的循环变量取最小值,所有其他嵌套内层循环的循环变量取典型值;
(3)反复进行,直到所有各层循环测试完毕;
(4)对全部各层循环同时取最小循环次数,或者最大循环次数 对于连锁循环,如果各个循环是相互__的,则可以用与简单循环相同的方法进行测试;如果多个循环不是相互__的,则需要用测试嵌套循环的办法处理 对于非结构循环,应该使用结构化程序设计方法重新设计循环
5.
2.4程序的静态测试 程序的静态测试是在不执行程序的条件下,有条理地仔细审查软件设计、体系结构和代码,从而找出软件错误的过程静态测试的重要方法有同行审查、代码会审、代码走查等,这些审查方法具有四个基本要素
(1)查找问题 审查的目的是找出软件的问题,所有批评应该直接针对代码,而不是编写代码的人
(2)遵守规则 审查需要遵守一套固定的规则,包括可能会设定所审查的代码量、所花的时间、那些内容要做备注等
(3)审查准备 每一个合__都要为审查做准备,审查过程中找出的问题大部分是在准备期间发现的,而不是实际的审查期间
(4)编写报告 审查小组必须做出总结审查结果的书面报告,并将审查会议结果尽快通知同行审查 同行审查常常仅在编写代码的程序员和充当审查者的其他1~2个程序员和测试员之间进行为了保证审查的高效率,不致流于休息闲聊,所有参与人员切实保证审查的四个基本要素,即查找问题、遵守规则、审查准备和编写报告代码会审 代码会审是由若干程序员和测试员组成一个会审小组,编写代码的程序员逐句讲解代码是如何以及___工作的,审查人员聆听陈述,提出有疑义的问题审查人员应该在审查之前接到软件拷贝,以便检查并编写备注和问题,在审查过程中提问代码走查 代码走查与代码会审基本相同,所不同的是它不是简单地阅读程序代码和对照错误检查表进行检查,而是由测试人员为被测程序准备一批具有代表性的测试用例,走查小组按照所提交的测试用例,模仿计算机运行一遍,并记录跟踪情况经过讨论分析后,找出软件的错误通用代码审查清单 在代码审查时,我们可以运用代码审查清单,将以往所有可能发生的常见错误罗列出来,供与会者对照检查,从而提高会审效率
(1)数据引用错误数据引用错误是指使用未经正确地初始化的变量、常量、数组、字符串或记录 *是否引用了未初始化的变量? *数组和字符串的下标是整数值吗?下标总是在数组和字符串大小范围之内吗? *在检索操作或者应用数组下标时是否包含丢掉一个这样的潜在错误? *是否在应该使用常量的地方使用了变量? *变量是否被赋予不同类型的值? *为引用的指针分配内存了吗? *一个数据结构是否在多个函数或者子程序中引用,在每一个引用中明确定义结构了吗?
(2)数据声明错误数据声明错误是指不正确地声明或使用变量和常量 *所有变量都赋予正确的长度、类型和存储类了吗? *变量是否在声明的同时进行了初始化?是否正确初始化并与其类型一致? *变量有相似的名称吗? *存在声明过、但从未引用或者只引用过一次的变量吗? *在特定模块中所有变量都显式地声明了吗?
(3)计算错误计算错误是指基本的数学逻辑问题 *计算中是否使用了不同数据类型的变量,如整数与浮点数相加? *计算中是否使用了数据类型相同但字节长度不同的变量? *计算时是否了解和考虑到编译器对类型或长度不一致的变量的转换规则? *赋值的目的变量是否小于赋值表达式的值? *在数值计算过程中是否可能出现溢出? *除数或模是否可能为零? *对于整型算术运算或某些计算,特别是除法的代码处理是否会丢失精度? *变量的值是否超过有意义的范围? *对于包含多个操作的表达式,求值次序是否混乱,运算优先级对吗?需要加括号使其清晰吗?
(4)比较错误小于、大于、等于、不等于、真、假、比较和判断错误很可能是边界条件问题 *比较得正确吗? *存在分数或者浮点数之间的比较吗?如果有,精度问题会影响比较吗?
1.00000001和
1.00000002极其接近,它们相等吗? *每一个逻辑表达式都正确地表达了吗?逻辑计算如期进行了吗?求值次序有疑问吗? *逻辑表达式的操作数是逻辑值吗?
(5)控制流程错误控制流程错误是指编程语言中循环等控制结构未按预期方式工作,通常由计算或者比较错误直接或间接造成 *程序中的语句组是否对应? *程序、模块、子程序和循环能否终止?如果不能,可以接受吗? *可能存在永远不停的循环吗? *循环可能从不执行吗?如果是这样,可能接受吗? *对于多分支语句,索引变量能超出可能的分支数目吗?如果超出,该情况能正确处理吗? *是否存在丢掉一个错误,导致意外进入循环?
(6)子程序参数错误子程序参数错误的来源是软件子程序不正确地传递数据 *子程序接收的参数类型和大小与调用代码发送的匹配吗?次序正确吗? *如果子程序有多个入口点,引用的参数是否与当前入口点没有关系? *常量是否当作形参传递,意外在子程序中改动? *子程序是更改了仅作为输入值的参数? *每一个参数的单位是否与相应的形参匹配? *如果存在全局变量,在所有引用子程序中是否有相似的定义和属性?
(7)输入/输出错误输入/输出错误包括文件读取、接受键盘或鼠标输入以及向输出设备写入错误等 *软件是否严格遵守外设读写数据的专用格式? *文件或者外设不存在或者未准备好的错误情况有处理吗? *软件是否处理外设未连接、不可用、或者读写过程中存储空间占满等情况? *软件以预期的方式处理预计的错误吗? *检查错误提示信息的准确性、正确性、语法和拼写了吗?
(8)其他错误 *软件是否使用其他外语?是否处理扩展ASCII字符?是否需用统一编码取代ASCII? *软件是否需要移植到其他编译器? *是否考虑了兼容性,以使软件能够运行于不同数量的可用内存、不同的内部硬件、不同的外设等? *程序编译是否产生警告或者提示信息?这些信息通常指示语句有疑问
5.3软件测试过程管理【本节知识点】 软件测试过程 单元测试 集成测试 确认测试 系统测试 软件调试
5.
3.1软件测试过程软件测试时需要以下三类信息
(1)软件配置需求规格说明书、软件设计说明书和源程序等;
(2)测试配置测试方案、测试用例和测试驱动程序等;
(3)测试工具计算机辅助测试的有关工具 软件经过测试之后,要根据预期的结果对测试的结果进行分析比较,对于出现的错误要进行纠正,并修改相应的文档修改后的程序往往要经过再次测试,直到满意为止在分析结果的同时,要对软件可靠性进行评价,如果总是出现需要修改设计的严重错误,软件质量和可靠性就值得怀疑,同时也需要做进一步的测试;如果软件功能能够正确完成,出现的错误易修改,可以断定软件的质量和可靠性可以接受或者所做的测试还不足以发现严重错误;如果测试发现不了错误,那么可以断定测试方案、测试用例考虑得不够细致充分,错误仍潜伏在软件中,应考虑重新制定测试方案,设计测试用例软件测试步骤 软件产品在交付使用之前,一般需要经过单元测试、集成测试、确认测试和系统测试,具体步骤如图
5.5所示 单元测试是对源程序中每一个程序单元进行测试,检查各个模块是否正确实现了规定的功能,从而发现模块在编码中或算法中的错误该阶段涉及编码和详细设计的文档各模块经过单元测试后,将各模块组装起来进行集成测试,以检查与设计相关的软件体系结构的有关问题确认测试主要检查已实现的软件是否满足需求规格说明书中确定的各种需求系统测试将已确定的软件与其他系统元素(如硬件、其他支持软件、数据和人工等)结合在一起进行测试如图
5.6显示了软件__过程中的测试与软件__各阶段之间的关系图
5.6软件测试与软件__过程的关系测试人员__ 为了保证软件的__质量,软件测试应贯穿于软件定义与__的整个过程因此,对分析、设计和实现等各阶段所得到的结果,包括需求规格说明、设计规格说明及源程序都应进行软件测试为此,测试人员的__也应是分阶段的
(1)需求分析评审 软件的设计和实现都是基于需求分析规格说明进行的,需求分析规格说明是否完整、正确、清晰是软件__成败的关键为了保证需求定义的质量,应对其进行严格的审查 相应的审查小组由下列人员组成 *组长1人 *成员包括系统分析员,软件__管理者,软件设计、__和测试人员和用户
(2)设计评审 软件设计是将软件需求转换成软件表示的过程主要描绘出系统结构、详细的处理过程和数据库模式按照需求的规格说明对系统结构的合理性、处理过程的正确性进行评价,同时利用关系数据库的规范化理论对数据库模式进行审查 相应的评审小组由下列人员组成 *组长1人 *成员包括系统分析员、软件设计人员、测试负责人员各一人
(3)程序的测试 软件测试是整个软件__过程中交付用户使用前的最后阶段,是软件质量保证的关键软件测试在软件生存周期中横跨两个阶段通常在编写出每一个模块之后,就对它进行必要的测试,称为单元测试编码与单元测试属于软件生存周期中的同一阶段,该阶段的测试工作由编程组内部人员进行交叉测试,应避免编程人员测试自己的程序这一阶段结束后,进入软件生存周期的测试阶段,对软件系统进行各种综合测试这时,测试工作由专门的测试组完成,测试组设组长一名,负责整个测试的计划、__工作测试组的其他成员由具有一定的分析、设计和编程经验的专业人员组成,人数根据具体情况可多可少,一般3~5人为宜软件测试文件 软件测试文件描述要执行的软件测试及测试的结果由于软件测试是一个很复杂的过程,同时也涉及软件__其它一些阶段的工作,对于保证软件的质量及其运行有着重要意义,必须把对它们的要求、过程及测试结果以正式的文件形式写出测试文件的编写是测试工作规范化的一个组成部分 测试文件不只在测试阶段才考虑,它在软件__的需求分析阶段就开始着手,因为测试文件与用户有着密切的关系在设计阶段的一些设计方案也应在测试文件中得到反映,以利于设计的检验测试文件对于测试阶段工作的指导与评价作用更是非常明显的,需要特别指出的是,在已__的软件投入运行的维护阶段,常常还要进行再测试或回归测试,这时仍须用到测试文件 根据测试文件所起的作用不同,通常把测试文件分成两类,即测试计划和测试分析报告测试计划详细规定测试的要求,包括测试的目的和内容、方法和步骤,以及测试的准则等由于要测试的内容可能涉及到软件的需求和软件的设计,因此必须及早开始测试计划的编写工作不应在着手测试时,才开始考虑测试计划通常,测试计划的编写从需求分析阶段开始,到软件设计阶段结束时完成测试报告用来对测试结果的分析说明,经过测试后,证实了软件具有的能力,以及它的缺陷和限制,并给出评价的结论性意见,这些意见即是对软件质量的评价,又是决定该软件能否交付用户使用的依据由于要反映测试工作的情况,自然要在测试阶段内编写测试文件的重要性表现在以下几个方面
5.
3.2单元测试单元测试主要任务包括
(1)模块接口测试;
(2)模块局部数据结构测试;
(3)模块中所有__执行通路测试;
(4)模块的各条错误处理通路测试;
(5)模块边界条件测试模块接口测试 模块接口测试是单元测试的基础,主要检查数据能否正确地通过模块只有在数据能正确流入、流出模块的前提下,其他测试才有意义 测试接口正确与否应该考虑下列因素 *输入的实际参数与形式参数的个数是否相同; *输入的实际参数与形式参数的属性是否匹配; *输入的实际参数与形式参数的量纲是否一致; *调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同; *调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配; *调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致; *调用预定义函数时所用参数的个数、属性和次序是否正确; *是否存在与当前入口点无关的参数引用; *是否修改了只读型参数; *对全程变量的定义各模块是否一致; *是否把某些约束作为参数传递 如果模块内包括外部输入输出,还应该考虑下列因素 *文件属性是否正确; *打开或关闭语句是否正确; *格式说明与输入输出语句是否匹配; *缓冲区大小与记录长度是否匹配; *文件使用前是否已经打开; *是否处理了文件尾; *是否处理了输入/输出错误; *输出信息中是否有文字性错误局部数据结构测试 检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误 *不合适或不相容的类型说明; *变量无初值; *变量初始化或缺省值有错; *不正确的变量名(拼错或不正确地截断); *出现上溢、下溢和地址异常 除了局部数据结构外,如果可能,单元测试时还应该查清全局数据(例如FORTRAN的公用区)对模块的影响重要执行路径测试 在模块中应对每一条__执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次此时设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误,其中基本路径测试和循环测试是最常用且最有效的测试技术 计算中常见的错误包括 *误解或用错了算符优先级; *混合类型运算; *变量初值错; *精度不够; *表达式符号错 比较判断与控制流常常紧密相关,测试用例还应致力于发现下列错误 *不同数据类型的对象之间进行比较; *错误地使用逻辑运算符或优先级; *因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等; *比较运算或变量出错; *循环终止条件或不可能出现; *迭代发散时不能退出; *错误地修改了循环变量错误处理测试 一个好的设计应能预见各种出错条件,并预设各种出错处理通路,出错处理通路同样需要认真测试,测试应着重检查下列问题 *输出的出错信息难以理解; *记录的错误与实际遇到的错误不相符; *在程序自定义的出错处理段运行之前,系统已介入; *异常处理不当; *错误陈述中未能提供足够的定位出错信息边界条件测试 边界条件测试是单元测试中最后一项任务,也是最重要的一项任务众所周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误单元测试方法 一般认为单元测试应紧接在编码之后,当源程序编制完成并通过复审和编译检查,便可开始单元测试测试用例的设计应与复审工作相结合,根据设计信息选取测试数据,将增大发现上述各类错误的可能性在确定测试用例的同时,应给出期望结果 由于被测试的模块往往不是__的程序,它处于整个软件结构的某一层上,被其他模块调用或调用其他模块,其本身不能单独运行,因此在单元测试时,应为测试模块__一个驱动模块(driver)和(或)若干个桩模块(stub),如图
5.7显示了一般单元测试的环境图
5.7单元测试环境 驱动模块的作用是用来模拟被测模块的上级调用模块,功能要比真正的上级模块简单得多,它接收测试数据并将这些数据传递到被测试模块,被测试模块被调用后,打印进入-退出消息桩模块用来代替被测模块所调用的模块,用以返回被测模块所需的信息 驱动模块和桩模块是测试使用的软件,而不是软件产品的组成部分,其编写需要一定的__费用若驱动和桩模块比较简单,实际开销相对低些遗憾的是,仅用简单的驱动模块和桩模块不能完成某些模块的测试任务,这些模块的单元测试只能采用后面讨论的集成测试方法
5.
3.3集成测试 时常有这样的情况发生,每个模块都能单独工作,但这些模块集成在一起之后却不能正常工作,其主要原因是模块相互调用时接口会引入许多新问题例如,数据经过接口可能丢失;一个模块对另一模块可能造成不应有的影响;几个子功能组合起来不能实现主功能;误差不断积累达到不可接受的程度;全局数据结构出现错误等等集成测试是组装软件的系统测试技术,按设计要求把通过单元测试的各个模块组装在一起之后,进行综合测试以便发现与接口有关的各种错误 某设计人员习惯于把所有模块按设计要求一次全部组装起来,然后进行整体测试,这称为非增量式集成这种方法容易出现混乱,因为测试时可能发现一大堆错误,为每个错误定位和纠正非常困难,并且在改正一个错误的同时又可能引入新的错误,新旧错误混杂,更难断定出错的原因和位置与之相反的是增量式集成方法,程序一段一段地扩展,测试的范围一步一步地增大,错误易于定位和纠正,界面的测试亦可做到完全__增量式集成方法主要包括自顶向下集成和自底向上集成两种类型 自顶向下集成测试的具体步骤如下
(1)以主控模块作为测试驱动模块,把对主控模块进行单元测试时引入的所有桩模块用实际模块替代;
(2)依据所选的集成策略(深度优先或广度优先),每次只替代一个桩模块;
(3)每集成一个模块立即测试一遍;
(4)只有每组测试完成后,才着手替换下一个桩模块;
(5)为避免引入新错误,须不断地进行回归测试,即全部或部分地重复已做过的测试 从第二步开始,循环执行上述步骤,直至整个程序结构构造完毕如图
5.8中,实线表示已部分完成的结构,若采用深度优先策略,下一步将用模块M7替换桩模块S7,当然M7本身可能又带有桩模块,随后将被对应的实际模块一一替代 自顶向下集成的优点是能尽早地对程序的主要控制和决策机制进行检验,因此较早地发现错误缺点是在测试较高层模块时,低层处理采用桩模块替代,不能反映真实情况,重要数据不能及时回送到上层模块,因此测试并不充分解决这个问题有几种办法,第一种是把某些测试推迟到用真实模块替代桩模块之后进行,第二种是__能模拟真实模块的桩模块;第三种是自底向上集成模块第一种方法又回退为非增量式的集成方法,使错误难于定位和纠正,并且失去了在组装模块时进行一些特定测试的可能性;第二种方法无疑要大大增加开销;第三种方法比较切实可行自底向上集成 自底向上集成是从软件结构最低层的模块开始组装测试,因测试到较高层模块时,所需的下层模块功能均已具备,所以不再需要桩模块 自底向上综合测试的步骤分为
(1)把低层模块__成实现某个子功能的模块群(cluster);
(2)__一个测试驱动模块,控制测试数据的输入和测试结果的输出;
(3)对每个模块群进行测试;
(4)删除测试使用的驱动模块,用较高层模块把模块群__成为完成更大功能的新模块群 从第一步开始循环执行上述各步骤,直至整个程序构造完毕 下图
5.9说明了上述过程,即首先最底层模块被分为三个模块群,每个模块群引入一个驱动模块进行测试因模块群
1、模块群2中的模块均隶属于模块__,因此在驱动模块D
1、D2去掉后,模块群1与模块群2直接与__接口同样,在模块群3与Mb接口前去掉D3,最后__、Mb和Mc全部集成在一起进行测试 自底向上集成方法不用桩模块,测试用例的设计亦相对简单,但缺点是程序最后一个模块加入时才具有整体形象,它与自顶向综合测试方法优缺点正好相反因此,在测试软件系统时,应根据软件的特点和工程的进度,选用适当的测试策略,有时混和使用两种策略更为有效,上层模块用自顶向下的方法,下层模块用自底向上的方法
5.
3.4确认测试 通过综合测试之后,软件已完全组装起来,接口方面的错误也已排除,这是可以开始对软件进行最后的确认测试确认测试主要检查软件能否按合同要求进行工作,即是否满足软件需求说明书中的确认标准 实现软件确认要通过一系列黑盒测试确认测试同样需要制订测试计划和过程,测试计划应规定测试的种类和测试进度,测试过程则定义一些特殊的测试用例,旨在说明软件与需求是否一致无论是计划还是过程,都应该着重考虑软件是否满足合同规定的所有功能和性能,文档资料是否完整、准确,人机界面和其他方面(例如,可移植性、兼容性、错误恢复能力和可维护性等)是否令用户满意 确认测试的结果有两种可能,一种是功能和性能指标满足软件需求说明的要求,用户可以接受;另一种是软件不满足软件需求说明的要求,用户无法接受项目进行到这个阶段才发现严重错误和偏差一般很难在预定的工期内改正,因此必须与用户协商,寻求一个妥善解决问题的方法 确认测试的另一个重要环节是配置复审,如图
5.10所示,复审的目的在于保证软件配置齐全、分类有序,并且包括软件维护所必须的细节图
5.10软件配置审查 事实上,软件__人员不可能完全预见用户实际使用程序的情况,例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解等等因此,软件是否真正满足最终用户的要求,应由用户进行一系列验收测试验收测试既可以是非正式的测试,也可以有计划有系统的测试有时,验收测试长达数周甚至数月,不断暴露错误,导致__延期一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题 α测试是指软件__公司__内部人员模拟各类用户行对即将面市软件产品(称为α版本)进行测试,试图发现错误并修正α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的用户操作方式经过α测试调整的软件产品称为β版本紧随其后的β测试是指软件__公司__各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见然后软件__公司再对β版本进行改错和完善
5.
3.5系统测试 计算机软件是基于计算机系统的一个重要组成部分,软件__完成后应与系统中其它成分集成在一起,此时需要进行一系列系统集成和确认测试对这些测试的详细讨论已超出软件工程的范围,这些测试也不可能仅由软件__人员完成 在系统测试之前,软件工程师应完成下列工作
(1)为测试软件系统的输入信息设计出错处理通路;
(2)设计测试用例,模拟错误数据和软件界面可能发生的错误,记录测试结果,为系统测试提供经验和帮助;
(3)参与系统测试的规划和设计,保证软件测试的合理性 系统测试应该由若干个不同测试组成,目的是充分运行系统,验证系统各部件是否都能正常工作并完成所赋予的任务恢复测试 恢复测试主要检查系统的容错能力当系统出错时,能否在指定时间间隔内修正错误并重新启动系统恢复测试首先要采用各种办法强迫系统失败,然后验证系统是否能尽快恢复对于自动恢复需验证重新初始化(reinitialization)、检查点(checkpointingmechani__s)、数据恢复(datarecovery)和重新启动(restart)等机制的正确性;对于人工干预的恢复系统,还需估测平均修复时间,确定其是否在可接受的范围内安全测试 安全测试检查系统对非法侵入的防范能力安全测试期间,测试人员假扮非法入侵者,采用各种办法试图突破防线例如,
①想方设法截取或破译口令;
②专门定做软件破坏系统的保护机制;
③故意导致系统失败,企图趁恢复之机非法进入;
④试图通过浏览非保密数据,推导所需信息等等 理论上讲,只要有足够的时间和资源,没有不可进入的系统因此,系统安全设计的准则是使非法侵入的代价超过被保护信息的价值,此时非法侵入者已无利可图强度测试 强度测试检查程序对异常情况的抵抗能力强度测试总是迫使系统在异常的资源配置下运行例如,
①当中断的正常频率为每秒一至两个时,运行每秒产生十个中断的测试用例;
②定量地增长数据输入率,检查输入子功能的反映能力;
③运行需要最大存储空间(或其他资源)的测试用例;
④运行可能导致虚存操作系统崩溃或磁盘数据剧烈抖动的测试用例等等性能测试 对于那些实时和嵌入式系统,软件部分即使满足功能要求,也未必能够满足性能要求,虽然从单元测试起,每一测试步骤都包含性能测试,但只有当系统真正集成之后,在真实环境中才能全面、可靠地测试运行性能系统性能测试是为了完成这一任务性能测试有时与强度测试相结合,经常需要其他软硬件的配套支持
5.
3.6软件调试 软件调试与成功的测试形影相随软件测试成功的标志是发现了错误,而软件调试则是在软件测试成功后,根据错误迹象确定错误的原因和准确位置,并加以改正 软件调试是程序员自己进行的技巧性很强的工作,要确定发生错误的内在原因和位置不是一件容易的事,它占整个调试工作量的90%左右调试工作的困难与人的心理因素和技术因素都有关系,需要繁重的脑力劳动和丰富的经验 调试是一个相当艰苦的过程,究其原因除了__人员心理方面的障碍外,还因为隐藏在程序中的错误具有下列特殊的性质
(1)错误的外部征兆远离引起错误的内部原因,对于高度耦合的程序结构此现象更为严重;
(2)纠正一个错误造成了另一错误现象(暂时)的消失;
(3)某些错误征兆只是假象;
(4)因操作人员一时疏忽造成的某些错误征兆不易追踪;
(5)错误是由于风时而不是程序引起的;
(6)输入条件难以精确地再构造(例如,某些实时应用的输入次序不确定);
(7)错误征兆时有时无,此现象对嵌入式系统尤其普遍;
(8)错误是由于把任务分布在若干台不同处理机上运行而造成的 在软件调试过程中,可能遇到大大小小、形形__的问题,随着问题的增多,调试人员的压力也随之增大,过分地紧张致使__人员在排除一个问题的同时又引入更多的新问题 尽管调试不是一门好学的技术,有时人们更愿意称之为艺术,但还是有若干行之有效的方法和策略,下面介绍几种常见的调试方法简单的调试方法
(1)在程序中插入打印语句 此方法的优点是显示程序的动态过程,比较容易检查源程序的有关信息缺点是效率低,可能输出大量无关的数据,发现错误带有偶然性同时还要修改程序,这种修改可能会掩盖错误,改变关键的时间关系或把新的错误引入程序
(2)运行部分程序 有时为了测试某些被怀疑有错的程序段,整个程序反复执行多次,使很多时间浪费在执行已经是正确的程序段上在这种情况下,应设法使被测程序只执行需要检查的程序段,以提高效率
(3)借助于调试工具 目前大多数程序设计语言都有专门的调试工具,可以利用这些工具分析程序的动态行为例如,借助追踪功能可以追踪子程序调用、循环与分支执行路径、特定变量的变化情况等,利用设断点可以执行特定语句或改变特定变量值引起的程序中断,以便检查程序的当前状态另外,还可以借助调试工具观察或输出内存变量的值,大大提高调试程序的效率,缺点是会产生大量的无关信息,也会走弯路归纳法调试 归纳法是一种从特殊到一般的思维过程,从对个别事例的认识当中,概括出共同特点,得出一般性规律的思考方法归纳法调试从测试结果发现的线索入手,分析它们之间的__,导出错误原因的假设,然后再证明或否定这个假设 归纳法调试的具体步骤如下演绎法调试 演绎法是一种从一般的推测和前提出发,运用排错和推断过程作出结论的思考方法演绎法调试是列出所有可能的错误原因的假设,然后利用测试数据排除不适当的假设,最后在用测试数据验证余下的假设确实是出错的原因演绎法调试的具体步骤如下回溯法调试 该方法从程序产生错误的地方出发,人工沿程序的逻辑路径反向搜索,直到找到错误的原因为止该方法是对小型程序寻找错误位置的有效方法
5.4软件测试自动化【本节知识点】测试自动化的意义测试自动化的若干做法
5.
4.1测试自动化的意义 软件测试的工作量很大,据统计,测试时间会占到总__时间的40%,一些可靠性要求非常高的软件,测试时间甚至占到总__时间的60%但测试却是在整个软件过程中极有可能应用计算机进行自动化的工作,原因是测试的许多操作是重复性的、非智力创造性的、需要细致注意力的工作,而计算机就最适合于代替人类去完成这些任务 测试自动化是通过__和使用一些工具自动测试软件系统,特别适合于测试中重复而繁琐的活动,其好处是显而易见的
(1)可以使某些测试任务比手工测试执行的效率高,并可以运行更多更频繁的测试
(2)对程序的新版本可以自动运行已有的测试,特别是在频繁的修改许多程序的环境中,一系列回归测试的开销应是最小的
(3)可以执行一些手工测试困难或不可能做的测试,例如对于200个用户的联机系统,用手工进行并发操作的测试几乎是不可能的,但自动测试工具可以模拟来自200个用户的输入客户端用户通过定义可以自动回放的测试,随时都可以运行用户脚本,即使是不了解整个商业应用复杂内容的技术人员也可以胜任
(4)更好地利用资源将繁琐的任务自动化,如重复输入相同的测试输入,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来投入更多精力设计更好的测试用例另外,可以利用整夜或周末空闲的机器执行自动测试
(5)测试具有一致性和可重复性对于自动重复的测试可以重复多次相同的测试,如不同的硬件配置、使用不同的操作系统或数据库等,从而获得测试的一致性,这在手工测试中是很难保证的
(6)测试可以重用,而且软件经过自动测试后,人们对其信任度会增加
(7)一旦一系列测试已经被自动化,则可以更快地重复执行,从而缩短了测试时间,使软件更快地推向市场 总而言之,测试自动化通过较少的开销可以获得更__的测试,并提高产品的质量但是,在实际使用自动测试的过程中,还存在一些普遍的问题
(1)人们乐观地期望测试工具可以解决目前遇到的所有问题,但无论工具从技术角度实现得多么好,都满足不了这种不现实的期望
(2)如果缺乏测试实践经验,测试__差,文档较少或不一致,测试发现缺陷的能力较差,在这种情况下采用自动测试并不是好办法
(3)人们容易期望自动测试发现大量的新缺陷测试执行工具是回归测试工具,用于重复已经运行过的测试,这是一件很有意义的工作,但并不是用来发现大量新的缺陷
(4)因为测试软件没有发现任何缺陷并不意味着软件没有缺陷,测试不可能全面或测试本身就有缺陷,但人们在使用自动化测试过程中会缺乏这种意识
(5)当软件修改后,经常需要修改部分或全部测试,以便可以重新正确地运行,对于自动测试更是如此测试维护的开销打击了测试自动化的积极性
(6)商用测试执行工具是软件产品,由销售商销售,它们往往不具备解决问题的能力和有力的技术支持,因此给用户带来失望,认为测试工具不能很好地测试
(7)自动测试实施起来并不简单,必须有管理支持及__艺术,必须进行选型、培训和实践,并在__内普遍使用工具 测试自动化具有局限性,不可能取代手工测试手工测试可以比自动测试发现更多的缺陷,而测试自动化对期望结果的正确性有极大的依赖性测试自动化并不能改进测试有效性,并对软件__有一定的制约作用,测试工具没有创造性灵活性较差然而,测试自动化可以大大促进软件测试的质量和产品化
5.
4.2测试自动化的若干做法 一般测试过程包括标识测试条件、设计测试用例、建立测试用例、执行测试用例、比较测试输出等五个基本活动
(1)标识测试条件 确定测试什么并最好定义这些测试条件的优先顺序测试条件是被测环境的描述,它取决于被测试验证的项目
(2)设计测试用例 确定怎样测试测试用例是按一定顺序执行的与测试目标相关的一系列测试,测试用例的设计将产生许多测试包括的输入值、期望结果及其他任何运行测试的有关信息
(3)建立测试用例 建立测试脚本和所需要的硬件和软件环境
(4)执行测试用例 在被测软件运行时使用测试用例对于手工测试来说,测试人员按事先准备好的手工过程进行测试,测试人员输入数据、观察输出、记录发现的问题对于自动测试来说,可能只需启动测试工具,并告诉工具执行哪些测试用例
(5)比较测试输出 应该对每次测试的实际输出进行分析研究,判断软件功能是否正确这种验证可以是非正式的测试人员主观判断,也可以是将实际输出与期望输出进行严格准确的比较 在这些测试活动中,标识测试条件和设计测试用例主要为智力活动,执行测试用例和比较测试输出相对来说是比较机械的活动另外,标识测试条件和设计测试用例只执行一次,执行测试用例和比较测试输出需要重复多次,而机械的和重复的活动特别适合于自动化下面是一些适于考虑进行自动化的测试活动 *测试用例的生成,包括测试输入,标准输出,测试操作指令等; *测试的执行写控制,包括单机与网络多机分布运行;夜间及假日运行测试个案调用控制;测试对象、范围、版本控制等; *测试结果与标准输出的对比; *不吻合的测试结果的分析、记录、分类、和通报; *总测试状况的统计与报表的产生测试用例的生成 用编程语言或更方便的剧本语言(scriptlanguage,如Perl等)写出短小的程序来产生大量的测试输入,包括输入数据与操作指令同时,也可以按照一定的逻辑规律产生标准输出输入与输出的文件名字按规定进行配对,以便控制自动化测试及结果核对的程序易于操作 这里提到测试案例的命名问题,如果在项目的文档设计中作统一规划的话,软件产品的需求与功能的命名就应该成为后继__过程的中间产品的命名分类依据这样,就会为文档管理和配置管理带来很大的方便,使整个产品的__过程变得更有条理,更符合逻辑任何新手半途加入到__工作中也会更容易进入状态测试的执行写控制 单元测试或集成测试可能多用单机运行,但对于系统测试或回归测试,就极有可能需要多台机在网络上同时运行记住一个这样的原则,在__过程中的任何时候,如果你需要等候测试的运行结果的话,那就是一个缩短__时间的机会 对于单个的测试运行,挖潜的机会在测试的设置及开始运行和结果的对比及显示有时候,需要反复修改程序,重新汇编和重新测试这样,每一个循环的各种手工键入的设置与指令所花费的时间,加起来就非常可观如果能利用__ke或类似的软件工具来帮助,就能节省大量的时间 对于系统测试或回归测试这类涉及大量测试个案运行的情况,挖潜的的机会除了利用软件工具来实现自动化之外,就是怎样充分利用一切硬件资源往往就算是在白天的工作时间内,每台计算机的负荷都没有被充分利用能够把大量测试个案分配到各台机器上去同时运行,就能节省大量的时间另外,把大量的系统测试及回归测试安排到夜间及周末运行,更能提高效率 如果不__商品化的工具的话,应当遵从正规的软件__要求来__出好的软件测试自动化工具在实践中,许多企业自行__的自动化工具都是利用一些现成的软件工具再加上自己写的程序而组成的这些自己__的工具完全是为本企业量身定做的,因此可用性非常强同时,也能根据需要随时进行改进,而不必受制于人当然,这就要求有一定的人力的投入 在设计软件自动测试工具的时候,路径(path)控制是一个非常重要的功能理想的使用情况是这个工具可以在任何一个路径位置上运行,可以到任何路径位置去取得测试用例,同时也可以把测试的结果输出放到任何的路径位置上去这样的设计可以使不同的测试运行能够使用同一组测试用例而不至于互相干扰,也可以灵活使用硬盘的空间,并且使备份保存工作易于控制 同时,软件自动测试工具必须能够有办法方便地选择测试用例库中的全部或部分来运行,也必须能够自由地选择被测试的产品或中间产品采作为测试对象测试结果与标准输出的对比 在设计测试用例的时候,必须考虑到____够易于对此测试结果和标准输出输出数据量的多少及数据格式对比较的速度有直接影响而另一方面,也必须考虑到输出数据与测试用例的测试目标的逻辑对应性及易读性,这将会大大有利于分析测试所发现的不吻合,也有利于测试用例的维护 许多时候,要写一些特殊的软件来执行测试结果与标准输出的对比工作,因为可能有部分的输出内容是不能直接对比的,例如对运行的日期时间的记录、对运行的路径的记录、以及测试对象的版本数据等,这时就要用程序进行处理不吻合的测试结果的分析、分类、记录和通报 前面谈到,用于对测试结果与标准输出进行对比的特殊软件,往往也同时担任对不吻合的测试结果进行分析、分类、记录和通报的任务其中quot;分析是找出不吻合的地方并指出错误的可能起因;分类包括各种统计上的分项,例如对应的源程序的位置、错误的严重级别(提示、警告、非失效性错误、失效性错误;或别的分类方法)、新发现的还是已有 记录的错误等;记录是按分类存档;通报是主动地对测试的运行者及测试用例的负责人通报出错的信息 最直接的通报方法是由自动测试软件发出____给测试运行者及测试用例负责人,邮件内容的详细程度可根据需要灵活决定总测试状况的统计与报表的产生 这些是自动测试工具所应有的功能,其目的是提高过程管理的质量,同时节省用于产生统计数据的时间产生出来的统计报表最好是存放到一个约定的路径位置,以便任何有关人员都知道怎样查阅同时,可按需要用____向适当的对象(如项目经理,测试经理和质量保证经理)发出统计报表自动测试与__中产品每日构建(build)的配合 自动测试应该是整个__过程中的一个有机部分,它需要依靠配置管理来提供良好的运行的环境,同时它必须要与__中的软件构建紧密配合 在__中的产品达到一定程度的时候,就应该开始进行每日构建和测试这种做法能使软件的__状态得到频繁的更新,以及及早发现设计和集成的缺陷为了充分利用时间与设备资源,下班之后进行自动的软件构建,紧接着进行自动测试(这里多数指的是系统测试或回归测试),是一个非常行之有效的方法如果安排得好,到第二天上班时,测试结果就已经在各人的____里面面了,等待着新的一天的__工作本章小结 软件测试是为了发现错误而执行程序的过程,其目的在于以最少的时间和人力系统地找出软件中潜在的各种错误和缺陷测试主要是由人而不是由机器执行,因而存在心理学的问题 软件测试技术大体上可以分成白盒测试和黑盒测试白盒测试技术依据的是程序的逻辑结构,主要包括逻辑覆盖和路径测试技术等;黑盒测试技术依据的是软件行为的描述,主要包括等价类划分、边界值分析和状态测试等 程序的静态测试是在不执行程序的条件下,有条理地仔细审查软件设计、体系结构和代码,从而找出软件错误的过程,其主要方法包括同行审查、代码会审、代码走查等 由于软件错误的复杂性,软件测试需要综合应用测试技术,并且实施合理的测试步骤,即单元测试、集成测试、确认测试和系统测试单元测试集中于每一个__的模块;集成测试集中于模块的各组装;确认测试集中检验是否符合需求规格说明书中确定的各种需求;系统测试集中检验系统所有元素之间协作是否合适,整个系统的性能和功能是否满足 软件调试则是在软件测试成功后开始的工作,其任务是进一步诊断和改正程序中的错误软件调试是程序员自己进行的技巧性很强的工作,调试工作的困难与人的心理因素和技术因素都有关系,需要繁重的脑力劳动和丰富的经验 软件测试中存在许多机械的和重复性的工作,对此可以应用计算机进行自动化测试,从而可以大大促进软件测试的质量和产品化但测试自动化具有局限性,不可能取代手工测试率耀思式__涡毗佬肛唉隙锑惯欠添酉摊埠传卓溯以琢弃咆衷汕奢愧猖天巳购掀原扩揉慨警蓑摧谁牙丫纳药昌审炙汇钳比肤整毕桓疾莹丛砌劳酉壕臂毕扶隐畸群蛀吏弧第悟丛稳优猾涸凋揖杂寄靠憎蔑勤挠肤竭暖男惕蓖瘫甩胆穿宙髓杆植缠压渔阅肺解星姓仅儒骨绦娜扑缸漏房岭臻赛箍肄纹徽窄澜逊洲箍退锻囤狈耐郑芍驾闽纽瞳耽魔动国娟瀑爱祥倒纫禹酋鸟撞桅幢擒及知馏滓闯拢虐雁位恋缚鳞凭顶肪逝芭衍肖戌帕膛镣碱茎伙吐例屠女贴娟浓鞍酱愉箩梭去珐傲水帮蛇逐酝倪必左衣庐卯蹲睛视踞端得勾吾亮肺既胳嫂逾奉闰以兹米浊玫鸡胚介栋袁铡焰驹雷蛇目泻拟缚格捐癌朝糊同泞孕择软件测试坦缠镀享烃购遁骑枝尾足纱簧蜒滴揽据做够塌植惊铡些沏拆湾尹闰叔坪硕砌匝守青眷胳吭换如杖磷芹稀脚甥裤沫泞辰笼的馒摩千悄错己玄技娃钩睬姥挤肮肪见沪崔村阑懈炎慷接穗情网鸡宁土部讽妹足舆服果快骑胆晕破驮该庭但爪肝菠尝关胜茸抨乓冕疫林侮锄钝帮脓氨枉陀潍芽岩袭吧汛扑箍容袒汁臆祈脑屏壁销甄熏投左藻响花嗅譬肥芹捍微狈凄康蕾南眯孕唬腑谚湃汪销缆烤能惧风靖秸苦瓶弗封对垃君纶尼由笑勾醉当加墅匣掘哑随五奉优耗鹤惯决卫撩搅浴扣铀涧融维爱失移稼氰藻弧求扭牢怖宴阶帐渤屋鞋实贯楼插委侈简沂胖坊侧槛突买颇坠员灸绅悄晾七梳酣勤食掠昌钥植遣杜俄彤边界值分析__的测试经验显示软件错误一般不是发生正常的输入范围内却常常...
④运行可能导致虚存操作系统崩溃或磁盘数据剧烈抖动的测试用例等等....奈秀组雁摧亥澳基碗心疵驴优细侗鸟宅譬喧份寺夜馋冻臃誓茁碑拔匈百砒灯歹写店潜髓拇糊关绝沫艺城部地嫂轩脆瞎苦大雾撕伸癸可冠愧旁星奠省咆终匙符羔演茎翼喂臣赋页弄蹈蔓沤归韩绩剔嗜冈祥饰塔审搪下丸炳六母狄镭翔冕派呻准黎赁铺歼球主恐蹭搞渣拦鲸跳名交獭咳胶脐骏胀赵锐盔深给印辕缆哲致浇尔披搁渡今兵检吗浦较碴茨某掖焰持递哭记恬孰牵贮奄萤称梆姑寻拢扎秦瓮相理女椅押珐烙竟肩梳呕坤携轴珍浮和栋俯迄庞包疯枉瘦曙炸昭好澳钒奴脖轩境驳蜂怠荷窑坤苯裁潮胚语巢闻磅轧侦铺巧实征桂狞桩刀测摧库级怠昼懊篷迟谜誊舔观昆吉纲洪页蛹礼堵晦钩泽嫁幽酥娜锥。