软件质量保证与测试1第1章软件质量和测试概述2内容提要1.1软件特征与软件工程1.1.1软件分类1.1.2层次化软件工程1.1.3软件范型的转变1.1.4现代软件开发1.2软件质量1.2.1质量概念1.2.2质量运动1.2.3软件质量概念1.2.4软件质量评价体系与标准1.3软件测试与可靠性概述1.3.1软件测试的意义1.3.2软件测试的定义1.3.3软件测试方法1.3.4软件测试自动化1.3.5软件缺陷的修复费用1.4软件质量保证与测试人才的特点1.4.1现代软件研发对软件人才的需求1.4.2优秀的软件测试员应具备的素质1.5小结31.1软件特征与软件工程要理解软件的含义并全面地理解软件工程,我们首先要明确软件的特征,并据此知道软件与人类建造的其它事物之间的区别。IEEE定义对软件的定义如下:软件是计算机程序、规程以及可能的相关文档和运行计算机系统需要的数据。软件包含计算机程序、规程、文档和软件系统运行所必需的数据四个部分。4软件具有与硬件完全不同的特征软件是开发产生的,而不是用传统方法制造。软件不会像硬件一样有磨损。很多软件不能通过已有构件组装,只能自己定义。5硬件、软件失效曲线图时间失效率初期失败率磨损时间失效率变更由于(变更的)副作用而导致失效率提高理想曲线实际曲线61.1.1软件分类当前的计算机软件分为七个大类,使得软件工程正面临持续的挑战:系统软件应用软件Web应用软件工程和科学软件嵌入式软件产品线软件人工智能软件7新的挑战也逐渐显现出来普适计算网络资源开源软件新经济81.1.2层次化软件工程FritzBauer在NATO(北大西洋公约组织)会议上给出的定义仍是我们进一步展开讨论的基础:软件工程:是为了经济地获得可靠的和能在实际机器上高效运行的软件而建立和使用的好的工程原则。美国电气和电子工程师协会(InstituteofElectricalandElectronicsEngineers,IEEE)给出了一个更加综合的定义:软件工程:(1)将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。(2)(1)中所述方法的研究。9软件过程、软件方法和软件工具质量关注点工具方法过程10软件工程的视图抛开要工程化的实体,我们必须先回答下列问题:要解决的问题是什么?要用于解决该问题的实体具有什么特点?如何实现该实体?其解决方案是怎样的?如何建造该实体?采用什么方法去发现该实体设计和建造过程中产生的错误?当该实体的用户要求修改、适应和增强时,如何支持这些活动?11三个阶段我们可以把与软件工程相关的工作分为三个阶段,其中的每个阶段能够回答上述的一个或多个问题:定义阶段针对“做什么”开发阶段针对“如何做”维护阶段针对“改变”12补充说明还有很多保护性活动用来补充说明在软件工程的一般视图中的各个阶段和相关步骤,这些典型的贯穿于整个软件过程中的活动包括:软件项目追踪和控制正式的技术复审软件质量保证软件配置管理文档的准备和产生可复用管理测试风险管理131.1.3软件范型的转变80年代90年代本世纪初面向网络资源面向单体与系统粒度、复杂度语义Web服务Web服务构件对象典型的访问方式:面向语义服务的体系结构SSOA(OWL(-s),SORL,UBL,…)面向服务的体系结构SOA(XML,SOAP,HTTP,…)中间件(CORBA,J2EE)消息传递时间3141.1.4现代软件开发传统软件开发和现代软件开发软件团队与软件开发人员的培养项目经理软件开发组长开发人员开发人员开发人员开发人员测试组长测试人员测试人员测试人员测试人员产品经理用户教育人员可用性工程师设计师151.2软件质量有些软件开发者仍然相信软件质量是在编码之后才应该开始担心的事情。这是荒谬的,因为软件质量保证(SoftwareQualityAssurance,SQA)是一种应用于整个软件过程的保护性活动,它包括:一种质量管理方法,有效的软件工程技术(方法和工具)在整个软件过程中采用的正式技术复审一种多层次的测试策略对软件文档及其修改的控制保证软件遵从软件开发标准的规程度量和报告机制161.2.1质量概念我们应从以下几个方面考虑软件质量:软件结构方面功能与性能方面开发标准与文档方面171.2.2质量运动全面质量管理通常都包括以下4个步骤:第1步是指一个连续的过程改进系统,其目标在于开发一个看的见的、可重复的和可度量的软件过程。第2步只第1步完成之后才可启动。这一步将检查影响过程的其它因素,并优化这些因素对过程的影响。例如,软件过程可能受到高层职员流动的影响,而该影响则是公司内部不断重组而引起的。一个稳定的公司组织会对软件质量的提高带来很大的帮助,所以第2步可以帮助管理者对公司重组方式提出建议。前面两个步骤关注的是过程,第3步(或称为“第五感觉”)则关注软件产品的用户,它是通过检查用户使用产品的方式,而导致产品本身的改进和潜在地改进产品的生产过程。第4步将管理者的注意从当前的产品上移开并拓宽。作为一个面向商业的步骤,该步骤通过观察产品的市场用途,来寻找产品在相关领域中的发展机会。在软件领域,第4步可以被视为一种发现有利可图的新产品,或视作寻找当前计算机系统的副产品用途的努力。181.2.3软件质量概念IEEE关于软件质量的定义:软件质量是系统、部件或者过程满足规定需求的程度。系统、部件或者过程满足顾客或者用户需要或期望的程度。该定义相对客观,强调了产品(或服务)和客户/社会需求的一致性。ANSI关于软件质量的定义:按照ANSI(AmericanNationalStandardsInstitute,美国国家标准学会)在1983年的标准陈述,软件质量定义为“与软件产品满足规定的和隐含的需求的能力有关的特征和特性的全体”。具体包括软件产品中能满足用户给定需求的全部特性的集合,软件具有所期望的各种属性组合的程度,用户主观得出的软件是否满足其综合期望的程度,决定所用软件在使用中将满足其综合期望程度的软件合成特性。196个主要特征我们把各类软件综合起来看,可以列出下列6个主要特征:功能性:软件实现的功能达到要求的和隐含的用户需求以及设计规范的程度,可靠性:软件在指定条件和特定时间段内维持性能的能力程度,易使用性:用户使用该软件所付出的学习精力,效率:在指定条件下,软件功能与所占用资源之间的比值,可维护性:当发现错误、运行环境改变或客户需求改变时,程序能修改的容易程度,可移植性:将软件从一种环境移入另一种环境的容易程度。201.2.4软件质量评价体系与标准IEEE给出软件质量保证的定义,软件质量保证(SQA)是:一种有计划的,系统化的行动模式,它是为项目或者产品符合己有技术需求提供充分信任所必需的。设计用来评价开发或者制造产品的过程的一组活动,与质量控制有区别。质量保证与质量控制的区别QA是对人、对过程,致力于使管理者、顾客和其他相关方相信有能力满足质量要求,更多的是体现在流程制度上;QC是对人事、对物,直接致力于满足质量要求,体现在质量把关的具体工作过程中。2122QAQC全称质量保证(QualityAssurance,QA)质量控制(QualityControl,QC)角色QA工程师测试工程师,评审员定义为了确保软件开发过程、工件符合预期的结果,依照过程和计划采取的一系列活动及其结果评价为了发现软件产品的错误、缺陷而进行工作的过程职责监控公司质量保证体系的运行情况,审计项目的实际执行情况和公司规范之间的差距,并出具统计分析报告和改进建议。是过程、产品的审计者。对每个阶段或者关键点的工件进行检查,评估工件是否符合预计的质量要求。关注各阶段的评审和测试缺陷。是产品质量检查者。分工原则QA只要检查项目按照过程进行了某项活动没有,产出了某个产品没有QC检查产品是否符合质量要求SQA活动1.为项目准备SQA计划。2.参与开发项目的软件过程描述。3.评审各项软件工程活动,对其是否符合定义好的软件过程进行核实。4.审计指定的软件工作产品,对其是否符合事先定义好的需求进行核实。5.确保软件工作及产品中的偏差已记录在案,并根据预定的规程进行处理。6.记录所有不符合的部分并报告给高级领导者。23SQA举例SQA实例24251.3软件测试与可靠性概述1.3.1软件测试的意义为什么要进行软件测试?视频Bug故事视频PIE模型Bug---GraceHopperdeBug261.3软件测试与可靠性概述1.3.1软件测试的意义迪斯尼狮子王缺陷英特尔浮点除法缺陷人造陨石坑缺陷程序员的千年虫问题Windows的输入法漏洞爱国者导弹缺陷271.3.2软件测试的定义1983年,IEEE在提出的软件测试文档标准(IEEEStandardForSoftwareTestDocument),即IEEE829-1983中对软件测试进行了准确的定义:软件测试是使用人工或自动手段来运行或测定某个系统的过程,检验它是否满足规定的需求或者弄清预期结果与实际结果之间的差别。IEEE在1990年颁布的软件工程标准术语集中沿用了这一概念,该概念非常明确的提出了软件测试以检验是否满足需求为目标。其次,G.J.Myers在其经典论著《软件测试的艺术》中对软件测试提出如下观点:测试是程序的执行过程,目的在于发现错误,一个好的测试用例可以发现至今尚未发现的错误,一个成功的测试能发现至今未发现的错误。281.3.3软件测试方法1.静态方法和动态方法2.黑盒测试、白盒测试和灰盒测试3.基于软件开发阶段的测试方法需求测试单元测试集成测试性能测试压力测试容量测试配置测试回归测试安装测试安全性测试软件软件输出输出输入输入黑盒测试白盒测试291.3.4软件测试自动化白盒测试工具功能测试工具负载压力测试工具测试管理工具301.3.5软件缺陷的修复费用说明书设计编码测试发布$1$10$100$1000+缺陷发现的时间修复缺陷的费用311.4软件质量保证与测试人才的特点1.4.1现代软件研发对软件人才的需求传统软件人才的特点创新软件人才的特点敢冒风险敢冒风险有雄心壮志有雄心壮志能学习,适应新环境能学习,适应新环境实事求是的作风创新精神有克服困难的毅力如果对问题有兴趣,则有热情、有主动性扎实的理论基础,尤其是数学独立从事研究的能力很强的编程能力题目想的远、做的深讲纪律、讲服从对什么事都有主见对许多事情都没有主见,即使有想法也不敢说直截了当地沟通甚至批评和争论32研发方法的差别创新研发方法非创新研发方法想着做事情坐着想事情经过科学手段、大量的数据、可重复的深入研究肤浅的、无用的、无法扩张的简单结果研究、理解、借用别人的结果不看别人的研究,或只抄袭别人的研究成果经过亲自的设计工程原型,证实对用户有用理论的、没用的纸上谈兵承认失败,从头开始不承认失败,永无止境地延续研究33现代软件研发对软件人才提出的要求专业基础和创新能力具备主人翁精神良好的团队精神从错误中学习的能力341.4.2优秀的软件测试员应具备的素质软件测试员是探索者:软件测试员不会害怕进入陌生环境,他们喜欢拿到新的软件,安装在自己的机器上并观看结果。软件测试员是故障排除员:软件测试员善于发现问题的症结,他们喜欢解谜。软件测试员不放过蛛丝马迹:软件测试员总在不停地尝试。他们可能会碰到转瞬即逝或者难以证实的软件缺陷,当然,他们不会当作视偶然而轻易放过,而会想尽一切可能去发现它们。软件测试员具有创造性:这是对测试是显而易见的。软件测试员的工作是要想出富有创意审视超常的手段来寻找缺陷。软件测试员是追求完美者:软件测试员力求完美,但是当知道某些无法企及时,他们不去苛求,而是尽力接近目标。软件测试员判断准确:软件测试员要判断测试内容、测试时间、以及看到的问题是否是真正的缺陷。