软件工程授课教师:蓝天联系电话:13488929723电子邮箱:lantian1029@uestc.edu.cn第六章质量保证软件质量保证1小结4软件测试技术3软件测试策略2本章学习目标123了解质量保证活动在软件工程中的重要作用和意义掌握软件测试的常用方法理解质量保证的概念、软件测试的概念软件质量保证软件质量•定义o明确表示是否符合功能和性能要求,明确地记载开发标准和所有专业开发软件的期望的隐性特点•关键点o软件需求是软件质量测量的基础o缺乏规定的一致性就是缺乏软件的质量o制定的标准会定义软件工程发展的标准,它引导着软件工程经理软件质量管理•目的用来衡量软件设计(设计品质),以及如何做好符合该设计(符合质量)的软件•内容1)明确规定需要符合的功能和性能的要求2)明确的记录开发的标准3)符合所有专业软件开发的隐性标准质量控制•定义o是审查产品相关的各个方面质量的过程•内容o元素,如控制、作业管理、明确和完善的管理过程[DeMarco1999]、性能和完整性的标准、确认和记录等o能力,如知识、技能、经验和资历等o软要素,如人员廉正、信任、组织文化、激励、团队合作精神、与品质的关系质量保证•含义o系统地监测和评估一个工程的各个方面,以最大限度地提高正在由生产过程中实现的质量的最低标准•原则o“适合用途”:该产品应符合预期的目的o“一次成功”:错误应该被淘汰软件质量保证(SQA)•含义o一个监控的软件工程以确保软件质量的过程•SQA涵盖了整个软件开发过程•SQA的目标o承诺,能力,Review活动,测量和验证•内容o背景介绍oSQA活动SQA活动•一般活动:o审查o监督o审核•过程监控o一个确保采取适当步骤来进行的过程中所遵循的SQA活动•审核o用来审查管理、技术和流程,以保证提供的质量和软件产品的状态指示SQA各阶段活动1•软件概念和启动阶段o确保这些进程、程序和标准是适当的,明确的,具体的,可审核•软件需求阶段o要求是完整的,可测试的,功能可靠,性能,和接口需求•软件体系结构(初步)设计阶段o确保遵守管理计划中经审批的设计标准o确保所有的软件需求分配给软件组件o保证测试验证矩阵存在,并且不断更新o保证接口控制文档和标准中指定的内容一致o检查PDR文件和确保所有行动项目得到解决o确保已批准的设计被置于配置管理之下SQA各阶段活动2•软件的详细设计阶段o确保经批准的设计标准得到遵守o保证分配的模块在详细设计中o审查CDR文件,确保所有行动项目得到解决•软件实施阶段o结果编码和在软件开发计划中的设计活动o所有交付项目的状态o配置管理活动和软件开发库o不符合项报告和纠正措施系统SQA各阶段活动3•软件集成和测试阶段o确保为所有交付项目进行测试o确保所有测试根据测试计划和程序运行,任何不符合项都要报告和解决o保证测试报告是完整和正确的o验证测试已经完成,软件和文件准备交付o参与测试前再审,并保证所有行动项目已完成•软件验收和交付阶段•软件支持工程和操作阶段软件评审•含义o指“一个过程或会议期间进行的软件产品的审核,是由项目人员、管理人员,用户、客户、用户代表或其他有关各方对一个软件产品进行评论或批准”•软件审核分类o软件同行评审o软件管理评审o软件审计评审评审指南•[加入评估]•管理准备工作•规划审查•审查程序的概述•[个人]准备•[小组]检查•返工/跟进•[退出评估]软件可靠性•定义o是指在给定时间内,特定环境下软件无错运行的概率•含义o在规定的条件下,在规定的时间内,软件不引起系统失效的概率o在规定的时间周期内,在所述条件下程序执行所要求的功能的能力可靠性和可用性度量•可靠性o指能够避免或者检测重大错误的能力o度量:平均失效时间、平均维修时间•可用性o在某个时间点上程序能够按照需求执行的概率o度量:失效在维护中所占比重ISO9000质量标准•由国际标准化组织质量管理和质量保证技术委员会(ISO/TC176)制定的所有国际标准•历程o1987年版本ISO9000:1987o1994年版本ISO9000:1994o2000年版本ISO9000:2000oISO9001:2008标准的变化不大软件测试策略软件测试策略•软件测试策略为软件开发人员、质量保证组织、和客户提供了一个路线图,规定了测试的主要步骤•测试策略必须和测试计划、测试用例设计、测试执行、还有测试结果数据的收集与分析结合在一起•测试策略还应当具备足够的灵活性,这样在必要的时候它能够有足够的可塑性来应付所有的大软件系统•测试策略还必须保证足够的严格,这样才能保证对项目的整个进程进行合理的计划和跟踪管理软件测试的过程模型软件测试V模型V模型V模型非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程期间各阶段应关系:•1、单元测试的主要目的是验证软件模块是否按详细设计的规格说明正确运行。•2、集成测试主要目的是检查多个模块间是否按概要设计说明的方式协同工作。•3、系统测试的主要目的是验证整个系统是否满足需求规格说明。•4、验收测试从用户的角度检查系统是否满足合同中定义的需求,以及以确认产品是否能符合业务上的需要。回归测试•在软件测试的各个阶段,在修正发现的软件缺陷或增加新功能时,变化的部分必须进行再测试。此外,对软件进行修改还可能会导致引入新的软件缺陷以及其他问题。为解决这些问题,需要进行回归测试。•回归测试是指有选择地重新测试系统或其组件,以验证对软件的修改没有导致不希望出现的影响,以及系统或组件仍然符合其指定的需求。•回归测试可以在所有的测试级别执行,并应用于功能和非功能测试中。•回归测试应该尽量采用自动化测试。回归测试的范围1、缺陷再测试:重新运行所有发现故障的测试,而新的软件版本已经修正了这些故障。2、功能改变的测试:测试所有修改或修正过的程序部分。3、新功能测试:测试所有新集成的程序。4、完全回归测试:测试整个系统。软件测试策略中应注意的问题•在着手开始测试之前,要对产品的需求进行量化。•明确指出测试目标。•为每类用户建立描述交互场景的用例。•建立一个强调“快速循环测试”的测试计划。•设计一个能够测试自身是否“强壮”的软件。•在进行测试之前,对软件进行有效的正式技术审核。•使用正式技术审核来评估测试策略和测试用例本身。•为测试过程建立一种持续的改进方法。测试的基本步骤单元测试、集成测试和系统测试的步骤:•计划与准备阶段o制定计划o编写与评审测试用例o编写测试脚本和准备测试环境•执行阶段o搭建环境、构造测试数据o执行测试并记录问题o和开发人员一起确认问题o撰写测试报告•返工与回归测试阶段单元测试•单元测试又称模块测试,是针对软件设计的最小单位─程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。•单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。•单元的内涵•单元测试的主要依据单元测试的进入和退出条件•进入条件:o被测代码编译链接通过o被测代码静态检查工具检查通过o已完成至少一轮代码检视或走读o单元测试用例的检视通过o单元测试代码写完并通过检测•退出条件:o所用测试用例执行通过o单元测试覆盖率达到预定要求o单元测试未被执行的代码进行正式审查单元测试的主要内容单元测试主要内容模块接口测试•在单元测试的开始,应对通过被测模块的数据流进行测试。测试项目包括:o调用本模块的输入参数是否正确;o本模块调用子模块时输入给子模块的参数是否正确;o全局量的定义在各模块中是否一致;模块接口测试(续)•在做内外存交换时要考虑:o文件属性是否正确;oOPEN与CLOSE语句是否正确;o缓冲区容量与记录长度是否匹配;o在进行读写操作之前是否打开了文件;o在结束文件处理时是否关闭了文件;o正文书写/输入错误,oI/O错误是否检查并做了处理。局部数据结构测试•不正确或不一致的数据类型说明•使用尚未赋值或尚未初始化的变量•错误的初始值或错误的缺省值•变量名拼写错或书写错•不一致的数据类型•全局数据对模块的影响路径测试•选择适当的测试用例,对模块中重要的执行路径进行测试。•应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。•对基本执行路径和循环进行测试可以发现大量的路径错误。错误处理测试•出错的描述是否难以理解•出错的描述是否能够对错误定位•显示的错误与实际的错误是否相符•对错误条件的处理正确与否•在对错误进行处理之前,错误条件是否已经引起系统的干预等边界测试•注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。•如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。单元测试用例的设计•在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。单元测试的环境•模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。o驱动模块(driver)o桩模块(stub)──存根模块集成测试•集成测试就是将软件集成起来后进行测试。又称为子系统测试、组装测试、部件测试等。•集成测试主要可以检查诸如两个模块单独运行正常,但集成起来运行可能出现问题的情况。•集成测试是一种范围很广的测试,当向下细化时,就成为单元测试。集成测试的主要方法•自顶向下的集成方法•自底向上的集成方法•SMOKE方法自顶向下的集成方法•这种组装方式将模块按系统程序结构,沿控制层次自顶向下进行集成。从属于主控模块的按深度优先方式(纵向)或者广度优先方式(横向)集成到结构中去。•自顶向下的集成方式在测试过程中较早地验证了主要的控制和判断点。•选用按深度方向集成的方式,可以首先实现和验证一个完整的软件功能。•缺点是桩的开发量较大AS1S2S3ABCDS4S5ABCDEF(1)(2)(3)广度优先方式ABCDEFABCDEFAS1S2S3ABS2S3EABCS3E(1)(2)(3)(4)深度优先方式自底向上的集成方法•自底向上集成方法是从软件结构最底层的模块开始,按照接口依赖关系逐层向上集成以进行测试。•由于是从最底层开始集成,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经集成并测试完成,所以不再需要使用桩模块进行辅助测试。在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。•自底向上的集成方法的优点是每个模块调用其他底层模块都已经测试,不需要桩模块;•缺点是每个模块都必须编写驱动模块;缺陷的隔离和定位不如自顶向下。自底向上的集成方法ABCDEFd2Cd1Ed3Fd4BEd5FDABCDEF•值得注意的是,在实际工作中,常常是综合使用自底向上和自顶向下的集成方法。•例如,按进度选择优先测试已经完成的模块o如果已完成的模块所调用的模块没有完成,就采用自顶向下的方法,打桩进行测试o如果已经完成模块的上层模块没有完成,可以采用自底向上集成方式。SMOKE方法•将已经转换为代码的软件构件集成为构造(build)。一个构造包括所有的数据文件、库、可复用的模块以及实现一个或多个产品功能所需的工程化构件。•设计一系列测试以暴露影响构造正确地完成其功能的错误。其目的是为了发现极有可能造成项目延迟的业务阻塞(showstopper)错误。•每天将该构造与其他构造,以及整个软件产品集成起来进行冒烟测试。这种集成方法可以是自顶向下,也可以自底向上。集成测试用例的设计•首先应考虑为通过性测试设计用例,用来验证需求和设计是否得到满足、软件功能是否得到实现。可以考虑等价类分法、场景分析法、状态图法等•其次考虑为失效性测试设计用例,主要以已知的缺陷空间为依据设计测试用例。可以考虑边界值法、错误猜测法、因果图法和状态图法等•也应强调覆盖率的要求。集成测试的覆盖率有接口覆盖率,接口路径覆盖率等。•注意接口有显性和隐