面向对象的软件测试.docx
《面向对象的软件测试.docx》由会员分享,可在线阅读,更多相关《面向对象的软件测试.docx(13页珍藏版)》请在冰豆网上搜索。
![面向对象的软件测试.docx](https://file1.bdocx.com/fileroot1/2022-11/27/b9470675-05f0-4f7e-a8f7-178dc66e1f6c/b9470675-05f0-4f7e-a8f7-178dc66e1f6c1.gif)
面向对象的软件测试
粘晁匕§
本科生课程论文…文献综述
题目:
面向对彖的软件测试
姓名:
学号:
学院:
软件学院
专业:
软件工程
年级:
2010
教师:
王灿辉
2013年05月20日
面向对象的软件测试
摘要:
软件测试在整个软件项目开发过程中有着举足轻重的地位,测试技术的发展对于缩短测试周期、降低成本、提高质量都有着十分重要的意义。
本文介绍了软件测试的关键技术,并对面向对象软件测试技术进行了简单的研究,讨论了面向对象软件测试的测试策略、方法及测试技术。
随着软件产业的发展,市场对软件质量的不断提高,软件测试不断受到重视。
儿乎每个中大型IT企业的产品在发布前都需要大量的质量控制、测试和文档工作。
软件测试的重要性已成为企业生存与发展的核心。
关键词:
软件质量性能测试软件测试面向对象
1软件测试的概念
1.1什么是软件测试
软件测试就是在软件投入运行之前,对软件需求分析、设计规格说明和编码实现的最终审查,他是软件质量保证的关键步骤。
通常对软件测试的定义有两种描述:
定义1:
软件测试是为了发现错误而执行程序的过程。
定义2:
软件测试是根据软件开发各阶段的规格说明和程净的内部结构而精心设计的一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例运行程序以及发现错误的过程,即执行测试步骤。
1.2软件测试的意义
软件测试的意义在于保证软件产品的最终质量,在软件开发的过程中,对软件产品进行质量控制。
一般来说软件测试应由独立的产品评测中心负责,严格按照软件测试流程,制定测试计划、测试方案、测试规范,实施测试,对测试记录进行分析,并根据回归测试情况撰写测试报告。
测试是为了证明软件有缺陷,从而加以改正,而不是保证软件没有缺陷,缺陷是软件与生俱来的。
1.3软件测试技术的发展趋势
我国的软件测试仍处于原始的初期,由于种种原因,我国的软件生产尚处于原始的“小作坊”型,离软件工程的需要,即实行工程化管理,用工业化,自动化的方法生产软件还有很大的距离。
软件测试更是属于原始时期的初期,即程序员凭自己的经验对程序进行调试。
因此,以普遍情况而言,我国目前尚无真正意义上的“测试”,这将大大影响高质量软件产品的推出和软件产业的形成。
国外的软件测试,自从上世纪90年代末出现软件工程以来,软件测试工程作为一个专门的领域得到了发展。
七十年代开始,软件测试职业化水平明显增长。
在一些机构,己对多个测试岗位定义了工作范围和目标,“测试经理”、“主测人员”、“测试分析员”和“测试技术员”已成为公认的名称。
但是,只在少数公司内软件测试成为正式职业;在大多数公司,测试是由其他专业的人员兼职。
测试工作者仍在争取与软件开发工作者有同等地位。
2面向对象方法及对测试的影响
2.1、面向对象简介
面向对象方法是一种把面向对象的思想应用于软件开发过程,指导开发活动的系统方法,简称00方法。
它是建立在“对象”概念基础上的方法学。
对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。
所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,來认识、理解、刻画客观世界和设计、构建相应的软件系统。
2.2、面向对象方法对测试的影响
(一)信息隐蔽对测试的影响。
面向对象的软件系统在运行时刻由一组协调工作的对象组成,对象具有一定的状态,所以对面向对象的程序测试来说,对象的状态是必须考虑的因素,测试应涉及对象的初态、输入参数、输出参数和对象的终态。
对象只有在接收有关信息后才被激活来进行所请求的操作,并将结果返回给发送者。
在工作过程中对象的状态可能被修改,产生新的状态,面向对象软件测试的基本工作就是创建对象,向对象发送一系列消息然后检查结果对象的状态看其是否处于正确的状态。
问题是对象的状态往往是隐蔽的,若类中未提供足够的存取函数來表明对象的实现方式和内部状态,则测试者必须增添这样的函数。
因此,类的信息隐蔽机制给测试带来了困难。
(二)封装性对测试的影响。
为了检查私有和保护属性的函数和数据,测试时要在原来的类的定义中增加一些专用函数来访问这些成员。
而且,测试应考虑到对象的初态、输入、输出和对象的终态,面向对象的封装性使对象状态的观察、测试用例选取、测试点的确定等带来困难。
(三)继承性对测试的影响。
继承使父类的属性和操作可以通过实例化产生的子类和对象所继承。
子类不但继承了父类的特征,还能对其进行重定义。
因此,继承的方法和重定义的方法在子类的环境中都要重新测试。
一般情况下分为单继承、多重继承和重复继承,多重继承和重复继承会出现在多个父类中重名的变量和函数的情况,容易引起混乱,同时使子类的复杂性显著提高,出现隐含错误的可能性大大增加,因此在实际中不提倡这种用法。
(四)多态性对测试的影响。
重载是多态的一种常见形式,它允许儿个函数有相同的名字,而所带的参数类型不同。
它使得系统在运行时能自动为给定的消息选择合适的实现代码,但它所带来的不确定性,也使得传统测试实践中的静态分析法遇到了不可逾越的障碍。
而且它们也增加了系统运行中可能的执行路径,加大了测试用例的选取难度和数量。
这种不确定性和骤然增加的路径组合给测试覆盖率的满足带来了挑战。
3软件测试的内容及测试过程
3.1软件测试的内容
软件测试主要匚作内容是验证(Verification)和确认(Validation),下面分别给出其概念:
验证(Verification)是保证软件正确地实现了一些特定功能的一系列活动,即保证软件做了你所期望的事情。
(Dotherightthing)
1、确定软件生存周期中的一个给定阶段的产品是否达到前阶段确立的需求的过程;
2、程序正确性的形式证明,即采用形式理论证明程序符合设计规约规定的过程;
3、评市、审查、测试、检查、审计等各类活动,或对某些项处理、服务或文件等是否和规定的需求相一致进行判断和提出报告。
确认(Validation)是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。
即保证软件以正确的方式來做了这个事件(D。
itright)
1、静态确认,不在计算机上实际执行程序,通过人工或程序分析来证明软件的正确性;
2、动态确认,通过执行程序做分析,测试程序的动态行为,以证实软件是否存在问题。
软件测试的对象不仅仅是程序测试,软件测试应该包括整个软件开发期间各个阶段所产生的文档,如需求规格说明、概要设计文档、详细设计文档,当然软件测试的主要对象还是源程序。
3.2软件测试的测试过程
软件测试过程按测试的先后顺序可分为单元测试、集成测试、确认(有效性)测试、系统测试、验收(用户)测试。
1、单元测试:
软件单元测试是检验程序的最小单位,即检查模块有无错误,它是在编码完成后必须进行的测试工作。
单元测试一般由程序开发者完成,因而单元测试大多是从程序内部结构出发设计测试用例,即采用白盒测试方法,当有多个程序模块时,可并行独立开展测试工作。
2、集成测试:
在将所有的单元经过测试以后,接着进行集成测试。
集成测试也称综合测试,即将已分别通过测试的单元按要求组合起来再进行的测试,以检查这些单元之间的接口是否存在问题。
要求参与的人熟悉单元的内部细节,又要求他们能够从足够高的层次上观察整个系统。
集成测试阶段是以黑盒法为主,在自底向上集成的早期,白盒法测试占一定的比例,随着集成测试的不断深入,这种比例在测试过程中将越来越少,渐渐地,黑盒法测试占据主导地位。
3、确认测试:
在集成测试完成之后,分散开发的各个模块将连接起来,从而构成完整的程序。
其中各个模块之间的接口存在的各种错误都已消除,此时可以进行系统工作的最后部分,即确认测试。
确认测试是检验所开发的软件是否能按用户提出的要求进行。
若能达到这一要求,则认为开发的软件是合格的。
确认测试也称为合格测试。
4、系统测试:
软件在计算机系统当中是重要的组成部分,因此,在软件开发完成之后,最终还要和系统中的其他部分,比如硬件系统、数据信息集成起来,在投入运行以前要完成系统测试,以保证各组成部分不仅能单独的得到检验,而且在系统各部分协调工作的环境下也能正常工作。
尽管每一个检验有特定的目标,然而,所有的检验工作都要验证系统中每个部分均已得到正确的集成,并完成制定的功能。
系统测试要进行的儿种必要测试:
恢复测试、安全测试、强度测试、性能测试、正确性测试、可靠性测试、兼容性测试。
5、验收测试:
验收测试时检验软件产品质量的最后一道工序。
验收测试通常更突出客户的作用,同时软件开发人员也有一定的参与。
6、测试后的调试:
软件测试和软件调试有完全不同的意义。
测试的目的是现实错误,而调试的目的是发现错误或找出导致程序失效的错误原因,并修改程序以修正错误。
通常情况是在测试以后紧接着要进行调试,调试时测试之后的活动。
4常用的软件测试方法
4.1黑盒测试
黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。
在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。
黑盒测试着眼于程序外部结构,不考虑
内部逻辑结构,主要针对软件界面和软件功能进行测试。
黑盒测试是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。
很明显,如果外部特性本身设计有问题或规格说明的规定有误,用黑盒测试方法是发现不了的。
黑盒测试法注重于测试软件的功能需求,主要试图发现下列儿类错误:
功能不正确或遗漏;界面错误;数据库访问错误;性能错误;初始化和终止错误等。
从理论上讲,黑盒测试只有釆用穷举输入测试,把所有可能的输入都作为测试情况考虑,才能查出程序中所有的错误。
实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但可能的输入进行测试。
这样看來,完全测试是不可能的,所以我们要进行有针对性的测试,通过制定测试案例指导测试的实施,保证软件测试有组织、按步骤,以及有计划地进行。
黑盒测试行为必须能够加以量化,才能真正保证软件质量,而测试用例就是将测试行为具体量化的方法之一。
具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。
4.1.1黑盒测试的流程
1、测试计划首先,根据用户需求报告中关于功能要求和性能指标的规格说明书,定义相应的测试需求报告,即制订黑盒测试的最高标准,以后所有的测试工作都将围绕着测试需求来进行,符合测试需求的应用程序即是合格的,反之即是不合格的;同时,还要适当选择测试内容,合理安排测试人员、测试时间及测试资源等。
2、测试设计将测试计划阶段制订的测试需求分解、细化为若干个可执行的测试过程,并为每个测试过程选择适当的测试用例(测试用例选择的好坏将直接影响到测试结果的有效性)。
3、测试开发建立可重复使用的自动测试过程。
4、测试执行执行测试开发阶段建立的自动测试过程,并对所发现的缺陷进行跟踪管理。
测试执行一般由单元测试、组合测试、集成测试、系统联调及回归测试等步骤组成,测试人员应本着科学负责的态度,一步一个脚印地进行测试。
5、测试评估结合量化的测试覆盖域及缺陷跟踪报告,对于应用软件的质量和开发团队的工作进度及工作效率进行综合评价。
4.1.2黑盒测试用例设计方法简介
任等价类划分的办法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。
每一类的代表性数据在测试中的作用等价于这一类中的其他值。
该方法是一种重要的,常用的黑盒测试用例设计方法。
1、划分等价类:
等价类是指某个输入域的子集合。
在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:
测试某等价类的代表值就等于对这一类其它值的测试。
因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据•取得较好的测试结果.等价类划分可有两种不同的情况:
有效等价类和无效等价类。
有效等价类:
是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合。
利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
无效等价类:
与有效等价类的定义恰巧相反。
设计测试用例时,要同时考虑这两种等价类。
因为,软件不仅要能接收合理的数据,也要能经受意外的考验.这样的测试才能确保软件具有更高的可靠性。
2、划分等价类的方法:
下面给出六条确定等价类的原则。
1在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。
2在输入条件规定了输入值的集合或考规定了“必须如何”的条件的情况下,可确立一个有效等价类和一个无效等价类。
3在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。
4在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。
5在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
6在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。
3、设计测试用例:
在确立了等价类后,可建立等价类表,列出所有划分出的等价类:
输入条件,有效等价类,无效等价类.然后从划分出的等价类中按以下三个原则设计测试用例:
1为每一个等价类规定一个唯一的编号。
2设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步。
直到所有的有效等价类都被覆盖为止。
3设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步。
直到所有的无效等价类都被覆盖为止。
这里用等价类划分法为例简单介绍了一下黑盒测试用例的设计方法,其他方法就不再做具体介绍。
4.2白盒测试
白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。
这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程丿子的状态,确定实际的状态是否与预期的状态一致。
白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。
白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。
其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
六种覆盖标准:
语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。
语句覆盖每条语句至少执行一次。
判定覆盖每个判定的每个分支至少执行一次。
条件覆盖每个判定的每个条件应取到各种可能的值。
判定/条件覆盖同时满足判定覆盖条件覆盖。
条件组合覆盖每个判定中各条件的每一种组合至少出现一次。
路径覆盖使程序中每一条可能的路径至少执行一次。
“白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。
"白盒”法是穷举路径测试。
在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。
贯穿程序的独立路径数是天文数字。
但即使每条路径都测试了仍然可能有错误。
第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。
第二,穷举路径测试不可能查出程序中因遗漏路径而出错。
第三,穷举路径测试可能发现不了一些与数据相关的错误。
4.2.1白盒测试之基本路经测试法
白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。
其中运用最为广泛的是基本路径测试法。
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。
设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。
在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。
包括以下4个步骤和一个工具方法:
1.程序的控制流图:
描述程序控制流的一种图示方法。
2.程序圈复杂度:
McCabe复杂性度量。
从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
3.导出测试用例:
根据圈复杂度和程序结构设计用例数据输入和预期结果。
4.准备测试用例:
确保基本路径集中的每一条路径的执行。
工具方法:
图形矩阵:
是在基本路径测试中起辅助作用的软件工具,利用它可以实现白动地确定一个基本路径集。
程序的控制流图:
描述程序控制流的一种图示方法。
圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句
頫序結构—IF选择结构―While循环纯櫛CASE多分支结构“
Until循环结构"
流图只有二种图形符号:
图中的每一个圆称为流图的结点,代表一条或多条语句。
流图中的箭头称为边或连接,代表控制流,任何过程设计都要被翻译成控制流图。
在将程序流程图简化成控制流图时,应注意:
在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。
边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。
如下页图所示
如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)
连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。
第一步:
画出控制流图
流程图用来描述程序控制结构。
可将流程图映射到一个相应的流图(假设流程图的菱形决定框中不包含复合条件)。
在流图中,每一个圆,称为流图的结点,代表一个或多个语句。
一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。
一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:
if-else-then结构)。
由边和结点限定的范围称为区域。
计算区域时应包括图外部的范围。
例「有下面餉C函数,用基本路径测试法进斤测疾
嘶丄融工(ilUj陽加如加OXilYPejf
画出其程序流程图和对应的控制流图如下
第二步:
计算圈复杂度
圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。
独立路径必须包含一条在定义之前不曾用到的边。
有以下三种方法计算圈复杂度:
流图中区域的数量对应于环型的复杂性;
给定流图G的圈复杂度V(G),定义为V(G)二E-N+2,E是流图中边的数量,N是流图中结点的数量;
给定流图G的圈复杂度V(G),定义为V(G)二P+1,P是流图G中判定结点的数量。
第三步:
导出测试用例
根据上面的计算方法,可得出四个独立的路径。
(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。
V(G)值正好等于该程序的独立路径的条数。
)
路径1:
4~14
路径2:
4-6-7-14
路径3:
4-6-8-10-13-4-14
路径4:
4-6-8-11-13-4-14
根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。
第四步:
准备测试用例
为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是:
4.3、方法测试
方法测试主要考察封装在类中的一个方法对数据进行的操作,它与传统的单元模块测试相对应,可以将传统成熟的单元测试方法。
但是,方法与数据一起被封装在类中,并通过向所在对象发送消息來驱动,它的执行与对象状态有关,也有可能会改变对象的状态。
因此,设计测试用例时要考虑设路对象的初态,使它收到消息时执行指定的路径。
4.4、类测试
类测试与传统面向过程软件测试中的单元测试相似,在面向对象的软件系统中,软件系统的基本组成部分是类和对象,它将数据和对数据进行操作的方法封装在一起,每一个对象都有自己的生命周期和自己的状态,在软件运行过程中,对象的状态还会被改变,产生新的状态,而在不同的状态下,对象对消息的处理方法可能不同,所以在测试过程中还要将对象的状态考虑在内。
因此类测试可以分为以下两部分:
(1)基于状态的测试考察类的实例在其生命期各个状态下的情况。
这类方法的优势是可以充分借鉴成熟的有限状态白动机理论,但执行起来还很困难。
一是状态空间可能太大,二是很难对一些类建立起状态模型,没有一种好的规则来识别对象状态及其状态转换,三是可能缺乏对被测对象的控制和观察机制的支持。
(2)基于响应状态的测试从类和对象的责任出发,以外界向对象发送特定的消息序列来测试对象。
较有影响的是基于规约的测试方法,和基于程序的测试。
基于规约的测试往往可以根据规约自动或半动地生成测试用例,但未必能提供足够的代码覆盖率。
基于程序的测试大都是在传统的基于程序的测试技术的推广,有一定的实用性但方法过于复杂且效率不高。
4.5、类簇测试
类簇是一组相互有影响的类的集合。
类簇测试主要考察这些类之间的相互作用,是系统集成测试的子阶段。
在单个类分别进行测试后,根据系统中类的层次关系图,将相互有影响的类作为一个整体,检查各相关类之间消息架接的合法性、子类的继承与父类的一致性、动态绑定执行的正确性、类簇协同完成系统功能的正确性等等。
其测试用例可由多种方案结合生成。
如根据类的继承关系图来纵向测试类,同时又根据对象之间方法的相互作用来横向测试类的关系。
4.6、系统测试
系统测试是对所有程序和外部成员构成的整个系统进行整体测试通过方法测试、类测试和类簇测试,可以保证软件的功能得以实现.但不能保证在实际运行时,它能否满足用户的需要.需要进一步测试它与系统其他部分(软件和硬件资源)相结合的情况,能否相互配合正常工作,另外,还包括了确认测试内容,以验证软
件系统的正确性和性能指标等是否满足需求规格说明书所制定的要求。
它与传统的系统测试一样,包括功能测试、强度测试、性能测试、安全测试等,可套用传统的系统测试方法。
在集成测试或系统测试中,可能发现独立测试没有发现的错误。
它体现的测试内容具体包括如下儿种:
功能测试:
测试是否满足开发要求,是否能够提供设计所描述的功能,是否用户的需求都得到满足。
功能测试是系统测试最常用和必须的测试,通常还会以正式的软件说明书为测试标准。
强度测试:
测试系统的能力最高实际限度,即软件在一些超负荷的情况,功能实现情况。
如要求软件某一行为的大量重复、输入大量的数据或大数值数据、对数据库大量复杂的查询等。
性能测试:
测试软件的运行性能。
这种测试常常与强度测试结合进行,需要事先对被测软件提出性能指标,如传输连接的最长时限、传输的错误率、计算的精度、记录的精度、响应的时限和恢复时限等。
安全测试:
验证安装在系统内的保护机构确实能够对系统进行保护,使之不受各种非常的干扰。
安全测试时需要设计一些测试用例试图突破系统的安全保密措施,检验系统是否有安全保密的漏洞。
恢复测试:
采用人工的干扰使软