1、第5章 编程与测试2/75 第第5 5章章 编程与测试编程与测试n 5.1 5.1 开发工具的选择开发工具的选择n 5.2 5.2 程序设计风格程序设计风格n 5.3 5.3 软件测试的概念软件测试的概念n 5.4 5.4 软件测试的方法软件测试的方法n 5.5 5.5 测试用例设计测试用例设计n 5.6 5.6 测试过程测试过程n 5.7 5.7 调试调试3/75 5.3 5.3 软件测试的概念软件测试的概念5.3.1 认识测试的重要性认识测试的重要性5.3.2 软件测试的目的软件测试的目的5.3.3 软件测试的原则、种类、文档软件测试的原则、种类、文档4/75 5.3.1 认识测试的重要性
2、认识测试的重要性n 测试的重要性测试的重要性v 测试,是软件质量保证的关键活动测试,是软件质量保证的关键活动v 测试,是软件质量保证的最后一道防线测试,是软件质量保证的最后一道防线v 软件的人编的软件的人编的,错误是难免的错误是难免的!v 错误是严重的,教训是惨痛的!错误是严重的,教训是惨痛的!n 关于测试活动关于测试活动5/75 测试的重要性测试的重要性n 软件测试是保证软件质量的关键步骤,它是对软件软件测试是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审,是软件质量保规格说明、设计和编码的最后复审,是软件质量保证的最后一道防线证的最后一道防线6/75 质量控制技术质量控制
3、活动分类质量控制活动分类开发方法学开发方法学配置管理配置管理验证技术验证技术评评 审审质量控制质量控制避免错误避免错误正确性验证正确性验证性能调试性能调试单元测试单元测试集成测试集成测试确认测试确认测试检检 错错调调 试试测测 试试原子事务原子事务模块冗余性模块冗余性容容 错错7/75 测试的重要性测试的重要性n 软件生存期各阶段间都需要确保正确性软件生存期各阶段间都需要确保正确性n 但是,软件的人编的但是,软件的人编的,错误是难免的错误是难免的!8/75 用户要求用户要求用户:用户:我要什么我要什么?运行结果运行结果计算机:计算机:程序运行得程序运行得到的结果到的结果源程序源程序程序员:程序
4、员:我要让计算我要让计算机什么做机什么做?设计说明书设计说明书设计员:设计员:我要让软件我要让软件做什么做什么?需求说明书需求说明书分析员:分析员:我可以提我可以提供什么供什么?12345理解正确性理解正确性表达正确性表达正确性理解正确性理解正确性设计正确性设计正确性表达正确性表达正确性理解正确性理解正确性编码正确性编码正确性运行正确性运行正确性输入正确性输入正确性相符吗相符吗?9/75 软件的人编的软件的人编的,错误是难免的错误是难免的!n 前期各阶段的技术审查不可能发现所有的错误前期各阶段的技术审查不可能发现所有的错误n 此外,在编码过程中还不可避免地会引入新的错此外,在编码过程中还不可避
5、免地会引入新的错误。误。10/75 偏差就像阴魂不散,在不知不觉中产生!偏差就像阴魂不散,在不知不觉中产生!11/75 错误是严重的!错误是严重的!n 开发前期出现的错误呈现幅射和扩大的趋势;开发前期出现的错误呈现幅射和扩大的趋势;n 前期的错误,到后期再发现并修改,非常困难。前期的错误,到后期再发现并修改,非常困难。12/75 计划计划需求需求分析分析设设计计编编码码测测试试A A AB B13/75 14/75 教训是惨痛的!教训是惨痛的!1994-1995,1994-1995,迪斯尼的狮子王系统不支持问题迪斯尼的狮子王系统不支持问题IntelIntel的的pentiumpentium处理
6、器处理器19941994年浮点除法缺陷年浮点除法缺陷20002000年年8 8月月2828日,日,1.13MHZ1.13MHZ处理器一个可能导致运处理器一个可能导致运行程序被挂起的执行指令问题行程序被挂起的执行指令问题19991999年年1212月月3 3日日,美国航天局火星极地登陆飞船失踪美国航天局火星极地登陆飞船失踪19911991年爱国者导弹防御系统系统时钟错误积累造成年爱国者导弹防御系统系统时钟错误积累造成跟踪系统失去精确度跟踪系统失去精确度千年虫千年虫,世界各地解决世界各地解决20002000年错误超过数亿美元年错误超过数亿美元15/75 测试的重要性n 总之,如果在软件投入生产性运
7、行之前,没总之,如果在软件投入生产性运行之前,没有发现并纠正软件中的大部分差错,则这些有发现并纠正软件中的大部分差错,则这些差错迟早会在生产过程中暴露出来,那时不差错迟早会在生产过程中暴露出来,那时不仅改正这些错误的代价更高,还会造成很恶仅改正这些错误的代价更高,还会造成很恶劣的后果。劣的后果。n 因此,无论怎样强调软件测试的重要性和它因此,无论怎样强调软件测试的重要性和它对软件可靠性的影响都不过分对软件可靠性的影响都不过分16/75 对测试要评价n 最后,要对测试的结果进行收集和评价,以最后,要对测试的结果进行收集和评价,以评估软件的可靠性评估软件的可靠性17/75 软件测试的工作量软件测试
8、的工作量n 资料表明,测试工作量占开发总工作量的资料表明,测试工作量占开发总工作量的40%以上,以上,在极端情况,测试关乎人的生命安全的软件所花费在极端情况,测试关乎人的生命安全的软件所花费的成本,可能相当于软件工程其他开发步骤总成本的成本,可能相当于软件工程其他开发步骤总成本的的3倍到倍到5倍。倍。n 绝不要以为写出程序之后软件开发工作就接近完成绝不要以为写出程序之后软件开发工作就接近完成了,大约还有同样多的开发工作量需要完成。了,大约还有同样多的开发工作量需要完成。18/75 关于测试活动关于测试活动,测试活动贯穿开发周期全程测试活动贯穿开发周期全程需求需求&系统测试计划系统测试计划概设概
9、设&集成测试计划集成测试计划详设详设&单元测试计划单元测试计划编码编码系统测试系统测试集成测试集成测试单元测试单元测试19/75 关于测试活动关于测试活动n 测试测试(对测试计划的计划对测试计划的计划)横跨两个阶段,编码与测试横跨两个阶段,编码与测试n 通常在编写出每个模块之后就对它做必要的测试,称通常在编写出每个模块之后就对它做必要的测试,称为为单元测试单元测试,模块的编写者和测试者是同一个人,编,模块的编写者和测试者是同一个人,编码和单元测试属于软件生命周期的同一个阶段。码和单元测试属于软件生命周期的同一个阶段。n 在编程和单元测试阶段结束之后,进入生命周期的一在编程和单元测试阶段结束之后
10、,进入生命周期的一个独立的阶段个独立的阶段,称为称为综合测试综合测试,通常由专门的测试人员,通常由专门的测试人员完成完成20/75 综合测试阶段综合测试阶段21/75 5.3 5.3 软件测试的概念软件测试的概念5.3.1 认识测试的重要性认识测试的重要性5.3.2 5.3.2 软件测试的目的软件测试的目的5.3.3 软件测试的原则、种类、文档软件测试的原则、种类、文档22/75 5.3.2 5.3.2 软件测试的目的软件测试的目的n 软件测试的定义软件测试的定义n 正确认识软件测试的目的正确认识软件测试的目的23/75(1 1)软件测试的定义:)软件测试的定义:n G.MyersG.Myer
11、s(迈尔斯迈尔斯)给出了关于测试的一些规则,可以看给出了关于测试的一些规则,可以看作是对软件测试的定义作是对软件测试的定义:测试是为了发现程序中的错误而执行程序的过程;测试是为了发现程序中的错误而执行程序的过程;好的测试方案是能够发现迄今为止尚未发现的错误的好的测试方案是能够发现迄今为止尚未发现的错误的测试方案;测试方案;成功的测试是发现了至今为止尚未发现的错误的测试。成功的测试是发现了至今为止尚未发现的错误的测试。24/75 对软件测试定义的理解对软件测试定义的理解 软件测试,是为了发现错误而执行程序的过程;软件测试,是为了发现错误而执行程序的过程;v 具体讲,软件测试是执行测试计划,运用测
12、试用例去执具体讲,软件测试是执行测试计划,运用测试用例去执行程序,以发现程序错误的过程。(行程序,以发现程序错误的过程。(能不能发现错识,能不能发现错识,“测试用例测试用例”起着关键作用起着关键作用)好的测试方案是能够发现迄今为止尚未发现的错误的测试好的测试方案是能够发现迄今为止尚未发现的错误的测试方案;方案;成功的测试是发现了至今为止尚未发现的错误的测试。成功的测试是发现了至今为止尚未发现的错误的测试。v 能不能发现错误,是判定测试是否成功的标准,能不能能不能发现错误,是判定测试是否成功的标准,能不能发现新的错误,是判定测试方案(数据)优劣的标准;发现新的错误,是判定测试方案(数据)优劣的标
13、准;v 由此说,根据软件开发阶段的规格说明和程序的内部结由此说,根据软件开发阶段的规格说明和程序的内部结构而精心设计测试方案(测试用例),是测试活的关键构而精心设计测试方案(测试用例),是测试活的关键一步。一步。25/75(2)正确认识测试活动的目的)正确认识测试活动的目的n 由测试定义,可见测试目的归纳为:由测试定义,可见测试目的归纳为:n 在软件投入生产性运行之前,尽可能多地发现软件在软件投入生产性运行之前,尽可能多地发现软件中的错误,把好最后一道质量关,最终评价软件符中的错误,把好最后一道质量关,最终评价软件符合用户需求的程度、评价软件的可靠性。合用户需求的程度、评价软件的可靠性。26/
14、75 软件测试的目的错误认识软件测试的目的错误认识n G.MyersG.Myers(迈尔斯迈尔斯)对测试的解释与一般人的理解是相反的,对测试的解释与一般人的理解是相反的,如果不假思索,你会认为如果不假思索,你会认为:v“测试是为了表明程序是正确的测试是为了表明程序是正确的”;v“成功的测试是没有发现错误的测试成功的测试是没有发现错误的测试”n 因为测试只使用了少量数据,不可能把软件可以使用的数因为测试只使用了少量数据,不可能把软件可以使用的数据全部拿来测试一遍,所以测试是不完整、不彻底、无法据全部拿来测试一遍,所以测试是不完整、不彻底、无法穷举的。穷举的。n E.W.DijkstraE.W.D
15、ijkstra 指出:指出:“程序测试只能证明错误的存在程序测试只能证明错误的存在,但但不能证明错误不存在。不能证明错误不存在。”27/75 对测试目的的认识决定了测试方案的设计理念对测试目的的认识决定了测试方案的设计理念n 测试方案(测试用例或测试数据)是为了实现测试目的,测试方案(测试用例或测试数据)是为了实现测试目的,而精心挑选的,如果为了表明程序是正确的而进行测试,而精心挑选的,如果为了表明程序是正确的而进行测试,就会设计一些不易暴露错误的测试方案;就会设计一些不易暴露错误的测试方案;n 相反,如果测试是为了发现程序中的错误,就会力求设相反,如果测试是为了发现程序中的错误,就会力求设计
16、出最能暴露错误的测试方案,这才是我们追求的。计出最能暴露错误的测试方案,这才是我们追求的。28/75 对测试目的的认识决定了测试方案的设计理念对测试目的的认识决定了测试方案的设计理念n 测试人员努力设计出一系列测试方案测试人员努力设计出一系列测试方案(又称又称,测试用例测试用例),目的是竭力证明程序中有错误,且不能按照预定要求正确目的是竭力证明程序中有错误,且不能按照预定要求正确工作。直白地讲,测试是为了挑毛病的。工作。直白地讲,测试是为了挑毛病的。n 表面看来,这与软件工程的开发活动目标是相反的,但实表面看来,这与软件工程的开发活动目标是相反的,但实际上,暴露问题并不是软件测试的最终目的,发
17、现问题是际上,暴露问题并不是软件测试的最终目的,发现问题是为了解决问题为了解决问题n 所以,测试的根本目的是尽可能多地发现并排除软件中潜所以,测试的根本目的是尽可能多地发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交付用户。藏的错误,最终把一个高质量的软件系统交付用户。29/75 从测试目的看,谁来执行测试活动最好从测试目的看,谁来执行测试活动最好?n 由于测试的目标是暴露程序中的错误,从心理学角度看,由于测试的目标是暴露程序中的错误,从心理学角度看,由程序员自己进行测试是不恰当的。由程序员自己进行测试是不恰当的。n 因此,在综合测试阶段通常由其他人员组成测试小组来因此,在综合测试阶段
18、通常由其他人员组成测试小组来完成测试活动。完成测试活动。30/75 对测试活动正确认识对测试活动正确认识n 应该认识到测试决不能证明程序中没错误应该认识到测试决不能证明程序中没错误;v 即使经过了最严格的测试之后,程序中仍然可能还即使经过了最严格的测试之后,程序中仍然可能还有潜藏的错误有潜藏的错误;v 测试只能查找出程序中的错误,不能证明程序中没测试只能查找出程序中的错误,不能证明程序中没有错误有错误31/75 5.3 5.3 软件测试的概念软件测试的概念5.3.1 认识测试的重要性认识测试的重要性5.3.2 5.3.2 软件测试的目的软件测试的目的5.3.3 软件测试的原则、种类、文档软件测
19、试的原则、种类、文档32/75 5.3.2 5.3.2 软件测试准则、种类、文档软件测试准则、种类、文档 软件测试准则软件测试准则 测试活动和种类测试活动和种类 测试文档测试文档33/75(1 1)软件测试准则)软件测试准则:n 为了实现成功的测试,在测试方案的设计和执行两为了实现成功的测试,在测试方案的设计和执行两个关键环节,必须把握一些准则:个关键环节,必须把握一些准则:34/75(1 1)软件测试准则)软件测试准则:1.1.所有测试都应该能追溯到用户需求所有测试都应该能追溯到用户需求!2.2.应该远在测试开始之前就制定出测试计划应该远在测试开始之前就制定出测试计划!3.3.把把Paret
20、o(Pareto(柏拉图柏拉图20/8020/80原则原则)原理应用到软件测试中原理应用到软件测试中4.4.应该从应该从“小规模小规模”测试开始,并逐步扩展测试范围测试开始,并逐步扩展测试范围5.5.穷举测试是不可能的穷举测试是不可能的6.6.应该由独立的第三方执行测试任务应该由独立的第三方执行测试任务35/75 所有测试都应该能追溯到用户需求所有测试都应该能追溯到用户需求n 软件测试的目标是发现错误,而从用户的角软件测试的目标是发现错误,而从用户的角度看,最严重的错误是导致程序不能满足用度看,最严重的错误是导致程序不能满足用户需求的那些错误。户需求的那些错误。36/75 应该远在测试开始之前
21、就制定出测试计划应该远在测试开始之前就制定出测试计划!37/75 把把ParetoPareto原理应用到软件测试中原理应用到软件测试中n 柏拉图的柏拉图的80/2080/20原则原则n 测试发现的错误中的测试发现的错误中的80%80%很可能是由程序中很可能是由程序中20%20%的模块造成的;的模块造成的;38/75 从从“小规模小规模”测试开始,逐步扩展测试范围测试开始,逐步扩展测试范围n 通常,首先重点测试单个程序模块,然后把通常,首先重点测试单个程序模块,然后把测试重点转向在集成的模块簇中寻找错误,测试重点转向在集成的模块簇中寻找错误,最后在整个系统中寻找错误。最后在整个系统中寻找错误。3
22、9/75 穷举测试是不可能的穷举测试是不可能的n 所谓所谓“穷举穷举”就是把程序所有可能的情况都检查一就是把程序所有可能的情况都检查一遍遍v 由于受时间、人力和资源限制,不可能测试每个由于受时间、人力和资源限制,不可能测试每个可能的情况可能的情况n 例如例如,测试一个需要输入三个整数值的程序测试一个需要输入三个整数值的程序.v 每个整数可能取值有每个整数可能取值有2 21616个个,三个整数的排列组合三个整数的排列组合为为:2:21616*2 21616*2 21616=3=3*10101414,假设执行一次为假设执行一次为1 1毫秒毫秒,则需则需要要1 1万年万年!40/75 穷举测试是不可
23、能的穷举测试是不可能的n 因为,穷举测试是不可能的,所以,测试绝不能因为,穷举测试是不可能的,所以,测试绝不能证证明程序中没有错误!明程序中没有错误!n 但是,精心地设计测试方案,有可能充分覆盖程但是,精心地设计测试方案,有可能充分覆盖程序逻辑,并使程序达到所要求的可靠性。序逻辑,并使程序达到所要求的可靠性。41/75 应该由独立的第三方从事测试工作应该由独立的第三方从事测试工作n 为了最大可能性发现错误,应有第三方执行为了最大可能性发现错误,应有第三方执行测试测试n 由于有由于有“心理心理”和和“认识认识”上的定式,程序上的定式,程序员不是最佳测试人选(通常他们主要承担模员不是最佳测试人选(
24、通常他们主要承担模块测试,即单元测试,综合测试阶段应有专块测试,即单元测试,综合测试阶段应有专门的测试人员完成)门的测试人员完成)42/75 其他说法:其他说法:应当把应当把“尽早地和不断地进行软件测试尽早地和不断地进行软件测试”作为软件作为软件开发者的座右铭。开发者的座右铭。程序员应避免检查自己的程序。程序员应避免检查自己的程序。程序修改后要回归测试程序修改后要回归测试 在设计测试用例时,应包括合理的合理条件和不合在设计测试用例时,应包括合理的合理条件和不合理的输入条件。理的输入条件。43/75 其他说法:其他说法:充分注意测试中的群集现象。经验表明,测试后程充分注意测试中的群集现象。经验表
25、明,测试后程序中残存的错误数目与该程序中已发现的错误数目序中残存的错误数目与该程序中已发现的错误数目成正比。成正比。程序中的问题根源可能在开发前期的各阶段,解决、程序中的问题根源可能在开发前期的各阶段,解决、纠正错误也必须追溯到前期工作。纠正错误也必须追溯到前期工作。应长期保留测试用例,直至系统废弃。应长期保留测试用例,直至系统废弃。44/75 测试的特性测试的特性n 挑剔性挑剔性 “吹毛求疵吹毛求疵”“”“鸡蛋里面头挑骨头鸡蛋里面头挑骨头”n 复杂性复杂性 例如一个程序的功能是输入例如一个程序的功能是输入3 3个数作为三角形的个数作为三角形的3 3条边,条边,然后鉴别这一三角形的类别。然后鉴
26、别这一三角形的类别。n 不彻底性不彻底性 例如有人开发了一个例如有人开发了一个C C语言的编译程序,要对他进行彻语言的编译程序,要对他进行彻底的测试,需要设计多少个测试用例呢底的测试,需要设计多少个测试用例呢?n 经济性经济性45/75 动态测试动态测试静态分析器分析静态分析器分析代码评审代码评审白盒测试方法白盒测试方法黑盒测试方法黑盒测试方法代码会审代码会审走查走查办公桌检查办公桌检查静态分析静态分析软件测试的软件测试的策略和方法策略和方法(2 2)测试的种类)测试的种类46/75 静态静态和动态和动态测试测试汽车的检查过程:汽车的检查过程:踩油门踩油门看车漆看车漆打开前盖检查打开前盖检查发
27、动汽车发动汽车听听发动机声音听听发动机声音上路行使上路行使静态测试静态测试动态动态测试测试47/75(3 3)测试的文档)测试的文档n 测试计划测试计划 主要是主要是“测试内容说明测试内容说明”,包括:测试项目的名称,包括:测试项目的名称,各项测试的目的、步骤和进度,以及测试用例的设各项测试的目的、步骤和进度,以及测试用例的设计等。计等。n 测试报告测试报告 主要是:主要是:“测试结果测试结果”,包括测试项目名称,实测,包括测试项目名称,实测结果与期望结果的比较,发现的问题,以及测试达结果与期望结果的比较,发现的问题,以及测试达到的效果等。到的效果等。测试用例测试用例=测试数据测试数据+期望结果期望结果 48/75 测试与开发迭代测试与开发迭代49/75 end