第1章软件测试概述罗东俊ZSUJONE@126.COM1主要内容1.1软件危机1.2软件质量与可靠性1.3软件测试的基本知识1.4软件测试职业21.1软件危机•20世纪60年代,面对愈来愈复杂的大型软件系统开发,出现了软件危机。主要表现在以下几个方面:–软件项目无法按期完成,超出经费预算,软件质量难以控制;–开发人员和开发过程之间管理不规范,约定不严密,文档书写不完整,使得软件维护费用高,某些系统甚至无法进行修改;–缺乏严密有效的质量检测手段,交付给用户的软件质量差,在运行中出现许多问题,甚至带来严重的后果;–系统更新换代难度大。3著名案例•IBM公司在1963年到1966年开发的IBM360操作系统。–这一项目在开发期中每年花费5000万美元,参加工作最多时有1000人,总共写出了一百万行源程序。–该项目最后没有拿到开发成果。•项目负责人Brooks事后总结了他在开发过程中的沉痛教训,写成了《人月神话》一书。4软件危机内在的原因•在软件开发过程中,软件缺陷的积累和放大效应是导致软件危机的主要原因。•人员和其他资源的投入导致开发成本急剧增加,带有缺陷的开发成果导致开发质量大幅下降,反复无常的修改导致开发效率严重低下。•因此,迫切地需要规范化的过程来制约软件开发的无序性,便产生了软件工程。5软件工程和软件危机的解决•软件工程的任务:通过提供规范化的分析设计方法及工具软件,来避免或者减少软件错误的发生,为最终根除软件危机提供强有力的技术保障。•软件工程中的软件含义:是程序以及开发、使用和维护程序所需的所有文档。•软件工程学:涉及到与生产软件相关的所有活动,包括计算机科学、管理学、经济学、心理学等,其研究的主要内容是:如何应用科学的理论和工程上的技术来指导软件的开发,从而达到较少的投资获得高质量软件的最终目标。6软件工程各个阶段的基本情况71.2软件质量与可靠性•软件质量主要表现为三个方面:–第一,软件需求是衡量软件质量的基础,符合用户需求的软件才是高质量的软件;–其次,软件开发必须遵循规定的标准;–第三,软件应该满足那些隐含的要求,否则软件产品的质量仍然是有问题的。8软件的质量因素•软件的质量因素分为三类:–(1)软件的运行特性–(2)软件的修正特性–(3)软件的转移特性9软件的运行特性•正确性:–软件能满足其规格说明及完成客户提出任务要求的程度。•可靠性:–该软件能够总是精确地工作吗?•有效性:–该软件是否能在计算机上有效地运行,内存、外设容量是否够用?•完整性:–控制未经允许人员使用软件或数据的能力。•可用性:–此软件容易掌握吗?10软件的修正特性•可维护性:–找到软件错误发生的位置并加以修正所花费工作量的大小。•灵活性:–可以修改,容易修改吗?•可测试性:–可以测试,容易测试吗?11软件的转移特性•可移植性:–可以在别的机器上使用这个软件吗?•可复用性:–它能重复使用吗?•共运行性:–可以把这个软件与别的软件对接吗?要能做到这样得花多少工作量?12质量特性•质量因素往往难于,甚至不可能直接度量,因此必须进一步将质量因素分解成一些独立的、容易度量的质量特性(QualityCharacteristics)。•质量特性为质量提供了更完全、更具体的定义,有助于说明各质量因素相互之间的关系,准确地决定质量因素的范围,方便质量检查和质量的定量观测。•常见质量特性:软件可靠性、软件错误数13软件可靠性•IEEE对软件可靠性的定义:系统在特定环境下,在给定的时间内无故障运行的概率。•软件可靠性是对软件在设计、开发以及所预定的环境下具有能力的置信度的一个度量,是衡量软件质量的主要参数之一。•软件可靠性主要关注软件是否可以稳定地工作,可靠性差意味着软件在执行时总是频繁地、重复地失败,软件不能稳定工作。•软件可靠性可以用工作历史数据和开发数据来测量、标示和估算出来。14软件错误•软件错误(Error)或软件缺陷(Fault)是指软件没有实现其最终用户合理预期的功能要求。•软件错误除了包括程序编写中的错误,例如,数组越界、变址或移位差1、用错特征位、补码运算错、使用指针的问题、控制转移的问题以及间接寻址出错的问题等,还包括了很多类型的错误。15软件错误分类16软件缺陷(Fault)的规则定义(1)软件未达到产品说明书中已经标明的功能;–如:某计算器按下“+”键时什么反应也没有或得到了错误的答案(2)软件出现了产品说明书中指明不会出现的错误;–如:某计算器连续敲击键盘使得计算器不能接受输入(3)软件未达到产品说明书中虽未指出但应当达到的目标;–如:某计算器电池没电或者电量不足会导致计算不正确(4)软件功能超出了产品说明书中指明的范围;–如:某计算器除了加减乘除外,还可以求平方根,但这功能产品说明书中并没有说明(5)软件测试人员认为软件难以理解、不易使用,或者最终用户认为该软件使用效果不良。–如:某计算器按键小、布局不好17软件缺陷产生的原因其他10%软件产品说明书(需求)56%编写代码7%设计27%181.3软件测试的基本知识1.3.1软件测试的背景和意义1.3.2软件测试的定义1.3.3软件测试的分类1.3.4软件测试的过程1.3.5软件测试与软件开发过程的关系1.3.6正确认识软件测试191.3.1软件测试的背景和意义•软件测试在软件生存期中占有非常突出的位置,是保证软件质量的重要手段。•软件项目的实践一再说明,为了确保软件产品能够符合用户的需要,必须着眼于整个软件生存期,在各个阶段进行验证、确认和测试活动,使软件不致在开发完成后,才发现和用户的需求有较大的差距。20软件缺陷(Fault)和软件故障(Failure)案例•案例1美国迪斯尼公司的狮子王游戏软件bug–兼容性问题•案例2美国航天局火星登陆事故–系统测试衔接问题•案例3跨世纪“千年虫”问题–年使用两位,在2000年到来时会出现问题,导致更换和升级系统的费用非常高。•案例4爱国者导弹防御系统炸死自家人–1991海湾战争中在几次对抗导弹战役中失利,其中一枚在沙特击毙28名美国士兵,其症结就在于一个软件缺陷:系统时钟错误积累拖延了14小时,造成跟踪系统失去准确度。•案例5Intel奔腾浮点除法(1994)–在计算器中输入以下算式(4195835/3145727)*3145727-4195835,如果结果为零,则计算器没有问题,若不为零,则使用的是老式intel芯片。211.3.2软件测试的定义•软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最终审查,它是软件质量保证的关键步骤。•通常对软件测试的定义有两种描述:–定义1:软件测试是为了发现错误而执行程序的过程。–定义2:软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计的一批测试用例,并利用这些测试用例运行程序以及发现错误的过程,即执行测试步骤。•在IEEE提出的软件工程标准术语中,软件测试被定义为:“使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清楚预期结果与实际结果之间的差别。”22软件测试的定义•事实上,所有发布的软件产品都会因为缺陷而导致用户的困扰和开发者时间和金钱上的额外开支。而这些导致成本风险的软件问题可以通过在软件生命周期的每一个阶段中充分规划和执行验证和确认(verificationandvalidation)而大大降低。•由此,广义的软件测试实际是由确认、验证、测试三个方面组成。23确认、验证与测试•确认:是评估将要开发的软件产品是否是正确无误、可行和有价值的。这里包含了对用户需求满足程度的评价,意味着确保一个待开发软件是正确无误的,是对软件开发构想的检测。•验证:是检测软件开发的每个阶段、每个步骤的结果是否正确无误,是否与软件开发各阶段的要求或期望的结果相一致。验证意味着确保软件是会正确无误的实现软件的需求,开发过程是沿着正确的方向在进行。•测试:与狭隘的测试概念统一。通常是经过单元测试、集成测试、确认测试和系统测试四个环节。•在整个软件生存期,确认、验证、测试分别有其侧重的阶段。–确认主要体现在计划阶段、需求分析阶段、也会出现在测试阶段;–验证主要体现在设计阶段和编码阶段;–测试主要体现在编码阶段。•事实上,确认、验证、测试是相辅相成的。确认无疑会产生验证和测试的标准,而验证和测试通常又会帮助完成一些确认,特别是在系统测试阶段。24软件测试的对象•软件测试不等于程序测试。•软件测试贯串于软件定义和开发的整个过程。•软件开发过程中所产生的需求规格说明、概要设计规格说明、详细设计规格说明以及源程序都是软件测试的对象。251.3.3软件测试的分类•软件测试按照不同的划分方法,有不同的分类。–按照程序是否执行,可以分为静态测试和动态测试;–按照测试用例的设计方法,可以分为白盒测试和黑盒测试;–按照开发阶段划分,可分为单元测试、集成测试、确认测试、系统测试和验收测试;–按照测试实施组织划分,可分为开发方测试(α测试)、用户测试(β测试)和第三方测试;–按照是否使用工具软件,可以分为手工测试和自动测试。261.静态测试和动态测试•原则上讲,可以把软件测试分为两大类,即静态测试和动态测试。•静态测试的主要特征是在用计算机测试源程序时,计算机并不真正运行被测试的程序。–这说明静态方法一方面要利用计算机作为对被测程序进行特性分析的工具,它与人工测试有着根本的区别;–另一方面它并不真正运行被测程序,只进行特性分析,这是和动态方法不同的方面。•因此,静态测试常称为“分析”,静态分析是对被测程序进行特性分析的一些方法的总称。27静态分析并不等同于编译系统•编译系统虽也能发现某些程序错误,但这些错误远非软件中存在的大部分错误,静态分析的查询和分析功能是编译程序所不能代替的。•目前,已经开发出一些静态分析系统作为软件测试的工具,静态分析已被当作一种自动化的代码校验方法。不同的方法有各自的目标和步骤,侧重点不同。28静态测试的任务•静态测试包括代码检查、静态结构分析、代码质量度量等。•主要表现为以下方面:–检查算法的逻辑正确性;检查模块接口的正确性;–检查输入参数是否有合法性检查;–检查调用其他模块的接口是否正确;–检查是否设置了适当的出错处理;–检查表达式、语句是否正确,是否含有二义性;–检查常量或全局变量使用是否正确;–检查标识符的使用是否规范、一致;–检查程序风格的一致性、规范性;–检查代码是否可以优化,算法效率是否最高;–检查代码注释是否完整,是否正确反映了代码的功能。29动态测试•动态测试的主要特征是计算机必须真正运行被测试的程序,通过输入测试用例,对其运行情况进行分析,判断期望结果和实际结果是否一致。•动态测试包括:功能确认与接口测试、覆盖率分析、性能分析、内存分析。302.黑盒测试和白盒测试•测试的关键是测试用例的设计,对任何工程产品都可用两种方法对其进行测试:–第一是基于产品的功能来规划测试,检查程序各功能是否实现,并检查其中的错误,这种测试称为黑盒测试。–第二是基于产品的内部结构来规划测试,检查内部操作是否按规定执行,各部分是否被充分利用,这种测试称为白盒测试。•一般来说,这两类测试方法是从完全不同的起点出发,两类方法各有侧重,各有优缺点,构成互补关系,在测试的实践中都是有效和实用的,在规划测试时需要把黑盒测试和白盒测试结合起来。•通常在进行单元测试时大都采用白盒测试,而在确认测试或系统测试中大都采用黑盒测试。31黑盒测试•黑盒测试(Black-BoxTesting)又称功能测试、数据驱动测试或基于软件需求规格说明书的测试,是一种从用户观点出发的测试。•用这种方法进行测试时,把被测试程序当作一个黑盒,在不考虑程序内部结构和内部特性,测试者只知道该程序的输入和输出之间的关系或程序的功能的情况下,依靠能够反映这一关系的软件需求规格说明书,来确定测试用例和推断测试结果的正确性。•软件的黑盒测试被用来证实软件功能的正确性和可操作性。32黑盒测试示意图33黑盒测试的优缺点•功能测试不仅能够找到大多数其他测试方法无法发现的错误,而且是一些外购软件、参数