软件测试2006年6月14日——学术交流第十五期软件测试•软件测试概述•软件测试的目的和原则•软件测试的对象•软件测试的分类•软件测试技术•好的测试工程师应具备的素质•几个好的测试站点软件测试概述•软件危机曾经是软件界甚至整个计算机界最热门的话题。为了解决这场危机,软件从业人员、专家和学者做出了大量的努力。现在人们已经逐步认识到所谓的软件危机实际上仅是一种状况,那就是软件中有错误,正是这些错误导致了软件开发在成本、进度和质量上的失控。有错是软件的属性,而且是无法改变的,因为软件是由人来完成的,所有由人做的工作都不会是完美无缺的。问题在于我们如何去避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可能低的程度。软件测试概述•近日,国内知名的人才服务机构智联招聘发布了《2006年度软件测试行业专项调查报告》(国内首次针对软件测试行业展开的专项调查报告。)•报告指出,目前软件测试的重要性已经得到了越来越多的企业的关注。数据显示,有68.2%的受调查企业认为软件测试非常重要,必须要设立专门的测试部门,并将其视为与开发环节同等重要的地位。另有31.8%的企业选择了比较重要,而认为软件测试只起到“一定作用”或“可有可无”的比例为0。•尽管几乎所有的企业认识到软件测试的重要性,但就目前软件测试和开发人员的比例来看,软件测试人员在公司所占比例仍然极不合理。调查数据显示,被调查企业中测试人员与开发人员比例为1∶5的企业高达36.4%,比例为1∶2的企业占31.8%,比例为1∶1及以上的企业仅占31.7%。软件测试概述•一旦将质量问题转移给维护就会忽略开发过程中需求分析——设计——编码阶段可能产生的Bug。这些Bug会逐渐放大,最后扩散到整个系统中,不仅很难寻找到,而且修复代价更高。“也就是说,你在销售软件时获取的利润,会在之后的维护中逐渐被消耗殆尽。”•大型企业的软件测试经费,一般会占到整个项目费用的30%-40%。由此可见软件测试的重要性。•无论是ISO9000的质量体系认证,还是CMU/SEI的CMM认证,其中均涉及到测试,ISO9000中19个要素,其中有一个就是“检验和试验”,对于软件来说就是测试;CMM中18个过程关键域,其中有一个质量保证过程关键域,就是对过程的监视和测量。什么是软件测试•软件测试是为了发现错误而执行程序的过程。或者说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。•简单地说,软件测试是“探测”,在“探测”中发现软件的毛病。软件测试的目的和原则•软件测试的目的(三大纪律):1、测试是程序的执行过程,目的在于发现错误;2、一个好的测试用例在于发现至今未发现的错误;3、一个成功的测试是发现了至尽未发现的错误的测试;-----测试的“三大纪律,八项注意”软件测试的目的和原则•软件测试的原则(八项注意):1应当把“尽早和不断地测试”作为开发者的座右铭。2程序员应该避免检查自己的程序,测试工作应该由独立的专业的软件测试人员或机构来完成。3在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。4充分注意测试中的群集现象。软件测试的目的和原则5测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。6严格执行测试计划,排除测试的随意性。7应当对每一个测试结果做全面检查。8妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。软件测试的对象软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期间。上图表明:测试工作是连续不断地在软件开发过程中进行的。需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。软件测试的分类•软件测试是一项复杂的系统工程,从不同的角度考虑可以有不同的划分方法,对测试进行分类是为了更好的明确测试的过程,了解测试究竟要完成哪些工作,尽量做到全面测试。•1、按开发阶段划分:单元测试集成测试系统测试验收测试回归测试2、按照测试实施组织划分:开发方测试(a测试)、用户测试(β测试)、第三方测试。3、按测试技术划分:白盒测试黑盒测试灰盒测试软件测试技术•软件测试模型•软件测试过程•错误分级•测试用例设计•软件测试自动化软件测试技术——软件测试模型V模型示意图软件测试技术——软件测试模型W模型示意图软件测试技术•其他模型除上述常见模型外,业界还流传着其他几种模型,例如H模型、X模型、前置测试模型等。X模型提出针对单独的程序片段进行相互分离的编码和测试,此后通过频繁的交接,通过集成最终合成为可执行的程序。前置测试模型体现了开发与测试的结合,要求对每一个交付内容进行测试。这些模型都针对其他模型的缺点提出了一些修正意见,但本身也可能存在一些不周到的地方。所以在测试过程管理中,正确选取过程模型是一个关键问题。——软件测试模型软件测试技术——软件测试过程软件测试的阶段组成测试计划测试设计测试开发测试执行测试评估软件测试过程——测试计划测试计划的目标收集并组织测试计划信息将软件细化为可检验的测试需求建立测试计划用户需求测试需求定义根据用户需求定义并完善测试需求,以作为整个测试的标准测试计划:定义测试需求软件测试过程——测试计划考虑测试内容软件测试过程——测试计划系统功能用户界面系统性能加载测试强化测试容量测试配置测试安装测试测试设计的目标软件测试过程——测试设计定义自动测试过程选择适当的测试用例组织测试过程信息,并传递给测试开发人员软件测试过程——测试设计测试设计定义用户需求测试需求选择决定测试过程测试用例测试开发目标软件测试过程——测试开发建立可重用的自动测试维护测试对于测试需求的可跟踪性测试开发技术:编程软件测试过程——测试开发优势:具有较大的灵活性缺点:编程过程复杂测试开发技术:录制优势:操作简单、快捷缺点:灵活性较差软件测试过程——测试开发测试开发技术录制脚本生成自动化,并可根据需要修改自动生成脚本软件测试过程——测试开发测试执行的目标执行测试检查测试结果研究并组织测试结果以便评估维护缺陷记录软件测试过程——测试执行软件测试技术——测试执行过程取下一个用例运行测试用例测试排错终止条件?有错误?记录错误是软件错?开始否否否是是是核对终止情况执行测试时的控制流程图测试评估的目标软件测试技术——测试评估提交量化的测试覆盖域及缺陷跟踪报告评估软件质量软件测试技术——测试评估测试评估的内容:覆盖域哪些测试需求经过了测试哪些需求通过了测试我们的工作进度及效率如何软件测试技术——测试评估测试评估的内容:缺陷我们发现了哪些缺陷我们解决了哪些缺陷遗留缺陷对软件有何影响错误分级-严重性我们一般把发现的错误(Bug)/缺陷(Defect)按严重性分为4类:1.严重:系统崩溃或挂起等导致系统不能继续运行;2.主要:使系统不稳定、或破坏数据、或产生错误结果,而且是常规操作中经常发生或非常规操作中不可避免的主要问题;3.次要:系统性能或响应时间变慢、产生错误的中间结果但不影响最终结果等影响有限的问题,如:显示不正确但输出正确;4.轻微:界面拼写错误或用户使用不方便等小问题或需要完善的问题;错误分级-优先级•我们也把发现的错误按优先级分为三种:1.高:立即修改;2.中:必须修改,但不一定马上修改;3.低:允许不修改;•一般来说是越影响用户接受或使用该产品的错误优先级越高。测试评估:综合评价软件测试技术——测试评估•下面让我们看一个例子。•假设一个程序P有输入X和Y及输出Z。在字长为32位的计算机上运行。如果X、Y只取整数,考虑把所有的X、Y值都做为测试数据,按黑盒测试方法进行穷举测试,力图全面、无遗漏地“挖掘”出程序中的所有错误。这样做可能采用的测试数据组(Xi,Yi)的最大可能数目为:232×232=264。如果程序P测试一组X、Y数据需要1毫秒,且一天工作24小时,一年工作365天,要完成264组测试,需要5亿年。软件测试技术——测试用例设计软件测试技术•因为我们不可能进行穷举测试,为了节省时间和资源、提高测试效率,必须要从数量极大的可用测试数据中精心挑选出具有代表性或特殊性的测试数据来进行测试。•测试用例--是为特定目标开发的测试输入、执行条件和预期结果的集合。这些特定目标可以是:验证一个特定的程序路径或核实是否符合特定需求。——这是RUP中关于测试用例的定义。•在实际工作中,对于测试用例的设计和选择,是考察一个测试人员工作能力和经验的最好方法。——测试用例设计原则软件测试技术•测试用例设计生成的基本准则•测试用例的代表性:能够代表并覆盖各种合理的和不合理、合法的和非法的、边界的和越界的、以及极限的输入数据、操作和环境设置等;•测试结果的可判定性:即测试执行结果的正确性是可判定的,每一个测试用例都应有相应的期望结果;•测试结果的可再现性:即对同样的测试用例,系统的执行结果应当是相同的。——测试用例设计原则•根据下面给出的规格说明,利用等价类划分的方法,给出足够的测试用例。•“一个程序读入3个整数,把这三个数值看作一个三角形的3条边的长度值。这个程序要打印出信息,说明这个三角形是不等边的、是等腰的、还是等边的。”•我们可以设三角形的3条边分别为A,B,C。如果它们能够构成三角形的3条边,必须满足:•A0,B0,C0,且A+BC,B+CA,A+CB。•如果是等腰的,还要判断A=B,或B=C,或A=C。•如果是等边的,则需判断是否A=B,且B=C,且A=C。软件测试技术——测试用例设计举例软件测试技术——测试用例设计举例软件测试技术——测试用例设计举例软件测试技术•什么时候开始设计测试用例?•测试用例该怎么写?•什么时候算是完成了测试用例的设计工作?•如何划分测试用例的粒度?•测试用例是否应该包含所有的细节?•如何评价测试用例的好坏?•以上几条可以算是测试用例设计方面最热的问题——测试用例设计•01.在“用户名”项中输入“user”;•02.在“密码”项中输入“password”;•03.点击“确定”按钮。这样的描述方式表面看起来可操作性似乎是增强了,任何人拿到这个文档都可以充当测试人员,检查一下这个功能是否存在缺陷。但是我们不要忘记,在开发过程中,变更的存在是必然的。但是对于一个业务复杂、功能完整的系统,如果按照这样的方法描述测试用例,最终要么产生大量的测试用例文档,要么产生过长的单个文档。无论是那一种,如果发生了类似于上面说的变化,维护文档都将变成一次地狱式的体验。那么这个问题应该任何解决呢?软件测试技术——测试用例设计软件测试技术•MercuryInteractive:WinRunnerLoadRunnerTestDirectorRational:RationalRobotRationalTestManagerRationalFunctionalTesterRationalPurify——软件测试自动化好的测试工程师应具备的素质•人是测试工作中最有价值也是最重要的资源,没有一个合格的、积极的测试小组,测试就不可能实现。然而,在软件开发产业中有一种非常普遍习惯,那就是让那些经验最少的新手、没有效率的开发者或不适合干其他工作的人去做测试工作。这绝对是一种目光短浅的行为,对一个系统进行有效的测试所需要的技能绝对不比进行软件开发需要的少,事实上,测试者将获得极其广泛的经验,他们将遇到许多开发者不可能遇到的问题。好的测试工程师应具备的素质①、沟通能力一名理想的测试者必须能够同测试涉及到的所有人进行沟通,具有与技术(开发者)和非技术人员(客户,管理人员)的交流能力。既要可以和用户谈得来,又能同开发人员说得上话,不幸的是这两类人没有共同语言。和用户谈话的重点必须放在系统可以正确地处理什么和不可以处理什么上。而和开发者谈相同的信息时,就必须将这些活重新组织以另一种方式表达出来,测试小组的成员必须能够同等地同用户和开发者沟通