




已阅读5页,还剩66页未读, 继续免费阅读
(计算机软件与理论专业论文)面向对象类的测试方法的研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南京邮电学院学位论文独创性声明 r ,2 8 9 8 本人声明所呈交的学位论文是我个人在导师指导下进行的研究 工作及取得的研究成果。尽我所知,除了文中特别加以标注和致谢的 地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包 含为获得南京邮电学院或其它教育机构的学位或证书而使用过的材 料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了 明确的说明并表示了谢意。 研究生签名:壶j 垂日期:圭竺垒:垒 南京邮电学院学位论文使用授权声明 南京邮电学院、中国科学技术信息研究所、国家图书馆有权保留 本人所送交学位论文的复印件和电子文档,可以采用影印、缩印或其 他复制手段保存论文。本人电子文档的内容和纸质论文的内容相一 致。除在保密期内的保密论文外,允许论文被查阅和借阅,可以公布 ( 包括刊登) 论文的全部或部分内容。论文的公布( 包括刊登) 授权 南京邮电学院研究生部办理。 研究生签名:导师签名:日期 南京邮电学院硕士论文 摘要 面向对象技术在软件工程中的推广和使用,使得传统的结构化测试技术和方 法受到了极大的冲击。面向对象软件测试是面向对象软件开发中的不可缺少的一 环,是保证面向对象软件质量和可靠性的关键技术之一。目前面向对象软件测试 技术的研究与面向对象的分析、设计技术以及面向对象程序设计语言的研究相比 尚显得比较薄弱。为此,本文主要讨论了面向对象软件测试中关于对象类的铡试 技术和方法。 本文中我们提出了自己的面向对象类的软件测试方法,并比较了我们的方法 与其它方法的优劣。在讨论基于服务的测试技术时,我们提出了对类的源代码中 的复杂条件进行分解的块分支测试模式:在讨论基于状态的测试技术时,本文提 出了将子类状态进行展开扩充的思想,根据对象状态模型的思想提出了基于源代 码的对象状态测试模型,实现从源代码构造出与测试相关的对象状态草图。在讨 论基于响应的测试技术时,根据c s 系统的思想,本文提出了面向对象类之间交 互测试的c s 测试模式。在进行测试技术的讨论时,我们始终坚持以测试的充分 性度量指标为立足点。 我们还比较了传统软件测试与面向对象软件测试之间的差别,同时说明了传 统的软件测试覆盖度量指标在用于度量面向对象软件测试覆盖时的不足之处,并 对基于段的面向对象覆盖指标进行了改进。最后对文章所做的工作进行了总结, 并展望了下一步研究的方向。 童室坚皇堂堕堡主堡苎 a b s t r a c t s i n c et h co b j e c t o r i e n t e dt e c h n o l o g yl l a sb e e n p o p u l 撕z e da 1 1 du s e d 证s o n w a r e e n g i n e e r i n g ,t l c h 丑d i t i o n a ls t l l l c 臼m lt e s t i n gt e c h n o l o g i e sa n dm e 啦! o d sm e e tt h eb i g c h a j i e n g e o b j e c t - o r i e n t e ds o f l w a r et e s ti sa ni n d i s p e n s a b i ep a r ti no b j e c t o r i e n t e d s o m v a r ep r o g r a n l n l i n ga i l di so n eo fak c y t e c h n 0 1 0 9 yt og u a r a m e e 廿1 eq u d l i t ya 1 1 d r e l i a b i l i t yo fo b j e c t o r i e n t e ds o f t w a r e a tp r e s e n t ,廿1 er e s e a r c ho fo b j e c t o r i e n t e d s o m v a r et e s t i n gt e c l u l o l o 西e sa r ew e a k ,c o m p a r e dw i lt h eo b j e c t o r i e n t e da 1 1 a l y s i s a 1 1 d d e s i g nt e c h n o l o g ya n do b j e c t - 0 r i e n t e dp m g r a i n m i n gl a n g u a g e c o n s e q u e n t l y , t h et e c m o l o g i e sa n dm e m o d so fo b j e c t o r i e n t c dc l a s st e s ta r em a i m yd i s c u s s e di n t l l i sp a p e l w e p u tf o n v a r do u ro 、ns o f t 、v a r e 把s t 访gm e t h o d so f0 b j e c t o r i e n t e dc l a s st e s t , a n da l s oc o m p a r e 也ev i r t u eo f0 1 l rm e t h o d s 诵mo t l l e ri nt l l i sp a p i n d i s c u s s i n g 也es e n ,i c e - b a s e dt e s t i n gt e c l l i l o l o g i e s ,m eb l o c k sb r a n c ht c s 血培p a n e mi s p u t f b n v a r db yd e c o m p o s i n gt h ec o m p l i c a t e dc o n d i t i o n so f 1 ec l a s ss o u r c ec o d e s i n d i s c u s s i n gt h es t a t e - b a s e dt e s t i n gt e c h n o l o g i e s ,1 ei d e ao fe x t e n d i n gt h es t a t e so f c h i l dc l a s si sp u tf o n v a r d a c c o r d i n gt oi d e ao ft h eo b j e c ts t a t em o d e l ,t h eo b j e c t s t a t et e s t i n gm o d e li sp u tf o n a r db a s e do nt h es o l l r c ec o d e s ,w h i c hr e a l i z et o c o n s t m c tt h et e s t r e l a t e do b j e c ts t a t es k e t c h e s 矗o mt h es o u f c ec o d e s i nd i s c u s s i n g m er e s p o n s e - b a s e dt e s t i n gt c c l l i l o l o g i e s ,m ec ,st e s tp a t t e mi sp u tf b n a r di nt h e i n t e r a c tt e s to fo b j e c t o r i e m e dc l a s sa c c o r d i n gt ot h ec s s y s t e mi d e a w h e n d i s c u s s i n g t h c t e s t i n gt e c h n 0 1 0 9 i e s ,w e a r e a l w a y sk e e p i n go u rs t a i l d o nt h e c o v e r a g em e a s u r e m e n t c r i t e r i o n w eh a v e c o m p a r e d t h ed i 髓r e n c e so ft r a d i t i o n a ls o r w a r et e s ta n d o b j e c t o r i e n t e ds o f t w a r et e s t a tt h es 锄et i m e ,也e 缸甚d i t i o n a lc o v e r a g em e a s u r e m e n t c r i t e r i o n s d e f i c i e n c y a r e e x p l a i n c dw h e n “i su s e dt o m e a s u r e 也ec o v e r a g eo f o b i e c t o r j e n t e d s o f h v a r et e s t w eh a v e i m p r o v e d o nt 1 1 e s e g m e n t - b a s e d o b j e c t o r i e n t e dt e s t i n gc o v e r a g e m e a s u r c r n e n tc r i t e r i o n i n 也ee n dw es u m m 盯i z ea l l t h ew o r ki nt h ep 印e r a n dp r o s p e c tt h en e x t r e s e a r c ha s p e c t 2 第一章软件测试概述 程序设计行家说:“任何程序,无论多么小,都有错误。” 新手不相信行家的话:“如果程序小到只有一条语句,也是这样的吗? 他 问道。 “这样的程序不会有任何意义。”行家说。 一一g e o f f i r e yj a j n e r s t h ez e no f p r o g r a 嗍i n g 1 1 引言 社会的不断进步和计算机科学技术的飞速发展,使计算机及软件在工业控 制、医疗、通信、交通,金融、军事国防,航天航空等社会生活的各个方面的应 用越来越广泛和深入。作为计算机的灵魂,计算机软件在其中起着举足轻重的作 用,软件产品的质量自然成为人们共同关注的焦点。 软件的错误和失效有可能造成巨大的经济损失,甚至危及人的生命安全。在 一些关键应用领域( 如民航定票系统、银行结算系统、证券交易系统、飞行控制 系统、军事指挥控制系统和核电站安全控制系统等) 中使用的软件,如果失效或 有错误,就可能造成灾难性的后果。因此,随着信息技术的不断发展,软件的质 量已经成为制约计算机应用的主要因素之一,许多计算机科学家在展望2 1 世纪 计算机科学发展方向和策略时,将提高软件质量放在优先于提高软件功能和性能 的地位1 。 随着软件开发规模的逐渐扩大,软件的出错率也越来越高,给软件带来错误 的原因很多,具体地说主要有:交流不够、交流上有误解、应用的需求不是完全 清晰、软件构件本身的复杂性、图形用户界面( g u i ) 、客户服务器结构、分布 式应用、数据通信、超大型关系数据库以及庞大的系统规模,使得软件及系统的 复杂性呈指数增长“。同时,研制软件在本质上是一个“思维活动”的过程,软 件系统的分析、设计和开发无一不是人类大脑思维的再现,因为人的工作和通讯 都不可能是完美无缺的,出现错误是难免的。软件需求的描述可能有错或者不完 善;软件的设计可能有错;即使设计是正确的,在编码实现时也可能引入错误。 3 南京邮电学院硕士论文 而且,每个开发人员有各自的编程习惯和思维方式,没有统一的标准可以遵循, 这使得错误更有可能发生。 软件测试是保障软件质量的重要手段,是软件工程的重要组成部分。运用软 件工程提供的规范化的分析设计方法,避免错误的产生和消除已经产生的错误, 使程序中的错误密度达到尽可能低的程度,为最终根除软件危机提供强有力的技 术保障。所以,随着软件工程技术的发展,软件规模增大,软件测试在软件开发 过程中的作用显得越来越重要。 什么是软件测试? 1 9 8 3 年i e e e 定义为:使用人工或自动手段来运行或测定 某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清楚预期结果与 实际结果之间的差别。这就非常明确地提出了软件测试以检验是否满足需求为目 标“1 。1 9 9 3 年i e e e 给出了一个更加综合的定义:将系统化的、规范的、可度 量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中: 是对中所述的方法的研究。它指出软件工程是种层次化的技术。科学的测试 是贯穿整个产品生命周期中的测试“。我们需要突破原来对测试的理解,着眼于 整个软件生存期,特别是着眼于编码以前各个开发阶段的测试工作,以保证软件 的质量。避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可 能低的程度。 1 2 软件测试的目标 现在,人们普遍认识到,对软件产品进行测试是保证软件产品质量,提高产 品可靠性的重要手段。据统计,国外软件研发机构3 0 5 0 的工作量花在软件 测试上,对于一些要求高可靠、高安全的软件,如飞行控制或核反应监控等软件, 测试费用可能相当于软件工程所有其它步骤费用总和的3 5 倍。那么,软件 测试的目标到底是什么呢? g l e nm y e r s 在他的软件测试著作中总结陈述了一系列关于软件测试目标的 规则: ( 1 ) 测试是一个为了寻找错误而运行程序的过程; ( 2 ) 一个好的测试用例是很可能找到至今为止尚未发现的错误的用例: - 4 南京邮电学院硕士论文 ( 3 ) 一个成功的测试是指揭示了至今为止尚未发现的错误的测试。 因此,软件测试的目标就是设计这样的测试,既能够系统地揭示不同类型的 错误,并且耗费最少的时间和最少的工作量。 1 3 软件测试的步骤 传统的软件测试过程按测试模块的粒度可分为三个步骤进行:单元测试、集 成测试和系统测试,如下图1 1 所示“1 。 图1 1传统软件测试步骤示意图 ( 1 ) 单元测试:分别完成每个单元的测试任务,以确保每个模块都能正常 工作。单元测试大量采用了白盒测试方法,尽可能发现模块内部的程序差错。在 单元测试过程中,对执行路径的选择性测试是最主要的任务。测试用例应当能够 发现由于错误计算、不正确的比较、或者不正常的控制流而产生的错误,基本路 径和循环测试是发现更多的路径错误的一种有效技术。 ( 2 ) 集成测试:把已经测试过的模块组装起来,进行集成测试。集成测试 是在假定各个软件单元已经通过了单元测试的前提下,检查各个软件单元之间的 相互接口是否正确。其目的在于检验与软件设计相关的程序结构问题。这时较多 地采用黑盒测试方法来设计测试用例。 ( 3 ) 系统测试:对已经集成好的软件系统进行彻底的测试,以验证软件系 统的正确性和性能等是否满足其规格说明所指定的要求。系统测试包括对系统的 性能、安全性、可计算性、配置灵敏度、启动和恢复等方面的测试“”。 南京邮电学院硕士论文 1 4 软件测试的基本方法 软件测试的方法和技术是多种多样的。对于软件测试技术,可以从不同的角 度加以分类:从是否需要执行被测软件的角度,可分为静态测试和动态测试。从 测试是否针对系统的内部结构和具体实现算法的角度来看,可分为白盒测试和黑 盒测试。 1 4 1 黑盒测试 黑盒测试也称功能测试或数据驱动测试或基于规范的测试,它是在已知产品 所应具有的功能的前提下,通过测试来检测每个功能是否都能正常使用,在测试 时,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性 的情况下,测试者对程序接口进行测试,它只检查程序功能是否按照需求规格说 明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息, 并且保持外部信息( 如数据库或文件) 的完整性。黑盒测试方法主要有等价类划 分、边值分析、因一果图、错误推测等。 “黑盒”法着眼于程序外部结构,不考虑内部逻辑结构,只是针对软件的界 面和软件需求规格说明中规定的功能进行测试。“黑盒”法是穷举输入测试,只 有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错 误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对 那些不合法但是可能的输入进行测试。 1 4 2 白盒测试 白盒测试也称结构测试或逻辑驱动测试或基于实现的测试,它是知道产品内 部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进 行,按照程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求 正确工作,而不顾它的功能,白盒测试的主要方法有程序逻辑驱动测试、基本路 径测试和数据流测试等。 “白盒”法需要全面了解程序的内部逻辑结构、对所有逻辑路径进行测试。 因此,“白盒”法是穷举路径测试。在使用白盒测试方案时,测试者必须检查程 妻室型皇兰堕塑主丝奎 序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数 是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试不 能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试 不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与 数据相关的错误“,。 1 4 3 a l a c 测试 a l a c ( a c tl i k eac u s t o m ) 测试是一种基于客户使用产品的知识开发出 来的测试方法。a l a c 测试是基于复杂的软件产品有许多错误的原则。最大的受 益者是用户,缺陷查找和改正将针对那些客户最容易遇到的错误。其模型如下图 1 2 所示: 软件中有许多错误 图1 2a l a c 测试示意图 1 5 软件测试的复杂性与经济性 人们常常以为,开发一个程序是困难的,测试一个程序则比较容易。这其实 是一种误解。设计测试用例是一项细致并需要高度技巧的工作,稍有不慎就会顾 此失彼,发生不应有的疏漏。 不论是黑盒测试方法还是白盒测试方法,由于测试情况数量巨大,都不可能 进行彻底的测试。所谓彻底测试,就是让被测程序在一切可能的输入情况下全部 执行一遍。通常也称这种测试为“穷举测试”。“黑盒”法是穷举输入测试,只 有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错 误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对 那些不合法但是可能的输入进行测试。“白盒”法是穷举路径测试,贯穿程序 南京邮电学院硕士论文 的独立路径数是天文数字,但即使每条路径都测试了仍然可能有错误。 e w d i j k s t r a 的一句名言对测试的不彻底性作了很好的注解:“程序测试只能 证明错误的存在,但不能证明错误不存在”。 在实际测试中,穷举测试工作量太大,实践上行不通,这就注定了一切实际 测试都是不彻底的。当然就不能够保证被测试程序中不存在遗留的错误。软件工 程的总目标是充分利用有限的人力和物力资源,高效率、高质量地完成测试,运 用软件工程提供的规范化的分析设计方法,尽量避免错误的产生和消除已经产生 的错误,使程序中的错误密度达到尽可能低的程度,为最终根除软件危机提供强 有力的技术保障。为了降低测试成本,选择测试用例时应注意遵守“经济性”的 原则。第一,要根据程序的重要性和一旦发生故障将造成的损失来确定它的测试 等级;第二,要认真研究测试策略,以便能使用尽可能少的测试用例,发现尽可 能多的程序错误。掌握好测试的量和测试的度是至关重要的,一位有经验的软件 开发管理人员在谈到软件测试时曾这样说过:“不充分的测试是愚蠢的,而过度 的测试是一种罪孽”。测试不足意味着让用户承担隐藏错误带来的危险,过度测 试则会浪费许多宝贵的资源。 测试是软件生命周期中费用消耗最大的环节。测试费用除了测试的直接消耗 外,还包括其它的相关费用。能够决定需要做多少次测试的主要影响因素如下: l 、系统的目的。系统的目的的差别在很大程度上影响所需要进行的测试的 数量。那些可能产生严重后果的系统必须要进行更多的测试。一个用来控制密封 燃气管道的系统应该比一个与有毒爆炸物品无关的系统有更高的可信度。一个安 全关键软件的开发组比一个游戏软件开发组要有苛刻得多的查找错误方面的要 求。 2 、潜在的用户数量。一个系统的潜在用户数量也在很大程度上影响了测试 必要性的程度。这主要是由于用户团体在经济方面的影响。个在全世界范围内 有几千个用户的系统肯定比一个只在办公室中运行的只有两三个用户的系统需 要更多的测试。如果不能使用的话,前一个系统的经济影响肯定比后一个系统大。 除此而外,在分配处理错误的时候,所花的代价的差别也很大。如果在内部系统 中发现了一个严重的错误,在处理错误的时候的费用就相对少一些,但是如果要 处理一个遍布全世界的错误就需要花费相当大的财力、物力和精力。 南京邮电学院硕士论文 3 、信息的价值。在考虑测试的必要性时,还需要将系统中所包含的信息的 价值考虑在内,一个支持许多家大银行或众多证券交易所的客户机服务器系统 中含有经济价值非常高的内容。很显然这系统需要比一个支持鞋店的系统要进 行更多的测试。这两个系统的用户都希望得到高质量、无错误的系统,但是前一 种系统的影响比后一种要大得多。因此我们应该从经济方面考虑,投入与经济价 值相对应的时间和金钱去进行测试。 4 、开发机构。一个没有标准和缺少经验的开发机构很可能开发出充满错误 的系统。在一个建立了标准和有很多经验的开发机构中开发出来的系统中的错误 不会很多。因此,对于不同的开发机构来说,所需要的测试的必要性也就截然的 不同。然而,那些需要进行大幅度改善的机构反而不大可能认识到自身的弱点。 那些需要更加严格的测试过程的机构往往是最不可能进行这一活动的,在许多情 况下,机构的管理部门并不能真正地理解开发一个高质量的系统的好处,或者由 于经费和时间方面的原因而不得不忽略测试的充分性。 5 、测试的时机。测试量会随时间的推移发生改变。在一个竞争很激烈的市 场里,争取时间可能是制胜的关键,开始可能不会在测试上花多少时间,但几年 后如果市场分配格局已经建立起来了,那么产品的质量就变得更重要了,测试量 就要加大。测试量应该针对合适的目标进行调整。因此,测试应该在早期就开始 进行,而且越早越好。一个错误在系统分析阶段就被发现,那么改正这个错误的 代价比到了系统发布阶段需要的代价少很多。 1 6 软件测试的心理学问题 l 、程序测试的过程具有破坏性 人类的活动具有高度的目的性,建立适当的目标具有重要的心理作用。如果 我们的目的是要证明程序中没有错误,那我们就会不自觉地朝这个方向去做;也 就是说,我们会倾向于挑选那些使程序出错的可能性较小的测试数据。另一方面, 如果我们的目标是要证明程序中有错,那就会选择一些易于发现程序所含错误的 测试数据。而后一种态度会比前者给程序增添更多的价值。 测试的定义意味着程序测试的过程是具有破坏性的,其程度甚至达到了不可 9 - 南京邮电学院硕士论文 容忍的地步“1 。社会上大多数人的人生观是建设性的,而不是破坏性的。人们倾 向于创造一个物品,而不是轻易毁坏一个物品。因此,程序测试的破坏性的定义 使人们对程序测试工作望而生畏。程序测试定义还隐含着如何设计测试睛况,以 及应该由谁和不应由谁来测试一个给定程序等等观点。 另一个令人烦躁的问题是即使程序完成了预期要求,仍可能含有错误。也就 是说,如果程序不按要求工作,它显然有错,但是如果程序做了不要它做的事, 它也是有错的。 2 、程序员应避免测试自己的程序 开发者被指定测试自己的代码是一件很糟糕的事情。开发和测试生来就是不 同的活动。开发是创造或者建立什么东西的行为。而测试的唯目的是证明一个 模块或者系统工作不正常。这两个活动之间有着本质的矛盾。个人不太可能把 两种截然对立的角色都扮演的很好。基于这个想法,应该限制开发者测试自己的 程序。给他们比较合适的任务是进行有可能的最低层的单元测试。当一个程序员 在完成了设计和编写程序的建设性工作后,要一夜之间突然改变他的观点,设法 对程序形成一个完全否定的态度,那是非常困难的。所以,大部分程序员都由于 不能使自己进入必要的精神状态( 不是抱着要揭露出自己程序中错误的态度) , 因而不能有效地测试自己的程序。 除了这个心理学问题之外,还有一个重要的问题:程序中可能包含由于程序 员对问题的叙述或说明的误解而产生的错误。如果是这种情况,当程序员测试自 己的程序时,往往还会带着同样的误解致使问题难以发现。 再者,可以把测试看作是对一篇论文或一本书作校对,或与写评论相类似的 工作。正如许多作者所知,校对或批评自己的著作是非常困难的。也就是说,在 自已的工作中找出缺陷往往是人的心理状态所不容的。 以上看法并不意味着程序员不能测试自己的程序。不过相比之下如果由另外 一些人来进行测试,就会更有效、更成功。注意:这个论断并不适用于纠错( 改 正己知错误) ,由原来程序的作者纠错肯定效率更高。 3 、程库设计机构不应测试自己的程序 在许多意义上来说,一项工程或一个程序设计机构是个有生命的有机体,它 同样有心理学闯题。再者,在大多数情况下,人们都是以在给定日期内,以一定 南京邮电学院硕士论文 代价编制程序的能力来衡量程序设计机构和项目管理人员的。这样做的一个理由 是时间和成本指标便于衡量,而程序的可靠性却很难度量。要程序设计机构在测 试自己的程序时持客观态度是困难的,因为如果用正确的定义看待测试,就不大 可能按预定计划完成测试也不大可能把耗费的代价限制在要求的范围以内。 软件生产的三个最重要的因素是:质量、进度和费用。计算技术的进步, 意味着在经济领域中信息系统更新的速度更快。新的硬件技术的发展,均会使软 件过时,系统交付使用的时间变得日益重要。新产品在其性能和费用上被其他产 品取代之前的推销时间,即市场窗口就已经缩小了。 由于费用和进度的限制,要开发一种高质量、快速交付和低成本的软件产品 变得越来越困难,也就是说要同时达到三个目标是困难的。因此在软件产品的开 发中就要权衡它们之间的关系,使软件的特性能满足用户的要求,这意味着软件 产品特性的度量和预计是必要的。 软件测试由独立测试机构承担有许多好处。独立测试是指软件测试工作由在 经济上和管理上独立于开发机构的组织进行。独立测试可以避免软件开发者测试 自己开发的软件,由于心理学上的问题,软件开发者难以客观、有效地测试自己 的软件,而找出那些因为对问题的误解而产生的错误就更加困难。独立测试还可 以避免软件开发机构测试自己的软件。软件产品的开发过程受到时间、成本和质 量三者的制约,时间和成本指标便于衡量,而质量却很难度量,因此在软件开发 过程中,当时间、成本和质量三者发生矛盾时,质量最容易被忽视。如果测试组 织与开发组织来自相同的机构,测试过程就会面临来自与开发组织同一来源的管 理方面的压力,使测试过程受到干扰。采用独立测试方式,无论在技术上还是管 理上,对提高软件测试的质量和有效性都具有重要意义。主要表现在: ( 1 ) 客观性 对软件测试和软件中的错误抱着客观的态度,这种客观的态度可以解决测试 中的心理学问题,既能够揭露软件中存在的错误,也能不受发现的错误的影响。 经济上的独立性使其工作有更充分的条件按测试要求去完成。 ( 2 ) 专业性 独立测试作为一种专业工作,在长期的工作过程中势必能够积累大量实践经 验,形成自己的专业优势。同时软件测试也是技术含量很高的工作,需要有专业 南京邮电学院硕士论文 队伍加以研究,并进行工程实践。专业化分工是提高测试水平,保证测试质量, 充分发挥测试效用的必然途径。 ( 3 ) 权威性 由于专业优势,独立测试工作形成的测试结果更具说服力,而测试结果常常 和对软件的质量评价联系在一起,由专业化的独立测试机构来评价,更客观、公 正和具有权威性。 ( 4 ) 资源有保证 独立测试机构的主要任务是进行独立的软件测试工作,这使得测试工作在经 费、人力和计划方面更有保证,不会因为开发的压力减少对测试的投入,降低测 试的有效性,可以避免开发单位侧重软件开发而对测试工作产生不利的影响。 1 2 南京邮电学院硕士论文 第二章面向对象软件测试 2 1 一个贯穿全文的例子一简易教学管理系统 在下面的论述中,我们将使用一个贯穿全文的例子( 简易教学管理系统) “1 来解释我们讨论的各种测试方法和技巧。我们用u m l 建模语言来描述这个简易教 学管理系统,在这个例子中我们主要使用了u m l 的类图、状态图和顺序图来说明 与测试相关的些问题。下面简要说明一下这个系统的基本组成。 简易教学管理管理系统的主要功能是处理每个学期的学生课程选修注册和 学生成绩的管理。教学管理系统的用户是学生、教师和教学管理员。学生使用教 学管理系统查询新学期将开设的课程和授课教师的情况,选择自己要学习的课 程,并进行登记注册。学生还可以使用教学管理系统查询自己所选的课程和最终 的课程成绩。教师使用教学管理系统查询新学期将开设的课程、参加听课的学生 情况,以及学生的考试成绩。教学管理员使用教学管理系统进行教学管理,包括 新学期的课程选课注册管理和学生成绩管理。对简易教学管理系统要求提供两个 方面的服务:选课管理,负责新学期的课程选课注册工作;成绩管理,负责 学生成绩管理。 2 1 1 教学管理系统在选课管理方面应该提供的服务功能 l 、录入与生成新学期的课程表,教学管理员在新学期开始前录入新学期课 程,打印将开设的课程目录表,供学生参考选择; 2 、学生选课注册,新学期开始前一周为选课注册时间,在此区间学生可以 进行选课注册,并且允许改变或取消注册申请: 3 、查询,可以查询课程信息、学生选课信息和学生、教师信息; 4 、选课注册信息的统计和报表生成,教学管理员对学生的选课注册信息进 行统计,打印汇总统计的报表。 一 堕蔓墅皇兰堕堡主笙壅 2 1 2 在成绩管理方面应该提供的服务功能 l 、成绩录入,教学管理员录入学生考试成绩; 2 、成绩查询,教师和教学管理员可以查询所有学生的考试成绩,学生只允 许查询自己的考试成绩,不允许查询别人的考试成绩; 3 、成绩统计和报表生成,教学管理员进行成绩统计,打印成绩汇总统计报 表。 2 1 3 教学管理系统提供的对象类 学生类:它的属性有“姓名”、“年龄”、“性别”、“专业”、“班级”等,对这 些信息的服务操作有“查询”、“添加”、“修改”、“删除”等; 教师类:它的属性有“姓名”、“年龄”、“性别”、“职称”等,对这些信息的 服务操作有“查询”、“添加”、“修改”、“删除”等; 课程类:负责学校课程信息的处理,这些课程是教学计划规定开设的全部课 程,但是每一个学期实际开设的课程只是其中的一部分。它的属性有“课程名”、 “描述”、“学时”等,对这些信息的服务操作有“加入课程”、“删除课程”等: 开设课程类:负责新学期开设课程和选课信息的处理,并提供查询功能。它 的属性有“授课日期”、“授课时间”、“授课地点”、“授课老师”等,它的操作有 “加入选课学生”、“加入授课老师”等 学生登记类:负责新学期学生的选课登记,当一个学生要求选课注册时,登 记该学生所选修的课程,并打印选修的课程清单。它的属性有“学期”、“课程名” 等,它的操作有“加入课程”、“打印”等; 课程登记类:负责新学期课程的选课登记,它根据活动者“教师”和“教学 管理员”的要求,汇总学生的选课信息,对一个课程登记选修该课程的学生,并 打印选修该课程的学生清单。它的属性有“学期”、“学生名”等,它的操作有“加 入学生”、“打印”等; 选课统计类:它的属性有“学期”、“课程名”等,它的操作有“按学生统计”、 “按课程统计”、“打印”等; 学生成绩登记类:负责学生考试成绩的处理,它根据教学管理员的要求,登 1 4 - 南京邮电学院硕士论文 记学生的考试成绩,并提供查询功能。它的属性有“学生名”、“学期”、“课程名”、 “成绩”等,它的操作有“加入成绩”,“打印”等: 成绩统计类:它的属性有“学期”、“课程名”、“成绩”等,它的操作有“按 学生统计”、“按课程统计”、“打印”等; 上面这些是这个简易教学管理系统的基本信息,本文中对面向对象类的测试 问题的讨论都是以这个简易教学管理系统为例子来展开的。 2 2 面向对象技术的特点对测试的影响 面向对象技术是一种全新的软件开发技术,正逐渐取代被广泛使用的面向过 程的软件开发方法,被看成是解决软件危机的新兴技术。面向对象技术产生更好 的系统结构,更规范的编程风格,极大地优化了数据使用的安全性,提高了程序 代码的重用,一些面向对象技术的倡导者就此认为随着o o a 和0 0 d 的成熟,更多 的设计模式复用将减轻o o 系统的测试量。应该看到,尽管面向对象技术的基本 思想保证了软件应该有更高的质量,但实际情况却并非如此。因为无论采用什么 样的编程技术,编程人员的错误都是不可避免的,而且由于用面向对象技术开发 的软件代码重用率高,更需要严格的测试,避免错误的繁衍。 r o b e r tv b i n d e r 强调:就面向对象而言,导致了更大的灵活性、健壮性、一般性和高生产率的真 实东西,也是需要进行测试的东西,如果不是更为困难,至少也更具有挑战性。 他还强调,每一次复用是一个新的使用语境,要谨慎地重新测试。为了获得面向 对象系统的高可靠性,可能需要更多、而不是更少的测试”1 。 因此,软件测试并没有因面向对象技术的兴起而丧失掉它的重要性。 2 2 1 测试视角 测试视角是审视产品开发及探究其有效性的一种手段。从该视角对工作成果 进行检查的人可以利用对软件的透彻研究和软件的所有的表示方法来鉴别软件 中存在的问题。这种问题的发现也是通过对软件的系统分析和感性认识而达到 的。一般来说,测试视角有以下几个方面的要求:质疑,对软件的质量提出怀 1 5 - 南京邮电学院硕士论文 疑;客观,确保不能凭空想象:彻底,确保不要遗漏重要的部分;系统, 检查是可再现的“”。 在这一章,我们要运用测试视角的观点来讨论面向对象技术的一些概念。首 先我们回顾面向对象编程的主要概念,当把这些概念用在开发中时,这些概念的 哪些特征会影响到软件测试? 关于在测试中如何适当测试这些面向对象的特征, 我们也会指出一些我们的想法。 2 2 2 面向对象技术的特点对测试的影响 面向对象技术以类、对象、继承、封装、多态等基本特征为核心。面向对象 程序通常由一系列类组成,在类的定义中封装了数据和作用在数据上的操作,数 据和操作统称特征。对象是类的实例。类和类之间的继承关系组成一个无环有向 图结构。父类中定义了些可供共享的公共特征,子类除了继承父类中定义的所 有特征外,还可以引入新的特征。特别地,允许对继承的方法进行重定义,从而 可产生类似功能的不同实现。在面向对象程序中,程序的功能是通过各个类的对 象之间相互传送消息来协调实现的,即通过相互调用对象所属类中的方法来进行 交互以完成整个程序功能的。调用方法可以改变对象的状态并向其他对象发送信 息。动态绑定机制将对象和方法之间动态地联系起来。继承和动态绑定的结合是 面向对象技术最有生命力的地方。 面向对象技术不仅改变了程序设计的风格,而且影响了软件开发的全过 程。面向对象的软件需求分析方法,设计方法也应运而生。面向对象程序设计方 法虽然通过软件重用提高了软件的生产率和可靠性,但另一方面也影响了软件测 试的方法和内容。下面从测试视角的角度分析面向对象技术对软件测试的影响, 清楚地理解这些面向对象特征对软件测试的影响,才能更好地对面向对象软件进 行充分的测试。 2 2 2 1 封装对测试的影响 类的重要特征之一是信息隐藏和封装。它把数据和操作数据的方法封装在一 起,限制对象属性对外部的可见性和外界对它的操作权限,这在一定程度上避免 1 6 南京邮电学院硕士论文 了不合理的操作并能有效地阻止错误的扩散,也减轻了维护的工作量。而这样的 细节信息正是软件测试不可忽略的,信息隐藏和封装使得对象信息的改变有时很 难观察到,因此也使得测试结果检查的难度加大。由于面向对象的软件系统在运 行时刻由一组协调工作的对象组成,对象都有一定的状态。对象的状态是多变的, 因此也可能是不正常行为的根源,所以对面向对象的程序测试来说,对象的状态 是必须考虑的因素。测试应涉及对象的初态、输入参数、输出参数和对象的终态。 面向对象软件测试的直接测试目标是对象,其基本工作就是创建对象,向对象发 送一系列消息,然后检查结果对象的状态,看其是否正确。然而封装却使得对象 的状态往往是隐藏的,若类中未提供足够的存取函数来表明对象的实现方式和内 部状态,则测试者必须添加这样的函数。因此,类的信息隐藏和封装给测试带来 了困难。例如,在下图2 1 的师生类中 图2 1 师生类 如果需要测试该类中某个对象的p h o n e n u m 这个属性是否正确,则由于封装 的原因无法直接对该属性进行存取,就必须在测试的时候添加存取p h o n e n u m 属 性的方法( 比如存取该属性的g e t _ p h o n e n u m 方法和s 乩一p h o n e n u m 方法) ,等到 测试完成后再将这些添加的方法去掉。 2 2 2 2 继承对测试的影响 继承是面向对象程序的基本特征之一,它是一种概括对象共性和组织结构的 机制,使得面向对象设计更具自然性和直观性“。在面向对象程序设计中,继 承由三种基本机制实现。扩展是指子类自动包含父类的特征。父类方法的实现 和接口被继承。有些语言支持名字修饰以区分在父类和子类中有相同名字的特 征。覆盖是指子类中的方法与父类中的方法有相同的名字和消息参数,接口相 同但方法的实现通常不同。覆盖支持多态类和抽象的父类方法。特例化是指子 类中定义的特有方法和实例变量。 继承是类之间的一种联系,它允许新类可以在一个或几个已有类的基础上进 - 1 7 南京邮电学院硕士论文 行定义。一个类对另一个类的依赖,使得已有类的说明和实现可以被复用。子类 不但继承了父类的数据和操作,还可以对继承的特征进行重定义。然而,继承同 时也向测试者提出了新的挑战。继承提供了一种机制,通过这种机制,潜在的错 误能够从一个类传递到它的派生类中。测试类的时候要尽早消除这种错误,以免 这些错误扩散到其它类中。从测试视角上说,即使是彻底的复用,对每一个新的 使用语境也需要重新测试。此外,多重继承增加了需要测试的语境数量,从而使 得测试进一步复杂化。主要表现如下:若我们在子类中定义了某一继承的方法, 即使两个函数完成相同的功能,对重定义的方法也需要重新测试;若一个类得 到了充分的测试,当其被子类继承后,继承的方法在子类的环境中的行为特征需 要重新测试。在多重继承的情况下,从两个不同的父类中所定义的同名的特征 中按不同的优先级( 或选择方式) 在子类中仅选择保留一个版本时,即使所得到 的子类与父类结构相同,仍然可能需要不同的测试用例集;若我们对父类中某 一方法进行了重定义,仅对该方法自身或其所在的类进行重新测试是不够的,还 需要重新测试其它有关的类( 如予类和引用类) 。总之,继承并未简化测试问题, 反而使测试更加复杂。 在简易教学管理系统中,师生类是学生类和教师类的父类,学生类和教师类 都重载了r e g i s t e r 方法,而且学生类添加了s t u _ r e g i s t e r 方法,教师类添加了 t e ar e g i s t e r 方法,这两个方法完成的功能与r e g i s t e r 方法基本一样,但是还 是做了各自的改动。 图2 2 师生类继承关系图 如上图2 2 所示,在子类( 学生类和教师类) 中,父类的方法由于有了新的 语境,所以需要重新测试,故在子类中g 札一n a i n e 方法和g e t g e 方法都需要根 据子类的需要重新测试。子类中重载和新建的方法,同样需要在各自的环境下进 南京邮电学院硕士论文 行测试,所以上例中学生类的r e g i s t e r 方法和s t u _ r e g i s t e r 方法以及教师类的 r e g i s t e r 方法和t e a _ r e g i s t e r 方法都需要在各自的使用语境中进行测试。 2 2 2 3 多态性和动态绑定对测试的影响 多态性和动态绑定是面向对象方法的关键特征之一。同一消息可以根据发送 消息对象的不同采用多种不同的行为方式,这就是多态的概念。根据当前指针引 用的对象类型来决定使用正确的方法,这就是多态性的行为操作。运行时系统能 自动为给定消息选择合适的实现代码,这给程序员提供了高度的柔韧性、问题抽 象和易于维护。但多态性和动态绑定所带来的不确定性,使得传统测试实践中的 静态分析方法遇到了不可逾越的障碍。而且它们也增加了系统运行中可能的执行 路径,加大了测试用例的选取难度和数量。多态允许系统通过增加类来进行扩展, 而不是修改己经存在的类,这样在扩展中也许会出现出乎意料的交互关系。多态 允许任何操作都可以包括一个和多个类型的不确定参数,这样就增加了应该测试 的实际参数的种类。多态还允许操作指定动态引用返回的响应,实际引用的类可 能是不正确或者不是发送者所期望的,因而增加了调用和结果的不确定性,加大 了测试的难度和测试用例空间的数量。 2 2 2 4 系统功能的实现 在面向对象系统中,系统的功能体现在对象之间的协作上,而不再是简单的 过程调用关系。面向对象程序的执行实际上是执行一个由消息连接起来的方法序 列,方法的实现与所属对象本身的状态有关,各个方法之间可能有相互作用。为 了实现某一特定的功能,有可能要激活调用属于不同对象类的多个成员函数,形 成成员函数的启用链。显然基于功能分解的自顶向下或自底向上的集成测试策略 并不适用于用面向对象技术构造的构件。 2 2 2 5 基本构造模块 在面向对象系统中,系统的基本构造模块是封装了数据和方法的类和对象, 而不再是一个个能完成特定功能的功能模块。每一个对象都有自己的生命周期, 南京邮电学院硕士论文 都有自己的状态。消息是对象之间相互请求或协作的途径,是外界使用对象方法 及获取对象状态的唯一方式。对象的功能是在消息的触发下,由对象所属类定义 的方法与相关对象的合作共同完成的,且在不同状态下对消息的响应可能完
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 巢湖学院《代数几何基础》2024-2025学年第一学期期末试卷
- 2025年市场营销策略制定与执行模拟练习题
- 河北石油职业技术大学《多媒体课件制作与应用》2024-2025学年第一学期期末试卷
- 石家庄理工职业学院《油画临摹》2024-2025学年第一学期期末试卷
- 2025年计算机软件编程技术面试模拟题及答案集合
- 2025年燃气储运中级技能实操考试指南与模拟题
- 贵州盛华职业学院《病原微生物免疫与健康》2024-2025学年第一学期期末试卷
- 2025年软件开发工程师面试题解析Java编程技术进阶中级模拟卷
- 资阳环境科技职业学院《互换性与汽车测量》2024-2025学年第一学期期末试卷
- 四年级数学(上)计算题专项练习及答案
- 2017年9月国家公共英语(三级)笔试真题试卷(题后含答案及解析)
- 膀胱镜检查记录
- 2021年西安陕鼓动力股份有限公司校园招聘笔试试题及答案解析
- 沈阳终止解除劳动合同证明书(三联)
- 化工装置静设备基本知识
- 电脑节能环保证书
- 江西师范大学研究生院非事业编制聘用人员公开招聘1人(专业学位培养办公室助理)(必考题)模拟卷
- 2021社会保险法知识竞赛试题库及答案
- 罐头食品加工工艺课件
- 《排课高手》用户手册
- 变压器套管课件
评论
0/150
提交评论