




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章测试和调试,软件开发过程,5个阶段:软件需求分析软件需求工程软件设计软件系统设计与体系结构程序编码软件构造软件测试软件测试与质量软件维护,软件需求分析,了解客户需求,确定软件产品应该具备哪些功能将产品的功能、外观等写成文档,即需求规格说明,软件设计,在编写代码之前,必须对如何实现需求进行设计,并形成设计文档程序流程图就是设计文档中的内容,程序编码,代码编写,软件测试,写了一个程序,并不意味着它可以正确的运行,因此,在程序被投入使用之前,必须尽可能的进行彻底的测试,软件维护,根据软件运行的情况,对软件进行适当修改,以适应新的需求,以及纠正运行中发现的错误,系统缺陷,1994年,美国数学家托马斯奈斯利,发现Pentium处理器计算浮点数除法存在缺陷(FDIVBug)31457274195835/3145727的计算结果是4195579,而不是4195835Intel大量回收1994年12月之前生产的第一代Pentium产品,4.75亿美元的赔偿款,千年虫,二十世纪六、七十年代,存储设备非常昂贵采用两位而不是四位数字表示年份一个图书馆计算机系统一位读者在1999年12月1日借了一本书,992000年,这位读者还书时,系统判断是否超期?关于日期的运算发生错误,系统运行出现问题“2000年问题”、“千年虫”;据统计,全世界为解决“2000年问题”花出的费用超过数亿美元,缺陷、测试、调试,程序中的错误,缺陷(bug)找出缺陷的过程,测试去除错误的过程,调试(debug)在程序被投入使用之前,必须尽可能的进行彻底测试和调试,几乎每个大型程序都存在一些缺陷测试工作往往会带来很高的时间和经济成本有调查显示:一个熟练的程序员花在调试代码上的时间和花在写程序上的时间一样多许多大型软件项目开发都会延期,并且严重超出预算,其中一个重要原因就是软件中的缺陷需要一些构建程序的更好的办法,使得在测试之前就能避免问题或者发现问题,错误类型,语法错误违反了编程语言有关规则编译器能够精确指出错误出现在哪一行语义及逻辑错误是指代码没有语法错误,可以运行,但是得不到正确的结果需要跟踪程序的运行过程才能发现,错误类型,“语义错误”,程序的运行结果与程序员的期望不同“逻辑错误”,程序按照程序员所设计的有缺陷的算法运行,运行结果与程序员的期望相同,语法错误,编译器报告的错误位置,有时会有偏离编译器常常会针对某个错误,发出一系列的错误信息报告常见的语法错误声明、语句末尾漏写分号;使用未经声明的变量;括号不匹配;字符串没有结束符;赋值运算符左边不是变量;,语法错误示例,intmain()intiintsum=0;for(i=0;i=10;i+)sum=sum+i;printf(“sum=%dn,sum);,missingsemicolon,语义错误,往往由于对程序中的语义的理解与编译器理解的不同造成的常见的语义错误赋值运算符与相等运算符用错;无限循环;在if、while或for结构后面使用多余的分号;错误地使用了关系运算符;计算或将一个大类型的数转换成小类型时,数据的值超出了表示范围;运算符优先顺序错;else搭配不当;off-by-one(偏一)错误,通常指for循环的次数多或少一次;将无关代码放到循环体中;使用整数除法;,语义错误示例,intmain()inti;intsum=0;for(i=0;i=10;i+);sum=sum+i;printf(“sum=%dn,sum);,多余的分号,逻辑错误,不正确的程序设计的结果程序本身准确的按照程序员所设计的算法运行了,但是这种设计本身有缺陷这种错误非常隐蔽,需要经过多次运行程序才会被发现当它们被检测到并且被隔离后,仍然很难修复在编写代码之前的设计阶段,通过规划,这种错误经常能够被减少甚至消除“2000年问题”,逻辑错误示例,#includeintmain()intmonth;intday;intsum;printf(Inputthedate(monthday):);scanf(%d%d,测试,一般说来,就是使用不同的输入组合进行试验(为了模拟在真实的情况下软件将要遇到的问题),对程序的输出结果进行正确性检查现实世界中的软件在发布之前都需要经过无数次的试验理想情况通过在所有可能的输入条件下,检查程序的操作,对其进行测试实际情况对所有的输入情况进行测试是不可能的,示例,判断从A到B之间某个数字是不是素数A和B都是从键盘输入的整数,数值范围在-2147483648到2147483647之间(-231231-1)(232)2种可能的输入组合一秒钟进行一百万次测试,需要50万年应该对哪些输入组合进行测试呢?随机的选择一些输入,能够揭示出这个程序的错误所在,测试方法,黑盒测试检查程序是否符合其规格说明白盒测试确保每一行代码都被测试过,黑盒测试,检查程序是否满足其输入和输出规格说明。只关心这个程序是做什么的,而不关心它是怎么做的自动测试过程创建一个程序,可以自动运行被测试的程序,在运行中提供一些随机的输入,检查输出是否符合规格说明,然后重复这个过程构建一个检查器程序,它与被测试的程序不同,但执行类似的计算,黑盒测试,不可能知道哪几行代码已被测试过,哪些还没被测试任何一行没有经过测试的代码都可能是有错误的当规格说明不是很具体的时候,有时很难使用只能在软件完成时开始为了被测试,软件必须被编译并且必须满足规格说明中的一部分,白盒测试,白盒测试的目标是保证每一行代码都要经过某个级别的测试检查代码使用未经正确初始化的变量;变量是否被赋予不同类型的值;变量声明错误:类型、存储类;初始化;未引用过;模块中显式声明?计算错误:混合类型;溢出;除数为0;精度丢失;优先级比较错误:精度(double)控制流程错误:无限循环;从不执行的循环,白盒测试,需要修改被测试的代码在代码中添加printf语句,以便观察内部变量的值,从而可以检查程序是否按照预期运行“断言”是一种普遍应用的白盒测试技术,断言,在程序中的特定部位,插入一些用来检测错误的代码,当检测到某个错误状态时,这些代码就会打印出一个警告消息,显示该状态的一些相关信息,或者使程序提前终止在程序执行中使这些语句得以证实,从而使程序的运行特性得到证实断言,示例,#includeintmain()intvalueA,valueB;inttempVal,result;valueB=10;printf(EnterthevalueA:);scanf(%d,调试方法,跟踪程序跟踪已经被执行的代码以及每条语句执行后得到的结果,比较每条语句做了什么和期望要它做什么时,将会在程序中发现错误首先把程序分成几部分(模块),然后检查每个模块计算后得到的结果“自顶向下,逐步求精”跟踪程序:从大的子任务开始,当某个子任务执行后得到的结果与预期的结果不同时,下一步就是跟踪构成该子任务的更小的子任务;这个过程逐步进行,直到找出错误出现的原因,分析技巧,观察错误的症状,比如错误的输出观察其它一些信息,比如产生的错误在代码中的位置从这些有限的信息中,使用推论隔离出错误产生的根源关键能够快速地搜集到能够识别出错误的相关信息,调试技术,查看源代码源代码的区域很小而且对代码非常熟悉的话,就适合采用这种方法在代码中插入一些语句,在执行期间输出相关信息源水平调试器,插入语句,使用printf语句输出被认为在找错误上有用的重要变量的值在条件结构或重复结构中插入printf语句,查看程序的控制流程是否正确运行对于简单的程序,这种技术很容易使用需要重新编译、执行插入的代码bug,计算6的阶乘,#includeintmain()inti;intn=6;intresult=1;for(i=1;in;i+)result=result*i;printf(%dn,result);,插入printf,for(i=1;in;i+)result=result*i;printf(%dn,result);,源水平调试器,允许程序在一个可控的环境下执行的工具,在其中,程序执行的所有方面都可以被程序员控制和检查所有的调试器均支持一个调试程序所必需的核心操作集一类用于控制程序的执行一类用于在程序执行过程中检查变量的值等相关信息,断点,在程序执行的过程中,指定一些点,在这些点,程序可以被临时停止检查或者修改程序的状态在某个特定行添加一个断点;当执行到那一行时,程序的执行被及时冻结,检查所有与程序有关的事物。,断点,条件断点只有当一个特定的条件成立时才暂停于某一行对于隔离出那些被怀疑执行有错误的特定情况是非常有用的,观察点,在任意一个特定条件为真的地方都能使程序停止例如,只要当变量i等于4时,程序就停止执行;调试器在任何使i等于4的语句处停止执行观察点不是与代码的任何单独一行有关的,而是应用于每一行,单步,一旦调试器到达一个断点/观察点,它会临时挂起程序的执行,并等待下一条命令从断点开始,一次处理一条语句单步执行当前的源代码行,然后再次将程序挂起,监视当前程序检查变量的值确定程序的控制流程是否做了被期待做的事情验证for语句是否执行了正确的重复次数,或者验证if-else是否设置了正确的条件,显示值,一般说来,在断点处可以检查程序的所有执行状态使用鼠标在源代码窗口指向一个变量,使得弹出窗口显示这个变量的当前值输入想要检查的变量名,示例,#includeintmain()inti;intn;intresult=1;scanf(“%d”,使用单步执行命令,跟踪for循环的执行过程;VCgdb,正确编程,为了在测试之前就能避免问题或者发现问题需求阶段明确规格说明设计阶段模块化设计,把简单的、预先测试过的和可以运行的组件构建为程序、函数和库编码阶段防御性编程技术,在错误还没成为错误之前,就能够被避免或发现,一种“防卫”方式,而不是对程序的“补救”,防御性程序设计,采用良好的编程风格,增强代码的可读性和可维护性在使用前初始化所有变量,不给变量的使用留下任何疑问,可以避免或减少错误的出现;写注释,不仅仅可以告诉别人这些代码
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电气设备维护与安全操作流程
- 二年级下册音乐教学全册指导方案
- 审计学在线考试案例分析
- 软件项目验收测试方案模板
- 航空物流服务流程及标准规范
- 高一英语易错题集中训练及解析
- 铸造焊补工艺操作规程大全
- 高层建筑施工垂直运输方案
- 小学六年级语文现代诗歌赏析汇编
- 运营总监年度工作计划书范例
- 要素式强制执行申请书(申请执行用)
- 辽宁省民间信仰管理办法
- 财务信息化系统建设-洞察阐释
- 学堂在线 新闻摄影 期末考试答案
- 脑瘫个案护理
- 课本剧《霸王别姬》剧本【3篇】
- 2025年营养土项目可行性研究报告
- 2025至2030年中国乙肝疫苗行业市场发展模式及未来前景分析报告
- 作文写作(解析版)-2025年中考语文一模试题分类汇编(贵州专用)
- 人工智能技术研发股东出资合作框架协议
- 学校教职工网络安全培训
评论
0/150
提交评论