1.测试概述课程内容软件测试的背景软件测试概述软件测试技术软件测试方法软件测试模型软件测试过程软件测试人员例子软件错误失效案例迪斯尼的狮子王游戏•时间:1994-1995•背景:迪斯尼公司首次进军儿童游戏市场,市场宣传力度很大,前期销售情况很好•出现的问题:该游戏在一些PC机上无法玩•原因:迪斯尼公司没有对市场上已经投入运行的PC机型进行调研,并且进行测试,导至该游戏只在程序员开发游戏的系统上可以运行,但在大众使用的常见系统中无法运行•结果:迪斯尼公司不得不承担客户的投诉、产品退货、更换光盘、以及又一轮的调试、修改和测试的所有费用。软件错误失效案例迪斯尼的狮子王游戏•时间:1994-1995•背景:迪斯尼公司首次进军儿童游戏市场,市场宣传力度很大,前期销售情况很好•出现的问题:该游戏在一些PC机上无法玩•原因:迪斯尼公司没有对市场上已经投入运行的PC机型进行调研,并且进行测试,导至该游戏只在程序员开发游戏的系统上可以运行,但在大众使用的常见系统中无法运行•结果:迪斯尼公司不得不承担客户的投诉、产品退货、更换光盘、以及又一轮的调试、修改和测试的所有费用。软件错误失效案例Intel奔腾浮点除法软件缺陷•时间:1994•背景:Intel发布的一款新处理器•问题:在装有这款处理器计算机的计算器中执行算式“(4195835/3145727)×3145727-4195835”不等于0•原因:老式奔腾CPU的浮点除法软件有缺陷•结果:Intel事实上在芯片发布之前,已经发现了这个缺陷,但认为不严重,没有修正。被外界发现后,试图掩饰。最终,迫于舆论压力公开道歉,花费4亿美元更换老芯片。软件错误失效案例Intel奔腾浮点除法软件缺陷•时间:1994•背景:Intel发布的一款新处理器•问题:在装有这款处理器计算机的计算器中执行算式“(4195835/3145727)×3145727-4195835”不等于0•原因:老式奔腾CPU的浮点除法软件有缺陷•结果:Intel事实上在芯片发布之前,已经发现了这个缺陷,但认为不严重,没有修正。被外界发现后,试图掩饰。最终,迫于舆论压力公开道歉,花费4亿美元更换老芯片。软件错误失效案例美国航天局火星极地登陆•时间:1999年12月3日•背景:火星极地登陆飞船在试图登陆火星表面时失踪。•问题:某一个数据位被意外复位.•原因:为了省钱,采用一个廉价的触点开关来控制关闭推进器。但是由于飞船脚迅速打开的机械震动,大多数情况下也会打开触点开关,并设置错误的数据位。测试过程分两组:一组是测试飞船脚的落地打开过程;另一组是测试飞船打开后的着陆过程;前一组没有注意数据位是否被置位,因为这不是他们负责的范围。而后一个组在每次测试之前又重置计算机,清除所有的数据位。双方独立工作都很正常,但两个组没有进行集成测试。•结果:飞船坠毁软件错误失效案例千年虫•时间:20世纪90年代•背景:随着21世纪的到来,很多的计算机系统都面临着“千年虫”的危害•问题:这样就导致2000年以后的年份的记录出现问题,•如00年是指1900还是2000?•原因:20实际70年代时,由于计算机存储空间很小,并且十分昂贵,所以在计算机中记录时间采用了“偷懒”的方式,例如将1973缩减为73•结果:世界各地为了更换和升级系统,花费了上百亿的美元软件缺陷的定义软件未达到产品说明书中已经标明的功能;软件出现了产品说明书中指明不会出现的错误;软件未达到产品说明书中虽未指出但应当达到的目标;软件功能超出了产品说明书中指明的范围;软件测试人员认为软件难以理解、不易使用,或者最终用户认为该软件使用效果不良。举例:计算器内的嵌入式软件软件缺陷的示例软件未达到产品说明书标明的功能•计算器的产品说明书声称:“它能够准确无误的进行加减乘除运算”。测试人员输入“5/0”,如果没有反应或出现错误的反映,则根据上述规则,这是一个软件缺陷。软件出现了产品说明书指明不会出现的错误•说明书声称“计算器永远不会崩溃、死锁”。如果狂敲键盘会使计算器停止接受输入,那么根据第2条,这是一个缺陷。软件功能超出了产品说明书指明的范围•如果计算器产品说明书只说明了其能够完成加减乘除的运算,而在实际中发现其还可以进行平方根的运算,这是缺陷。软件缺陷的示例软件未达到产品说明书虽未指出,但应该达到的目标•对于测试人员来讲,这实际上是为了找出产品说明书中的遗漏之处。例如,在测试计算器时,发现电池没电时会导致计算不正确。说明书中可能没有提及这一点,这是缺陷软件测试人员认为软件难于理解、不易使用、运行速度慢,或者最终用户认为不好•这是一个含盖比较广的规则。测试人员往往是真正使用软件的第一人,扮演着客户的角色。如果发现有什么不对劲的地方,无论什么原因都要认定为是软件缺陷。例如,某个按钮的位置不好,界面的格局设计不符合习惯,颜色太刺眼等;缺陷的分类(1)1.轻微词语拼写错误2.中等误导或重复信息3.使人不悦被截断的名称,0.00美元账单4.影响使用有些交易没有处理5.严重丢失交易6.非常严重不正确的交易处理7.极为严重经常出现“非常严重”的错误8.无法忍受数据库破坏9.灾难性系统停机10.容易传染扩展到其它系统的系统停机缺陷的分类:根据严重程度分类缺陷的分类(2)1.输入输出缺陷2.逻辑缺陷3.计算缺陷4.接口缺陷5.数据缺陷缺陷的分类:按性质和范围分类缺陷的分类(3)缺陷的分类:按软件的生存周期分类1.问题定义(需求分析)错误在软件定义阶段,分析员研究用户的要求后所编写文档中出现的错误。换句话说,这类错误是由于问题定义不满足用户的要求而导致的错误。缺陷的分类(3)缺陷的分类:按软件的生存周期分类2.规格说明错误这类错误是指规格说明与问题定义不一致所产生的错误。它们又可以细分成:•不一致性错误:规格说明中功能说明与问题定义发生矛盾。•冗余性错误:规格说明中某些功能说明与问题定义相比是多余的。•不完整性错误:规格说明中缺少某些必要的功能说明•不可行错误:规格说明中有些功能要求是不可行的。•不可测试错误:有些功能的测试要求是不现实的。缺陷的分类(3)缺陷的分类:按软件的生存周期分类3.设计错误设计阶段产生的错误,它使系统的设计与需求规格说明中的功能说明不相符。它们又可以细分为:•设计不完全错误:某些功能没有被设计,或设计得不完全。•算法错误:算法选择不合适。主要表现为算法的基本功能不满足功能要求、算法不可行或者算法的效率不符合要求。•模块接口错误:模块结构不合理;模块与外部数据库的界面不一致,模块之间的界面不一致。•控制逻辑错误:控制流程与规格说明不一致;控制结构不合理。•数据结构错误:数据设计不合理;与算法不匹配;数据结构不满足规格说明要求缺陷的分类(3)缺陷的分类:按软件的生存周期分类4.编码错误多种多样,大体归为以下几种:•数据说明错、数据使用错、计算错、比较错、控制流错、界面错、输入/输出错,及其它的错误在不同的开发阶段,错误的类型和表现形式不同,故应采用不同的方法和策略来进行检测。软件缺陷的构成软件缺陷修复的代价软件在从计划、编制、测试、一直到交付用户公开使用的过程中,都有可能产生和发现缺陷。随着整个开发过程的时间推移,修复软件的费用呈几何级数的增长。下图是软件缺陷在不同阶段发现时修改的费用示意图课程内容软件测试的背景软件测试概述软件测试技术软件测试方法软件测试模型软件测试过程软件测试人员例子软件测试的发展软件测试发展史上的几个重要事件•1972年6月,首次软件测试会议•1972年6月,BillHetzel(代表论著《TheCompleteGuidetoSoftwareTesting》)在美国的北卡罗来纳(NorthCarolina)大学组织了首次以软件测试为主题的会议。•1973年,BillHetzel定义软件测试概念,就是建立一种信心,认为程序能够按预期的设想运行。•1983年,BillHetzel将定义修订为:评价一个程序和系统的特性或能力,并确定它是否达到预期的结果。软件测试就是以此为目的的任何行为。他还把软件的质量定义为“符合要求软件测试的发展软件测试发展史上的几个重要事件(续)•1979年,GlenfordMyers:《TheArtofSoftwareTesting》出版。这本书是软件测试方面的圣经。Myers定义及诠释的测试方法论已成为软件测试的基本模块。提出测试的目的是证伪。•1983、1990年,IEEE/ANSI标准定义软件测试概念。1990年的IEEE/ANSI标准将软件测试进行了这样的定义:在既定的状况条件下,运行一个系统或组建,观察记录结果,并对其某些方面进行评价的过程。这里所谓“既定的状况”可理解为需求或设计。软件测试的发展软件测试发展史上的几个重要事件(续)•1996年提出:测试能力成熟度TCMM(TestingCapabilityMaturityModel)、测试支持度TSM(TestingSupportModel)、测试成熟度(TestingMaturityModel)。软件测试的发展软件测试发展趋势•测试与质量保证体系的融合•测试方法越来越细分,如网站测试、安全性测试等•测试技术不断发展•软件验证技术方面•软件静态测试方面•测试用例的选择方面•自动化测试方面•测试走向专业化道路SoftwareEngineering什么是软件测试广义的概念•指软件生存周期中所有的检查、评审和确认工作,其中包括了对分析、设计阶段,以及完成开发后维护阶段的各类文档、代码的审查和确认狭义概念•识别软件缺陷的过程,即实际结果与预期结果的不一致SoftwareEngineering什么是软件测试软件测试通常包括验证(verification)和确认(validation):-验证指保证软件正确的实现了某一特定功能的一系列活动(功能性)-确认指的是保证软件的实现满足了用户需求的一系列活动(实用性)SoftwareEngineering什么是软件测试软件的质量与可靠性:-可靠性:运行稳定、满足客户需求-质量:功能强度、可靠性、性能、客服以及性价比等-可靠性和功能,哪一个更重要?SoftwareEngineering什么是软件测试软件的测试(Testing)与质量保证(QualityAssurance,QA):-软件测试:尽可能找到软件缺陷,并确保缺陷得以修复-软件质量保证:创建和执行改进软件开发过程并防止软件缺陷发生的标准和方法-?QA和QC的异同点?SoftwareEngineering软件测试的目的测试的目的就是发现软件中的各种缺陷测试只能证明软件存在缺陷,不能证明软件不存在缺陷测试可以使软件中缺陷降低到一定程度,而不是彻底消灭以较少的用例、时间和人力找出软件中的各种错误和缺陷,以确保软件的质量以更少的支出(需求变更、维护、客服等成本)来谋取收入支出比达到最大化。SoftwareEngineering软件测试的原则软件开发者的座右铭:“尽早地和不断地进行软件测试”。测试用例应由测试输入和与之对应的预期输出结果两部分组成。妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。Good-enough:一种权衡投入/产出比的原则:选择测试保证测试的覆盖程度,但穷举测试是不可能的:有限测试所有的测试都应追溯到用户需求测试的规模由小而大,从单元测试到系统测试为了尽可能地发现错误,应该由独立的第三方来测试不能为了便于测试擅自修改程序既应该测试软件该做什么也应该测试软件不该做什么SoftwareEngineering软件测试的原则充分注意测试中的群集现象。经验表明,测试后程序残存的错误数目与该程序中以发现的错误数目或检错率成正比。应该对错误群集的程序段进行重点测试。其中的原因是:编写该段程序时,•程序员情绪不佳、心情不好;•程序员往往犯同样的错误;•某些软件缺陷实乃冰山一角。SoftwareEngineering软件测试的原则严格执行测试计划,排除测试的随意性。测试计划应包括:所测软件的功能,输入和输出,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制