软件工程第7章软件测试.ppt
《软件工程第7章软件测试.ppt》由会员分享,可在线阅读,更多相关《软件工程第7章软件测试.ppt(97页珍藏版)》请在三一办公上搜索。
1、第7章 软件测试,内容提要,7.1 软件测试概述7.2 软件测试用例的设计7.3 软件测试的实施7.4 软件测试的面向对象方法简述7.5 本章小结,软件测试,软件系统的开发体现了人们智力劳动的成果。在软件开发过程中,由于人的主观认知能力的局限性和所开发软件的复杂性,尽管人们利用了许多旨在改进、保证软件质量的方法去分析、设计和实现软件,在软件生命周期的每个阶段还是不可避免地会产生错误。因此,在软件正式投入运行之前,必须通过严格的测试,来发现并纠正软件中的错误,从而保证软件的质量。大量的实践证明,测试是一项很艰苦的工作,据统计,软件测试的工作量往往占软件开发总工作量的40%以上。目前,程序的正确性
2、证明在技术上尚未得到根本的解决,软件测试仍然是发现软件中错误和缺陷的主要手段。因此,必须高度重视软件测试工作。,软件测试,软件测试是软件质量保证的关键步骤,它包括分析、设计和编码的最终检查。软件测试的结果也是分析软件可靠性的重要依据。本章着重讨论软件测试的概念、传统软件和面向对象软件的测试问题。,7.1 软件测试概述,软件测试概述,7.1.1 软件测试的目标及原则 测试是对软件分析、设计、编码进行查错和纠错的活动。正确理解软件测试的概念和目标,对保证软件测试的成功实施起着极其重要的作用。从表面上来看,软件测试是具有“破坏”性质的,因为在测试阶段,测试人员努力设计出一系列测试方案,竭力发现和证明
3、程序中错误的存在。而软件工程的其他阶段都是“建设性”的,软件工程师力图从抽象的概念出发,逐步设计出软件蓝图,再经过编码而实现软件产品。当然,这种反常仅仅是表面的或是心理上的,暴露问题并不是软件测试的最终目的,发现问题是为了改进软件设计或纠正程序的错误。测试阶段的根本目标是尽可能多地发现并排除软件中潜在的错误,最终把一个高质量的软件系统交给用户使用。,软件测试概述,以下三点可以看作是测试的目标:1.测试是为了发现程序中的错误而执行程序的过程。2.好的测试方案是尽可能发现至今为止尚未被发现的错误的测试方案。3.成功的测试是发现了至今为止尚未被发现的错误的测试。由此可以看出,测试的正确含义是“为了发
4、现程序中的错误而执行程序的过程”。这和某些人想像的“测试是为了证明程序是正确的”,“成功的测试是没有发现错误的测试”等是完全相反的。明确测试的目的是一件非常重要的事情,因为在实际工作中对测试工作存在着许多模糊或错误的看法,这些看法严重影响着测试工作的顺利进行。测试的目标决定了测试方案的设计,如果为了表明程序是正确的,就会设计一些不易暴露错误的测试方案。相反,如果测试是为了发现程序中的错误,就会力求设计出最容易暴露错误的测试方案。,软件测试概述,基于以上的叙述,在设计软件测试方案前,软件开发者必须理解软件测试的基本原则。这些测试原则是:(1)坚持“尽早地和不断地进行软件测试”的原则。不应把软件测
5、试仅仅看作是软件开发的一个独立阶段,而应当把它贯穿到软件开发的各个阶段中。坚持软件开发的各个阶段的技术评审,这样才能在开发过程中尽早发现和预防错误,把出现的错误克服在早期,杜绝某些错误发生的隐患。,软件测试概述,(2)测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。测试以前应当根据测试的要求选择测试用例,用来检验程序员编制的程序,因此不但需要测试的输入数据,而且需要针对这些输入数据的预期输出结果。(3)程序员应避免测试自己的程序。由于思维定势和心理因素的影响,程序员并不是测试的最佳人选。这不能与程序的调试相混淆,调试由程序员自己来做可能更有效。而程序员以及程序开发小组应尽可能避免
6、测试自己编写的程序。为了达到最佳效果,最好建立独立的软件测试小组或测试机构。(4)在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。,软件测试概述,(5)充分注意测试中的群集现象。软件测试的实践表明:测试后模块中残存的错误数目与该模块的错误检出率成正比,即错误群集。根据这个规律,应当对发现错误较多的模块进行重点测试,以提高测试效率。(6)严格执行测试计划,排除测试的随意性。(7)应当对每个测试结果做全面检查。有些错误的征兆在输出测试结果时已经明显地出现了,但是如果不仔细地、全面地检查测试结果,就会使这些错误被遗漏掉。所以必须对预期的输出结果明确定义,对测试的结果仔细分析检查,暴露错误
7、。(8)妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。,软件测试概述,7.1.2 软件错误产生的原因及分类 软件开发是一项极其复杂的智力活动,由于主观认知能力的局限性和所解决问题的复杂性,在表达、理解、验证用户需求,软件设计以及程序编写的过程中,都不可避免地会出现各式各样的错误,这些错误贯穿在软件生命周期的各个阶段。由于人们对错误有不同的理解和认识,基于不同的角度,有着不同的错误分类方法,所以目前还没有一个统一的错误分类方法。下面分别从错误的影响和后果、错误的性质和范围、错误产生的阶段作简单介绍。,软件测试概述,1.按错误的影响和后果分类(1)较小错误:只对系统的输出有一
8、些非实质性影响。例如,输出的数据格式不符合要求等。(2)中等错误:对系统的运行有局部影响。如输出的某些数据有错误或出现冗余。(3)较严重错误:系统的行为因错误的干扰而出现异常现象。例如,错误的输入数据。(4)严重错误:系统运行不可跟踪,一时不能掌握其规律,时好时坏。(5)非常严重的错误:系统运行中突然停机,其原因不明,无法软启动。(6)最严重的错误:系统运行导致运行环境破坏,或是造成事故,引起生命、财产的损失。,软件测试概述,2.按错误的性质和范围分类(1)功能性错误 规格说明错误:规格说明可能不完全,有二义性或自相矛盾。功能错误:程序实现的功能与用户的要求不一致。测试错误:软件测试的设计与实
9、施发生错误,软件测试自身也可能发生错误。测试标准引起的错误:若测试标准太复杂,则导致测试过程出错的可能性就大。,软件测试概述,(2)系统错误 硬件接口错误:软件运行相关的外部设备错误,导致系统运行故障。软件接口错误:数据输入.输出格式错误,软件通信协议错误等。操作系统错误:非法使用访问操作系统指令,访问指令错误。硬件结构错误:非法访问硬件指令。软件结构错误:软件体系结构设计不合理,导致负载较高时,系统运行不正常。控制与顺序错误:不合理的控制流程,导致某路径永远不能执行。资源管理错误:多任务环境中,由于资源共享,资源管理不当,导致系统死锁。,软件测试概述,(3)加工错误 算术与操作错误。初始化错
10、误。控制和次序错误。静态逻辑错误。,软件测试概述,(4)数据错误 动态数据错误。静态数据错误。数据内容错误。数据结构错误。数据属性错误。,软件测试概述,(5)代码错误 主要包括语法错误、打字错误、对语句或指令的不正确理解所产生的错误。,软件测试概述,3.按软件生命周期阶段分类(1)需求分析错误 这类错误主要是指在理解和表达需求时产生的错误。不一致性错误:规格说明中功能说明与需求发生矛盾。冗余性错误:规格说明中的某些功能是多余的。不完整性错误:规格说明中缺少某些必要的功能说明。不可行错误:规格说明中有些功能要求是不可行的。不可测试错误:有些功能的测试要求是不现实的。,软件测试概述,(2)设计错误
11、 这类错误主要是指在设计阶段产生的与需求规格说明中的功能说明不相符的错误。设计不完全错误:某些功能没有被设计,或设计得不完全。模块接口错误:模块结构不合理,模块与外部数据库以及模块之间的界面不一致。控制逻辑错误:控制流程与规格说明不一致,控制结构不合理。算法错误:算法选择不合适。数据结构错误:数据设计不合理,与算法不匹配,数据结构不满足规格说明要求。,软件测试概述,(3)编码错误 数据说明、数据使用错误。计算错、比较错。控制流错误。界面错误。输入、输出错误。其他错误。在不同的开发阶段,错误的表现形式是不同的,故应当采用不同的方法和策略来进行测试。,软件测试概述,7.1.3 软件测试的过程和策略
12、 软件测试实践表明,软件测试是一项极其复杂而又繁重的重要工作,是保证软件质量的重要环节。软件测试的成功与否与软件测试人员的经验、知识、能力以及管理水平有关。软件测试还需遵循正确的测试过程,掌握科学的测试方法以及在测试过程中实施合理的测试策略。软件测试既是一门工程艺术,也是一种科学方法。,软件测试概述,1.软件测试的流程 软件测试是一项极其复杂的工作,它是一系列测试活动的集合,必须按照一定的测试流程,才能发现更多的错误。软件测试流程包括设计测试方案,实施测试,纠正错误,分析测试数据、建立可靠性模型等几个步骤,如图7.1所示。,软件测试概述,图7.1 软件测试的流程,软件测试概述,2.软件测试的信
13、息流 软件测试过程中,需要3类测试信息流,如图7.2所示。图7.2 软件测试的信息流,软件测试概述,测试信息流:(1)软件配置:包括软件需求规格说明、软件设计规格说明、源代码等。(2)测试配置:包括测试计划、测试用例、测试驱动程序等。(3)测试工具:测试工具为测试的实施提供某种服务。,软件测试概述,测试之后,用测试结果与预期结果进行比较。如发现不一致的数据,就要进行纠正。对已经发现的错误进行错误定位并确定出错性质,然后纠正这些错误,同时修改相关的文档。修改后的文档一般都要经过再次测试,直到通过测试为止。通过收集和分析测试结果数据,对软件建立可靠性模型。如果测试发现不了错误,那么可以肯定测试配置
14、考虑得不够细致充分,错误仍然潜伏在软件中。这些错误最终只能由用户在使用中发现,并在维护时由开发者去改正。但在那时改正错误的费用将比在开发阶段改正错误的费用要高出若干倍。,软件测试概述,3.测试的过程 图7.3描述了测试的过程。从图中可知,测试过程分为4个步骤,即单元测试、组装测试、确认测试和系统测试。图7.3 测试的过程,软件测试概述,首先是单元测试,根据设计的测试用例,对每个程序模块进行测试,检查每个程序模块是否正确实现了规定的功能。然后,把测试过的模块,通过组装技术,测试软件的体系结构以及实现的功能是否符合设计说明的要求。确认测试是要检查已经实现的软件能否满足需求说明规定的用户需求以及软件
15、配置是否完全、正确。最后是系统测试,把经过确认的软件纳入实际的运行环境,与应用环境组合在一起进行测试,以检查软件能否正确、稳定地运行。测试的每个过程,都可以采用灵活的测试方法和测试策略,通常在单元测试中采用白盒测试方法,而在组装测试中采用黑盒测试方法。,7.2 软件测试用例的设计,软件测试用例的设计,7.2.1 软件测试用例和对象设计 要进行测试,除了要有测试数据外,还应同时给出该组测试数据应该得到怎样的输出结果,我们称它为预期结果。在测试时将实际输出结果与预期结果比较,若不同则表示发现了错误。因此测试用例是由测试数据和预期结果组成的。测试的目的是为了发现软件中的错误,而且发现的错误越多越好,
16、那么是否可以把软件中隐藏的错误全部找出来呢?或者说能不能把所有可能做的测试毫无遗漏地一一做完,也就是说经过穷举测试,从而找出所有的错误呢?,软件测试用例的设计,假定一个简单程序P有输入量X和Y及输出量Z,见图7.4。在字长为32位的计算机上运行。如果X和Y只取整数,考虑把所有的X,Y值都作为测试数据,这样可能的测试数据的最大数目是 232*232=264 如果程序P测试一组数据X,Y需要1毫秒,并假定一天工作24小时,一年工作365天,要完成264 组数据测试,需要5亿年。,图7.4黑盒测试,软件测试用例的设计,以上分析表明,即使对一个算法明确的简单程序,实行穷举测试在实际上也是不可能的。因此
17、,为了节省时间和资源,提高测试效率,就必须精心设计测试用例,也就是要从数量极大的可用测试用例中精心地选择尽量少的测试数据,使采用这些测试数据能够达到最佳的测试效果,或者说它们能够高效率地把隐藏的错误暴露出来。以上事实说明,软件测试有一个致命的缺陷,即测试的不完全、不彻底性。由于任何程序只能进行少量的有限测试,所以在发现错误时,能够说明程序有错误,在未发现错误时,也不能说明程序中没有错误,这点是必须要明确的。,软件测试用例的设计,7.2.2 黑盒测试法 黑盒测试是把程序看成是一个不透明的“黑盒子”,测试时完全不考虑程序的内部结构和处理过程,只按照规格说明书所规定的功能来设计测试用例,也就是检查程
18、序是否符合它的功能要求。黑盒测试是在程序接口上进行的测试,又称为功能测试。常用的黑盒测试技术有等价类划分、边界值分析、错误推断法等。,软件测试用例的设计,1.等价类划分 等价类划分是用黑盒设计测试方案的一种技术。前面讲过,穷尽的黑盒测试需要使用所有有效的和无效的输入数据来测试程序,通常这是不现实的。因此,只能选取少量最具有代表性的输入数据,目的是要用较小的代价暴露出较多的程序错误。如果把所有可能的数据(有效的和无效的)划分成若干个等价类,则可以做出下述假定:每个类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同。因此,可以从每个等价类中只取一组数据作为测试数据。这样选取的测试数据最具
19、有代表性,最有可能发现程序中的错误。,软件测试用例的设计,使用等价类划分方法设计测试方案首先需要划分输入数据的等价类,为此需要研究程序的功能说明,从而确定输入数据的有效等价类和无效等价类。在确定输入数据的等价类时常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据等价类。,软件测试用例的设计,为了正确划分等价类,一是要注意积累经验,二是要正确分析被测程序的功能。此外,在划分无效的等价类时还必须考虑编译程序的检错功能,一般来说,不需要设计测试数据用来暴露编译程序肯定能发现的错误。最后说明一点,上面列出的启发式规则虽然都是针对输入数据说的,但是其中绝大部分也同样适用于输出数据
20、。,软件测试用例的设计,划分出等价类以后,根据等价类设计测试方案时主要使用下面两个步骤:(1)设计一个新的测试方案,以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止。(2)设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。注意:通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试方案只覆盖一个无效的等价类。,软件测试用例的设计,2.边界值分析 经验表明,处理边界情况时程序最容易发生错误。例如,许多程序错误出现在下标、数据结构和循环等的边界附近。因此,设计使程序运行在边界情况附近
21、的测试方案,暴露出程序错误的可能性更大一些。使用边界值分析方法设计测试方案首先应该确定边界情况,这需要经验和创造性,通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。按照边界值分析方法,应该选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值和任意值作为测试数据。设计测试方案时总是结合使用等价类划分和边界值分析两种技术。,软件测试用例的设计,3.错误推断法 使用边界值分析和等价类划分技术,可以帮助我们设计出具有代表性的,因而也就容易暴露程序错误的测试方案。但是,不同类型不同特点的程序通常又有一些特殊的容易出错的情况。此外,有时分别使用每组测
22、试数据时程序都能正常工作,但这些输入数据的组合却可能检测出程序的错误。一般说来,即使是一个比较小的程序,可能的输入组合数也十分巨大,因此必须依靠测试人员的经验和直觉,从各种可能的测试方案中选出一些最可能引起程序出错的方案。推测程序中可能存在错误的类型,是挑选测试方案所依据的一个重要因素。,软件测试用例的设计,错误推断法在很大程度上靠直觉和经验进行,它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案。对于程序中容易出错的情况也有一些经验总结出来,例如,输入数据为零或输出数据为零往往容易发生错误;如果输入或输出的数目允许变化(例如,被检索的或生成的表的项数),
23、则输入或输出的数目为0和1的情况(例如,表为空或只有一项)是容易出错的情况。此外还应该仔细分析程序规格说明书,注意找出其中遗漏或省略的部分,以便设计相应的测试方案,检测程序员对这部分的处理是否正确。,软件测试用例的设计,等价类划分方法和边界值分析方法都只是孤立地考虑各个输入数据的测试功效,而没有考虑多个输入数据的组合效应,这样可能会遗漏输入数据易于出错的组合情况。利用判定表或判定树是选择输入组合的一条有效途径,列出输入数据各种组合与程序应做的动作(即相应的输出结果)之间的对应关系,然后为判定表的每一列至少设计一个测试用例。,软件测试用例的设计,选择输入组合的另一条有效途径是把计算机测试和人工检
24、查代码结合起来。例如,通过代码检查,发现程序中两个模块使用并修改某些共享的变量,如果一个模块对这些变量的修改不正确,则会引起另一个模块出错,这是程序发生错误的又一个可能原因。应该设计测试方案,在程序的一次运行中同时检测这两个模块,特别要着重检测一个模块修改了共享变量后,另一个模块能否像预期的那样正常使用这些变量。反之,如果两个模块相互独立,则没有必要测试它们的输入组合情况。,软件测试用例的设计,7.2.3 白盒测试法 白盒测试是把程序看成一个透明的盒子,测试人员完全了解程序的内部结构和处理过程,测试时是根据程序的内部逻辑来设计测试用例的,即检验程序中的每条路径是否都能按预定的要求正确工作。白盒
25、测试是在程序结构上进行的测试,所以白盒测试也称为结构测试。白盒测试常用的技术是逻辑覆盖,即考察用测试数据运行被测程序时对程序逻辑的覆盖程度。主要的覆盖标准有六种:语句覆盖、判定覆盖、条件覆盖、判定.条件覆盖、条件组合覆盖和路径覆盖。为了提高测试效率,我们希望选择最少的测试用例来满足指定的覆盖标准。,软件测试用例的设计,1.语句覆盖 为了暴露程序中的错误,至少每个语句应该执行一次。语句覆盖的含义是选择足够多的测试数据,使被测程序中每个语句至少执行一次。2.判定覆盖 判定覆盖又叫分支覆盖,它的含义是不仅每个语句必须至少执行一次,而且每个判定各种可能的结果都应该至少执行一次,也就是每个判定的各个分支
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 软件 测试
链接地址:https://www.31ppt.com/p-6434238.html