11软件测试综述22软件测试综述软件测试是一个必不可少的活动,是对软件需求分析、设计规约和编码的最终复审;是软件质量保证的关键步骤。软件测试是根据软件开发各阶段的规约和软件的内部结构,精心设计一批测试用例(包括输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现软件中不符合质量特性要求(即缺陷或错误)的过程。33软件测试综述软件测试的背景软件测试概述软件测试的模型44软件测试的背景软件错误和软件失效的案例软件缺陷是什么软件缺陷分类软件缺陷的产生软件缺陷修复的代价软件可靠性问题软件错误数估算55软件错误和软件失效的案例火星登陆事故1999年12月3日,缺少集成测试爱国者导弹防御系统,1991,多哈,死亡28人,缺少稳定性测试英特尔奔腾芯片缺陷,1994,对待缺陷的态度(4195835/3145727)×3145727– 4195835美迪斯尼公司的狮子王游戏软件bug1994年圣诞节前,缺少兼容性测试记事本联通软件错误概述软件错误和软件失效“错误”术语“错误”这一术语。在没有特别加以说明的情况下,这是一个泛用的、模糊的概念。它指的可能是bug(差错)、fault(故障)、error(错误)、failure(失效)、crash(重大事故)、problem(疑问)等。在汉译中,这些术语的使用更加混乱。77软件缺陷是什么?软件出错机理可描述为:软件错误,软件缺陷,软件故障,软件失效。软件错误(error):是指在软件生存期内的不希望或不可接受的人为错误,其结果是导致软件缺陷的产生。软件缺陷(bug):是存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差。其结果是软件运行于某一特定条件时出现软件故障,这时称软件缺陷被激活。软件故障(fault):是指软件运行过程中出现的一种不希望或不可接受的内部状态。此时若无适当措施(容错)加以及时处理,便产生软件失效。软件失效(failure):是指软件运行时产生的一种不希望或不可接受的外部行为结果。软件错误概述88软件缺陷激活条件符合下列五种情况之一就可认为是软件缺陷(出错):1)软件未达到软件产品需求说明书指明的要求。2)软件出现了软件产品需求说明书指明不会出现的错误。3)软件功能超出软件产品需求说明书指明的范围。4)软件未达到软件产品需求说明书虽未指明但应达到的要求。5)软件测试人员认为难以理解、不易使用、运行速度缓慢、或者最终用户认为不好的问题。软件缺陷的特征“看不到”——软件的特殊性决定了缺陷不易看到“看到但是抓不到”——发现了缺陷,但不易找到问题发生的原因所在软件错误概述99软件缺陷分类可从不同角度对软件缺陷进行分类:按错误的影响和后果分类按错误的性质和范围分类按软件生存期阶段分类软件错误概述1010软件错误分类-按错误的影响和后果分类按错误的影响和后果分类1.较小错误:只对系统输出有一些非实质性影响。如,输出的数据格式不合要求等。2.中等错误:对系统的运行有局部影响。如输出的某些数据有错误或出现冗余。3.较严重错误:系统的行为因错误的干扰而出现明显不合情理的现象。如开出了0.00元的支票,系统的输出完全不可信赖。4.严重错误:系统运行不可跟踪,一时不能掌握其规律,时好时坏。5.非常严重的错误:系统运行中突然停机,其原因不明,无法软启动。6.最严重的错误:系统运行导致环境破坏,或是造成事故,引起生命、财产的损失。软件错误概述1111软件错误分类-按错误的性质和范围分类按错误的性质和范围分类B.Beizer从软件测试观点出发,把软件错误分为5类。1.功能错误1)规格说明错:规格说明可能不完全,有二义性或自身矛盾。2)功能错误:程序实现的功能与用户要求的不一致。这常常是由于规格说明中包含错误的功能、多余的功能或遗漏的功能所致。3)测试错误:测试的设计与实施发生错误。软件测试自身也可能发生错误。4)测试标准引起的错误:对软件测试的标准要选择适当,若测试标准太复杂,则导致测试过程出错的可能就大。软件错误概述1212软件错误分类-按错误的性质和范围分类2.系统错误1)外部接口错误:外部接口指如终端、打印机、通信线路等系统与外部环境通信的手段。2)内部接口错误:内部接口指程序之间的联系。3)硬件结构错误:不能正确理解硬件如何工作而导致的出错。4)操作系统错误:主要是由于不了解操作系统的工作机制而导致出错。当然,操作系统本身也有错误。5)软件结构错误:由于软件结构不合理或不清晰引起的错误。6)控制与顺序错误:如存在不正确的处理步骤等。7)资源管理错误:由于不正确使用资源而产生的。软件错误概述1313软件错误分类-按错误的性质和范围分类3.加工错误1)算术与操作错误:指在算术运算、函数求值和一般操作过程中发生的错误。2)初始化错误:如,忘记初始化工作区、寄存器和数据区;对循环控制变量赋错初值;用不正确的格式,数据或类型进行初始化等。3)控制和次序错误:与系统级同名错误类似,但它是局部错误。如遗漏路径;不可达到的代码等;4)静态逻辑错误:主要包括:不正确地使用CASE语句;在表达式中使用不正确的条件(例如用“>”代替“<”的否定);对情况不适当地分解与组合;混淆“或”与“异或”等。软件错误概述1414软件错误分类-按错误的性质和范围分类4.数据错误1)动态数据错误:动态数据是在程序执行过程中暂存的数据。2)静态数据错误:静态数据直接或间接地出现在程序或数据库中,在内容和格式上都固定。一般由预处理出错造成。3)数据内容错误:由内容被破坏或被错误地解释而造成的错。4)数据结构错误:数据结构错误主要包括结构说明错误及把一个数据结构误当做另一类数据结构使用的错误。5)数据属性错误:如错把整数当实数,允许不同类型数据混合运算而导致的错误等。软件错误概述1515软件错误分类-按错误的性质和范围分类5.代码错误主要包括:语法错误;打字错误;对语句或指令不正确理解所产生的错误。软件错误概述1616软件错误分类-按软件生存期阶段分类把软件的逻辑错误按生存期不同阶段分为4类。1.问题定义(需求分析)错误在软件定义阶段,分析员研究用户的要求后所编写文档中出现的错误。换句话说,这类错误是由于问题定义不满足用户的要求而导致的错误。软件错误概述1717软件错误分类-按软件生存期阶段分类2.规格说明错误这类错误是指规格说明与问题定义不一致所产生的错误。它们又可以细分成:1)不一致性错误:规格说明中功能说明与问题定义发生矛盾。2)冗余性错误:规格说明中某些功能说明与问题定义相比是多余的。3)不完整性错误:规格说明中缺少某些必要的功能说明。4)不可行错误:规格说明中有些功能要求是不可行的。5)不可测试错误:有些功能的测试要求是不现实的。软件错误概述1818软件错误分类-按软件生存期阶段分类3.设计错误设计阶段产生的错误,它使系统的设计与需求规格说明中的功能说明不相符。它们又可以细分为:1)设计不完全错误:某些功能没有被设计,或设计得不完全。2)算法错误:算法选择不合适。主要表现为算法的基本功能不满足功能要求、算法不可行或者算法的效率不符合要求。3)模块接口错误:模块结构不合理;模块与外部数据库的界面不一致,模块之间的界面不一致。4)控制逻辑错误:控制流程与规格说明不一致;控制结构不合理。5)数据结构错误:数据设计不合理;与算法不匹配;数据结构不满足规格说明要求。软件错误概述1919软件错误分类-按软件生存期阶段分类4.编码错误多种多样,大体归为以下几种:数据说明错、数据使用错、计算错、比较错、控制流错、界面错、输入/输出错,及其它的错误。在不同的开发阶段,错误的类型和表现形式不同,故应采用不同的方法和策略来进行检测。软件错误概述2020软件缺陷的产生软件缺陷的产生比较容易造成软件缺陷的主要因素,归纳如下:技术问题算法错误、语法错误、计算和精度问题、系统结构不合理、接口参数不匹配。团队工作需求不清、开发人员相互理解不一致、设计或编程上的假定或依赖性没得到充分沟通。软件本身文档错误、大数据量错误、边界错误、时序错误、数据恢复能力没有或不够、软硬件上的错误、软件开发标准或过程上的错误。软件错误概述2121软件缺陷的构成其他6~10%软件产品说明书(需求)56%编写代码7~15%设计25~27%软件错误产生的原因分布软件错误概述2222软件缺陷的产生软件需求说明书为什么是软件缺陷存在最多的地方,主要原因有:用户的计算机知识较少要开发产品的特性不够清晰需求变化的不一致对需求说明书不重视项目组成员间缺少沟通软件错误概述2323软件缺陷的产生软件缺陷的状态为便于跟踪和管理某产品的缺陷,可以定义不同的软件缺陷状态:激活状态(Active或Open):问题还没解决,测试员报的bug、或验证后bug仍然存在。已修正状态(Fixed或Resolved):开发人员针对缺陷,修改程序,认为已解决问题,或通过单元测试。关闭或非激活状态(Close或Inactiv):测试员验证Fixedbug后,确认bug已改的状态。Hold状态:第三方产品引起的、或是无法解决的bug。Differed状态:不需解决或准备在下版中解决的bug。软件错误概述2424软件错误修复的代价软件在从计划、编制、测试、一直到交付用户公开使用的过程中,都有可能产生和发现错误。随着整个开发过程的时间推移,修复软件的费用呈几何级数的增长。下图是软件错误在不同阶段发现时修改的费用示意图020406080100编制说明书设计阶段编写代码测试发布软件错误概述2525软件可靠性问题软件可靠性定义IEEE将软件可靠性定义为:在给定时间间隔内和特定的环境下,软件按规格说明成功运行的概率。给定的时间间隔:在定义中,一般采用“运行时间”t作为时间的尺度。环境条件:指的是软件的使用环境。无论是什么软件,如果不对它的使用环境加以限制,都会失效。这种失效的数据,不能用来度量软件的可靠性。成功地运行:指不仅程序能正确运行,满足用户对它的功能要求,而且当程序一旦受到意外的伤害,或系统故障时,能尽快恢复,仍能正常地运行。软件错误概述软件可靠性问题软件可靠性的主要指标借用硬件可靠性的定量度量方法来度量软件的可靠性:MTBF:平均故障间隔时间MTTF:平均故障时间26MTTF=ni=1n1∑tit1,t2,.....,tn:失效时间2727软件可靠性问题因软件设计故障与因计算机硬件设计故障而引发的系统失效的比例大约是:10:1运行软件的驻留故障密度(每千行代码的故障数目):——要求很高的关键财务或财产软件为:每千行代码1~10个故障——关键的生命软件为:每千行代码0.01~1个故障软件可靠性是对软件在设计、开发以及所预定的环境下具有能力的置信度的一个度量,是衡量软件质量的主要参数之一。软件测试则是保证软件质量、提高软件可靠性的最重要手段。软件错误概述软件错误数估算植入故障法估算(捕获-再捕获抽样法)利用植入故障法估算程序中原有故障总数ET设Ns是在测试前人为地向程序中植入的故障数(称播种故障),ns是经过一段时间测试后发现的播种故障的数目,n是在测试中又发现的程序原有故障数。设测试用例发现植入故障和原有故障的能力相同,则程序中原有故障总数N(=ET)估算值为28NNnnss软件错误数估算Hyman分别测试法由两个测试员同时互相独立测试同一程序的两个副本,用t表示测试时间,记t=0时,程序中原有故障总数是B0;t=t1时,测试员甲发现的故障总数是B1;测试员乙发现的故障总数是B2;其中两人发现的相同故障数目是bc;两人发现的不同故障数目是bi。在大程序测试时,开始两个测试员测试的结果应当比较接近,bi不是很大。这时有29BBBbc012软件错误数估算Hyman分别测试法(续)如果bi很大,应当每隔一段时间,由两个测试员再分别测试,分析测试结果,估算B0。如果bi减小,或几次估算值的结果相差不多,则B0作为原有错误总数的估算值。303131软件测试概述软件测试的发展软件测试的