(计算机应用技术专业论文)软件可测试性检测技术研究与实现.pdf_第1页
(计算机应用技术专业论文)软件可测试性检测技术研究与实现.pdf_第2页
(计算机应用技术专业论文)软件可测试性检测技术研究与实现.pdf_第3页
(计算机应用技术专业论文)软件可测试性检测技术研究与实现.pdf_第4页
(计算机应用技术专业论文)软件可测试性检测技术研究与实现.pdf_第5页
已阅读5页,还剩55页未读 继续免费阅读

(计算机应用技术专业论文)软件可测试性检测技术研究与实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京航空航天大学硕士学位论文 文摘 软件的可测试性作为一个软件度量指标,是指软件在任意给定输入集合下进行测 试的过程中,其中存在的错误能够被揭示出来的概率。开展对软件可测试性的研究有 助于确定软件为了达到一定的可靠性而需要被测试的程度,并最合理地分配测试资 源,提高测试的效率。而且,可测试性分析也能够用于指导软件设计者们合理地设计 软件结构,以降低测试的开销以及提高测试的可行性。从而使软件的可靠性和可信度 达到新的水平。 本文针对软件可测试性的量化检测给出了一套完整的解决方案。基于软件的故障 失效模型,本文构建了软件可测试性量化检测的s t 删理论模型,并设计实现了基于 该理论模型的可测试性检测工具。 本文首先介绍了软件测试和可测试性的基本概念等用于检测软件可测试性的理 论基础,并详细分析了一些理论检测模型及各自的优缺点;接下来,针对这些可测试 性检测模型中所存在的问题,根据对软件错误导致软件失效过程的研究分析,本文提 出了一种改进的解决方案s t d m 用于对软件的可测试性进行量化检测,文章在最后设 计并实现了构建在此s t d i 模型基础之上的一个软件可测试性检测工具,该工具能够 对c 源程序进行可测试性检测并得出量化结果数据,验证了该模型的有效性。 关键字:软件测试,可测试性,故障失效,p i e 过程模型 软件可测试性检测技术研究与实现 a b s t r a c t t e s t a b i l i t yi s 姐i m p o r t a n tq u a l i t yc h a r a c t e r i s t i co fs o f t w a r e i tr e f e r st ot h ep r o b a b i l i t y t h a tap i e c eo fs o f t w a r ew i l lf a i lo ni t sn e x te x e c u t i o nd u r i n gt e s t i n g ( w i t hap a r t i c u l a r a s s u m e di n p u td i s t r i b u t i o n ) i ft h i ss o f t w a r ei n c l u d e saf a u l t b a s e do nt h er e s e a r c ho f t e s t a b i l i t y , w ec a l ld i s t r i b u t et e s tr e s o u r c em o r er e a s o n a b l y , a n dr e d u c et h ec o m p l e x i t yo f s o f t w a r et e s t 。a n df u l 也e r , w bc a nu s ei tt od i r e c ts e l l , w a r ed e s i g n i n g , s oa st oe n h a n c et h e r e l i a b i l i t ya n d t h ed e p e n d a b i l i t yo f s o f t w a r et oan e wl e v e l i nt h i sp a p e r , w e p r e s e n ta n e w a p p r o a c h t oa n a l y z es o t h v a r et e s t a b i l i t y b a s e do nt h e f a u l f f f a i l u r em o d e l w ee s t a b l i s han e w m o d e l s t d m ( s t a t i ct e s t a b i l i t yd e t e c t i n gm o d e l ) t om e a s u r es o f i a , a r et e s t a b i f i t y , a n dt h e nd e s i g na n d i m p l e m e n t a p r a c t i c a l t o o lt of u l f i l li t f i r s t t h i s p a p e ri n t r o d u c e st h ec o n c e p t i o no fs o i 隆w a l - et e s t , t e s t a b i l i t y , a n d s o m e e x i s t e n tm o d e lu s e df o ra n a l y z m g t e s t a b i l i t y s e c o n d , w ea n a l y z et h em e r i t sa n dd e m e r i t s o f e a c h m o d e l ,a sf o l l o w e d , a f a r w e p a r t i c u l a r l yi n v e s t i g a t i n g t h e p r o c e s so f s o t h v a r ef a u l t l e a d i n g t os o f t w a r ef a i l u r e w ep u tf o r w a r do u ri m p r o v e ds c h e m e - s t d ma n d s p e c i f yt h e p r o c e s st h a ti tm e a s u r es o f t w a r et e s t a b i l i t ym o r el o g i c a l l y a tl a s t , b a s e d0 1 1s t d m w e d e s i g na n di m p l e m e n t as t d s ( s o r w a m t e s t a b i l i t yd e t e c t i n gs y s t e m ) ,w h i c hc a nb eu s e d t om e a s u r et h et e s t a b i l i t yo f c p r o g r a m s a n ds h o w t h ed e t 范t e dr e s u l ti nd i f f e r e n tl e v e l k e y w o r d s :s o f t w a r et e s t , t e s t a b i l i t y , f a u l t f a i l u r e , p i em o d e l i i 南京航空航天大学硕士学位论文 1 1 研究背景和意义 第一章绪论 信息科学技术的飞速发展,已经使软件产品应用到了社会的各个领域,并且软件 的功能也越来越强大。但这随之带来的问题就是软件的复杂程度也越来越高,软件产 品的质量也越来越难以保证。曾经是上个世纪软件界最热门的话题“软件危机” 便是上述问题的集中体现。其实,软件危机仅仅是一种问题的表现形式,这个问题就 是软件在开发中不可避免地要存在错误。正是这些错误导致了软件开发在成本、进度 和质量上的失控。 事实上,软件错误对于软件来说,是一种固有的属性,是无法改变的。无论采取 怎样新型的开发语言、先进的开发方式、完善的开发过程,软件错误都只能是尽量减 少,但不可能完全杜绝。而对于软件中所存在的错误,最终只能通过一个方法来解决: 软件测试。 软件测试是软件工程过程的一个重要阶段,是在软件投入运行前,对软件需求分 析、设计和编码等各阶段产品的最终检查,是为了保证软件开发产品的正确性、完全 性和一致性,从而检测软件错误、修正软件错误的过程。软件开发的目的是开发出实 现用户需求的高质量、高性能的软件产品,软件测试则以检查软件产品内容和功能特 性为核心,是软件质量保证的关键步骤,也是成功完成软件开发目标的重要保障。 软件测试的目的是尽可能发现多的软件中所存在的错误,它是保证软件质量的关 键,是及其重要的。然而,由于对任何个软件的测试都要受到期限,费用,人力和 资源等要素的限制,测试过程是一定要中止的。现实的情况表明,即使在测试工作上 投入了更多的人力和物力,但软件的质量仍得不到完全保证。所以,有必要对软件测 试做进一步的研究,以使我们能够把有限的铡试资源更加合理地投入到软件测试的过 程中,提高测试效率,并达到理想的测试效果。 软件的可测试性恰为这样一个软件度量指标,正是软件的可测试性的高低决定了 对该软件进行测试的难易程度,或者说是软件中的故障被揭示出来的可能性。开展对 软件可测试性的研究有助于确定软件为了达到一定的可靠性而需要被测试的程度、指 导最合理地分配测试资源,并提高测试性的覆盖率。而且,可测试性分析也能够用于 指导软件设计者们合理地设计软件结构,以降低测试的开销以及提高测试的可行性; 由于改善了软件的结构,也能直接避免了一些软件错误,从而使软件的可靠性和可信 度达到新的水平。考虑到软件测试固有的复杂性,在软件开发中测试的成本越来越高, 但软件的可靠性仍得不到保证。所以,关注软件可测试性的目的就是为了将其应用在 软件可测试性检测技术研究与实现 软件质量保证中,合理分配测试资源,在减轻测试工作量的同时,提高软件的可靠性。 研究软件的可测试性,将是对传统的通过大量测试来保障软件质量的方法的一种完 善。因此说,研究软件可测试性及其量化方法不仅对评价软测试难易程度有重要意义, 而且对软件的测试、软件的质量保证,以及改进软件结构设计也具有现实的指导意义。 1 2 国内外研究状况 “可测试性”的概念最早是在7 0 年代初针对硬件测试而被提出来的。当时,由 于一些硬件电路系统膨胀到一定的数量级,对其进行测试就显得异常复杂,于是,众 多学者纷纷提出了对硬件电路的可测试性度量方法,于是形成了可测试性设计的一个 重要分支可测试性分析。 硬件可测试性分析的含义是:“对一个已初步完成设计的电路,或者待测电路, 不具体生成测试码就能定量地估算出电路测试难度的一类方法”口】。它有两条基本要 求:a 1 准确性,要求得到的电路的可控制性、可观察性,以及可测试性的相对大小关 系能真实描述故障检测的难易;b ) 易计算性,要求可测试性分析方法的计算复杂性必 须大大低于测试生成,否则将失去其存在价值。 到了9 0 年代,人们逐渐把硬件的可测试性分析研究应用到软件上,软件可测试 性研究日益成为人们关注的焦点。然而,软件可测试性作为软件的一种质量特性,并 没有一个统一的定义,人们根据各自研究的出发点的不同,对软件可测试性给予了不 同的定义。比如: 1 ) i e e e ( 1 9 9 0 ) 标准 7 1 :a ) 为一个系统或构件建立测试标准并通过执行测试来 确定该标准被满足的难易程度- b ) 对每一个声明的需求建立一个测试标准并通过执行 测试来确定该标准被满足的难易程度。 2 1s tl a b 标准【l l 】:一个软件能够被测试的有效程度的判断。这个定义要求观察 程序中使测试变得困难的每个方面。 3 ) j e f l 盹yv o a s 标准【7 l :如果软件中存在错误,它在下一次被测试执行( 基于一 定的程序输入域) 时产生失效的概率。 一个更为一般的观点把软件的可测试性定义为软件中存在的错误在给定任意输 入集合的测试过程中,能够被揭示出来的概率。 综合分析以上这些可测试性定义我们就会发现,软件可测试性实质上就是对软件 进行有效测试的难易程度的一个指标。但是,仅仅有这些定义是不够的,这些定义没 有给出量化可测试性的指标,如果能把可测试性指标用具体的数值进行量化,那么评 价软件测试难易程度就会更加方便。同时,也可以将该量化值用于评估指导软件的可 靠性度量及可测试性设计。 国际上对软件可测试性的研究至今已有1 0 年,并提出了从各个不同角度来分析 软件可测试性并对它进行检测的方法。这些方法根据其实现的方式可以分为两类:一 2 南京航空航天大学硕士学位论文 类是用动态执行的方法来检测,主要以p i e 模型 l 6 i ,语义故障模型刚等方案为代表; 另一类则是用静态分析的方法来检测,如f r e e m a n 提出的域可测试性【l “。j e f f r e ym v o a s 提出d r r 模型【7 】以及软件故障,失效模型j ,j i n - - c h e m gl i n 等人提出的静态 程序可测试性分析模型【1 2 】【1 8 1 等。动态方法强调动态运行被测程序,借助于插装程序 变异因子的方法观察其对程序执行过程和程序输出的影响,进而评估程序的可测试 性:而静态方法多为基于对程序代码的静态结构分析,依据一定的规则,实现对程序 的可测试性分析。 国内对软件可测试性的研究起步比较晚,从己有的文献来看,都着重于对软件可 测试性进行定性研究,或者着重于可测试性设计策略的制定上,但并没有哪个单位或 个人对软件可测试性的检测方法提出新的见解或新的解决方法。 目前,关于软件可测试性的研究已经越来越受到重视,软件可测试性的研究成果 也不仅仅应用于指导测试资源的合理分配上,还被应用到软件设计模式改进、软件可 靠性模型建立等方面。而且软件可测试性研究的内容范围也越来越广泛。 1 3 课题主要研究内容及组织结构 软件可测试性检测方法的研究无论是对软件测试,还是对软件质量保证都有着非 常重要的意义。本文的工作旨在研究软件可测试性的检测方法,给出可测试性检测的 量化指标,并实现用于软件可测试性检测的工具,帮助软件测试人员和质量保证人员 合理安排软件测试的资源,保证软件质量,并为软件的可测试性设计提供有益的借鉴 和参考。为此,本文所做的工作如下: 1 ) 广泛阅读并分析国内外关于软件可测试性度量指标、检测方法的文献,总结 各种可测试性度量指标和检测方法的实际指导意义。 2 ) 借鉴故障失效模型和p i e 错误检测过程,通过对程序结构、流程和表达式 进行分析,深入地研究了软件故障导致软件失效的整个过程;并将产生失效的过程与 软件的可测试性联系起来,详细地分析了可测试性的量化方法,同时结合对现有检测 模型中存在的不合理问题,提出了改进的可测试性检测方法。 3 ) 根据所提出的改进方法,构建了s t d m 静态可测试性检测模型,使用该模型 从软件错误产生的开始,跟踪到软件产生失效( 输出结果错误) 的整个过程,并给出 软件可测试性的定量检测数据。 4 ) 设计并实现了软件可测试性检铡系统。通过对c 程序源代码进行静态分析, 检测其可测试性,并得出量化的结果,实现对检测理论的验证。 本文的内容组织方式如下: 第一章:绪论。阐述研究工作的背景和意义,分析国内外的研究状况,并介绍论 文主要内容。 第二章:软件可测试性检测方法的理论基础。介绍软件测试及可测试性检测的基 1 软件可测试性检测技术研究与实现 本概念和理论基础,对几种现有的可测试性检测方法和模型进行简单的介绍和实效分 析。 第三章:软件静态可测试性检测模型( s l r i ) m ) 研究。详细地分析了现有可测试 性检测模型的不足和缺陷:并根据高准确性和低计算复杂性的原则,提出了一套过程 检测的改进解决方案,在此基础上建立了一个基于静态分析方法的软件可测试性检测 模型。 第四章:软件可测试性检测系统的设计与实现。依据s t d m 检测过程理论,设 计并实现了实用的检测工具。本章描述系统设计和实现的总体思路和其中关键问题的 解决方法,并针对s t d m 可测试性检测过程举了一个简单的例子进行说明。 第五章:总结与展望,对本文的工作进行了总结,并对需进一步研究的工作进行 了探讨和展望。 南京航空航天大学硕士学位论文 第二章软件可测试性检测理论基础 如前所述,软件的可测试性是指软件错误在软件测试过程中被揭示的容易程度, 它的理论基础依然是软件测试。本章将首先介绍与软件可测试性关系紧密的一些概念 和理论基础,然后再对软件的可测试性及其检测过程进行探讨。 2 1 软件测试与软件可测试性简介 2 1 1 软件测试简介 可以将软件测试定义为:软件测试是使用人工或自动手段来运行或测定某个系统 的过程,其目的在于检验它是否满足规定的需求或是比较预期结果与实际结果之间的 差别【8 】。软件测试是软件质量保证的关键元素,它代表了规约,设计和编码的最终检 查。 g l e nm y e r s 在他的软件测试著作中陈述了一系列关于测试目标的规则 2 2 】: 测试是为了寻找错误而运行程序的过程; 一个好的测试用例是指可能找到迄今为止尚未发现错误的用例; 一个成功的测试是指揭示了迄今为止尚未发现错误的测试。 但是,在构造测试时我们应该牢记,测试无法说明错误不存在,只能表示错误已 经出现。 软件测试涉及到软件程序代码,执行环境需求规范,设计文档,操作手册等诸多 方面内容。一个完整的软件测试过程包括了测试计划,测试准则,测试目标,测试用 例,驱动模块,测试环境等许多相关内容。在软件测试过程中,最为关键的就是软件 测试用例设计问题。在过去的3 0 多年里,出现了大量的测试用例设计方法,为开发 人员进行测试提供了系统的指导,更为重要的是,方法提供了一种有助于确保完全测 试的机制,并提供了揭示软件错误的最高可能性。这些方法大致可分为两大类:静态 测试和动态测试。 静态测试技术 静态测试技术是不执行程序代码而寻找程序代码中可能存在的错误或评估程序 代码的过程。它具有以下特点: 1 ) 静态测试不必动态地运行程序,也不必进行测试用例设计和结果判断等工作。 2 ) 静态测试可以由人工进行,充分发挥人的逻辑思维优势。 3 ) 静态测试实施不需要特别的条件,容易开展。 软件可测试性检测技术研究与实现 静态测试包括: 1 ) 代码审查- c o d ei n s p e c t i o n 或c o d er e v i e w 2 ) 代码走查w a l k t h r o u g h 3 ) 技术评审( 软件需求分析和设计评审) 动态测试技术 动态测试是在抽样测试数据上执行程序并分析输出以发现错误的过程。它具有以 下特点: 1 ) 实际运行被测试程序,取得程序运行的真实情况、动态情况,进而进行分析。 2 ) 必须生成测试数据来运行程序,测试质量依赖于测试数据。 3 ) 生成测试数据、分析测试结果工作量大,使开展测试工作费时、费力、费人。 4 ) 动态测试中涉及多方面工作,人员多、设备多、数据多,要求有较好的管理 和工作规程。 动态测试包括三部分核心内容:生成测试数据、执行程序与验证程序的输出结果。 这其中最为关键的是生成测试数据。目前,生成测试数据的策略有黑盒测试和白盒测 试【l 】【叭,它们构成动态测试技术的基本内容。 软件验证与软件确认鸭软件验证与软件确认均为软件开发中的重要质量保证手 段,但它们却表示为两个不同的活动集合,软件验证定义为“对系统或单元评价的过 程,以确定一个给定的开发阶段的产品是否满足在此阶段开始时所要求的条件”,验 证活动是与开发活动同时执行的活动;软件确认被定义为“在软件开发过程期间或结 束时评价系统或单元的过程,以确定它是否满足了特定的需求”,确认活动是在软件 开发后判断软件是否正确地实现了需求。 2 1 2 软件的可测试性 过去,关于软件测试的大量研究都集中于选择测试的方法和策略上,它们可基于 软件需求说明,程序设计结构,或者其它一些关于软件错误的假设。进行测试的目标 是通过将运行软件所得到测试结果与需求正确的结果进行比较,进而去发现软件中所 存在的错误。在上述过程中,澳4 试工程师都共同关注一个问题:软件在测试中运行失 败的概率会有多大呢? 然而,除非对软件进行穷尽测试,不然是不能够得出上述问题 的精确量化指标的。而且,为了使测试能够足够有效,应该使该测试能够从某种程度 上给出对被测程序的可靠度度量。软件可测试性分析便是着重与此。 为了使读者能够更好地理解软件可测试性的含意,我们首先做一个简单的类比。 如果把软件错误比作成金子。软件测试则可比作是开采金矿,软件可测试性分析 则是开采金矿之前地质学家所做的勘探工作。开矿掘金并不是地质学家的工作,但是, 地质学家却能够预见在某处可以掘到金子的可能性概率。比如,他可以说:“在此处 可能也可能不存在金子,但如果存在,则是在地下5 0 英尺,而且将会遍布整个该处 6 南京航空航天大学硕士学位论文 地域。”在另一处,他可能又说,“如果此处下面1 0 英尺内没有金子,那么,该处便 不会存在金子。” 在软件开始测试之前,这样的起始勘探相对于盲目测试有着明显的优点。可测试 性分析能够给出对软件特定模块进行测试过程中发现错误的容易程度,预见为了达到 一定可靠性的测试强度。如果针对可测试性分析得出的结论而进行的软件测试之后, 并没有发现错误,那就可以更为理智地推断该软件没有错误。 我们的目标是能够足够精确地评估目标软件,以确定其是否具有高质量,高可靠 性。如果只用黑盒测试来评估软件的质量,那么就需要大量的测试用例来满足质量需 求。 为了减少测试的次数,可用以下两种方法之一: i 设计并选取那些更有能力揭示软件错误的测试用例。 i i 设计出存在错误时错误更容易被发现的软件。 设计高效的测试用例并不是一件容易的事。为了达到这个目标,需要能够设计出 针对于软件中更容易出现错误之处的测试用例,或软件中更容易隐藏错误之处的测试 用例,软件的可测试性分析便是着重于此。通过对软件可测试性的定量分析,便可以 更有针对性地开展测试工作,合理分配测试资源,安排测试进度,提高测试效率;进 而提高软件的可靠性。 上述第二点意味着我们需要开发出具有下列特点的软件:1 ) 对于每种输入代码都 具有更大的被运行的概率。2 ) 包含了如果本身就含有错误,则很可能也会引发整个程 序状态出现异常的数据结构,并将该异常直接导致为软件失效而被检测发现。软件的 可测试性设计便是重点于上述问题。 当前对可测试性分析的研究,主要着重于分析一段包含缺陷的程序运行时导致软 件失效的概率,一般有静态分析和动态分析两种分析方法。静态分析主要采用软件代 码分析、功能规约研究等方法,研究软件的信息丢失【加】( i n f o r m a t i o nl o s t ) 现象及其 解决办法、软件故障导致软件失效的过程及其预测方法等。动态分析主要采用敏感性 分析p ( s e n s i t i v i t y a n a l y s i s ) ,缺陷注入【1 6 3 ( f a u l tm j e c f i o n ) ,变异测试【1 6 ( m u t a t i o n t e s t ) 等方法,研究软件缺陷的可达性状态异常和故障产生的概率。与静态分析相比,动态 分析具有较为准确的度量结果,但复杂度代价较高,不适用于对大规模软件进行检测 分析;静态分析方法则是对其较好的补充,可以适用于更为广泛的检测领域。 2 1 3 软件可测试性与软件测试、软件验证的关系 软件测试( s o f t w a r et e s t ) 形式化验证( f o r m a lv e r i f i c a t i o n ) 和软件可测 试性分析是软件验证( s o f t w a r ev e r i f i c a t i o n ) 三个方面p 】【7 】,软件测试是一个动态 验证过程,形式化验证主要做程序正确性证明,是一个静态数学推理过程,而软件可 测试性分析可对前两者作补充,为前两者提供有益的信息。需要指出的是,软件的可 、 7 软件可测试性检测技术研究与实现 测试性与软件的测试和验证都相关,但又有明显不同。同软件测试一样,可测试性分 析需要经验性质的工作来创建评估;又与软件测试不同的是可测试性分析并不需要测 试用例。因此测试和可测试性分析可以互为补充:测试揭示错误( 可测试性分析不能) , 但可测试性分析能够指出测试应该针对软件更会隐藏错误之处。同样,软件验证是评 估软件可被接受程度的过程,这里的“可被接受”程度是由该软件的具体需求而确定 的,包括安全性和可靠性等。可测试性则检查与其不同的行为特征:包含错误的代码 在运行时产生错误的概率。 软件可测试性分析,软件测试和软件验证都能够提供软件质量方面的信息,每种 技巧也都提供了软件分析中需要考虑的不同方面。 作为一个假定的关于该三种软件分析如何能够协同工作的例子,我们考虑一个拥 有5 0 个模块的系统。每个模块都经历了1 0 0 次的随机测试,每个模块也都通过了这 些测试:而且,整个系统也经历了1 0 0 次的随机测试。这其中的l o 个最为复杂、也 是要求最为严格的模块在开发过程中也经受了形式化验证。但可测试性分析结果揭示 了在其中的5 个模块中存在测试很难发现错误的代码区域,而这5 个中也只有一个通 过了形式化验证。从这点来说,验证资源应当集中到那4 个具有低可测试性且没有被 形式化验证的模块中,因为它们更容易隐含错误。 上述实例说明了可测试性信息不能取代测试和验证,但一方面也说明了软件测试 和软件验证不能完全彼此依赖。最有效的软件从业者应当利用所有可以利用的信息来 构建高质量软件。 2 2 软件可测试性检测模型 由于软件的可测试性分析是针对于软件中存在的错误在测试过程中被发现的概 率,所以,本节首先介绍可测试性检测中的一些相关基本概念,并对软件错误进行分 析,然后,再介绍几个现有的软件可测试性检测模型。 2 2 1 可测试性检测基本概念 软件错误( s o f t w a r ef a u l t ,也称软件故障,软件缺陷) 软件错误指在软件设计中存在的缺陷,该缺陷使得软件并不能满足预定的软件功 能需求。就其发生的环境来说,它通常可以分类如下: 1 ) 功能错误:说明书不完整、模糊、自相矛盾,从而导致对系统功能的误解。 2 ) 逻辑错误:程序设计算法逻辑上存在错误,并不能满足功能需求。 3 ) 系统错误:与外部接口交互的协议错误,外部i o 操作错误。以及操作系统 接口错误,控制序列错误,资源管理问题等。 南京航空航天大学硕士学位论文 4 ) 过程错误:参数调用错误,子程序调用错误,运算错误,初始化错误等。 5 ) 数据错误:动态数据与静态数据混淆。信息、参数与控制数据混淆。数据格 式、内容、结构与属性错误等。 6 ) 编码错误:语法错误、变量名错误、局部与全局变量混淆、数据操作错误、 变量引用错误等。 软件失效( s o r w a r cf a i l u r e ) 软件失效指对于一定的软件输入,软件输出( 运行) 结果错误或并不满足预定的 软件功能需求。 程序错误( 程序故障,程序缺陷) 。程序失效的概念类似于上述概念。 应该注意,软件错误的表现形式是软件失效,但它并不是软件失效的充分条件, 也就是说并不是所有软件错误都会在测试或运行时引起软件失效,这一点本文将在后 面的章节中进行详细分析。 程序位置( l o c a t i o n ) 程序位置是一条高级程序设计语言的语句或一条机器指令。譬如,它可以是赋值 语句、输入语句、输出语句或w h i l e 的条件表达式等。 程序数据状态( d a t es t a t e 简称数据状态) 程序数据状态指的是当程序执行至某一程序位置时,当前程序中所有己定义的变 量的值和程序指针的值。数据状态的取样是在两个连续执行的程序位置之间进行的。 2 2 2 软件错误分析 软件一旦包含错误,它将潜伏在软件中,直到被发现和正确修改。如果软件在运 行时没有运行到有错误的部分,软件就可以正常运行且正确工作;若运行到了有错误 的部分,则软件的计算或判断就会与规定的需求产生不符,这种不符便有可能使软件 丧失执行要求的功能的能力,进而产生软件失效。 对软件进行测试的目的就是使用测试用例观察软件是否在运行过程中有失效的 发生。如果测试过程中,软件失效发生了,那么就可以判定,软件中一定存在有软件 错误:但另一个问题出现了:如果软件中存在错误,那么它一定会在测试中被发现吗? 也就是说,软件错误是在仟么条件下才会导致软件产生失效呢? 为了理解上述概念以及分析所提出的问题,下面看一个简单的函数程序实现的例 子: 该函数功能需求为:当满足条件a :0 且b 2 - 4 a c _ 0 时,输出l ,否则输出0 ;并假 设在程序设计中编码如下: 1 i n t t i m e ( i n ta i n t b ,i n t c ) 2 i n t x ,y ,r c s ; 3 i f ( a - 一0 ) q 软件可测试性检测技术研究与实现 4 r e s = 0 ; 5 e l s e 6x = b 岫: 7 y = 2 + a + c : 8 i f ( x - y = 0 ) 9 r e s = 1 : 1 0e l s e 1 1 r e s = 0 ; 1 2 1 3r e r i t br e s ; 1 4 例程2 2 1 在上述函数p 中,根据功能需求,在函数第7 行存在一个软件错误e ,即原本应 该是4 * a * c ,却被误写成了2 * a * c 。现在考虑对该程序进行测试,我们会随机选取了 若干个测试用例,即若干个程序输入输出值对。然而,在执行测试用例的过程中,会 有什么情况发生昵? 比如,采用如下四组测试数据:a ( o ,1 ,2 ) 、b ( 1 ,2 ,o ) 、c ( 1 ,3 ,2 ) 、d ( 1 ,4 ,5 ) 代表函数的输入参数,按照功能需求,各测试用例的输出结果应分别为: 0 、l 、1 、0 。接下来考查各测试用例在测试上述错误函数中对错误代码的检测情况。 1 ) 测试用例a :在该用例中a 值为0 ,故函数语句执行顺序为:2 3 4 一1 3 , 输出结果为0 。可以看出,该测试用例使得错误e 并没有被执行,于是,程序输出结 果是正确的。所以,该测试用例并不能发现该处错误。 2 ) 测试用例b :在该用例中,易知函数执行语句顺序为:2 3 6 7 8 9 1 3 ,输出结果为1 。该测试用例虽然使错误e 得到了执行,但是并没有改变变量y 的 赋值结果( y 正常应为0 ,现在仍为0 ) ,所以,程序的接下来的执行并产生的输出结 果也还是正确的,所以该测试用例也没有发现错误e 。 3 ) 测试用例c :该用例使得程序的语句执行顺序为:2 3 6 7 8 9 一1 3 , 输出结果为l 。在该用例执行测试过程中,错误e 首先得到了执行,然后,将该错误 传染给了变量y ,即改变了变量y 的数据状态,但是当程序执行到第8 条语句时,变 量y 错误的数据状态并没有继续向后传播,也就是说,程序接下来的执行效果与程序 正确编写时的执行效果是等同的,所以,由于在该处错误e 的传播被“停止”了,从 而导致程序的测试结果仍是正确的,故该测试用例也并没有发现错误e 。 4 ) 测试用例d :当测试执行该用例时,程序语句的执行顺序也为2 3 6 7 8 9 一1 3 ,输出结果为1 。但是,程序正确的执行顺序为2 3 6 7 8 一1 1 1 3 , 输出结果为0 ;所以,该测试用例能够使得程序错误e 首先被执行,并且错误e 被传 南京航空航天大学硕士学位论文 染给了其后的数据状态,错误的数据状态通过层层传递,最终导致程序输出结果错误, 这样,就得到了程序中存在错误的结论。 由上例可以看出,如果在测试过程中程序错误并没有导致程序失效,那么,可能 是由于以下原因:1 ) 程序错误根本就没有得到执行;2 ) 程序错误虽然被执行了,但 并没有导致其后的数据状态发生错误变化:3 ) 错误的数据状态并没有被继续传播到 程序输出。所以软件故障只是软件失效的充分条件而非必要条件,软件故障导致软件 失效是由一系列子过程共同决定的,其中任何一个子过程都可能终止软件错误向软件 输出结果的传播,如果该传播过程被终止了,那么软件失效便不会发生,测试也就不 能如期发现软件故障。 为了能够预测测试过程中软件错误被揭示的概率,可测试性分析的技巧应该能够 预测软件错误是否能被执行,被执行的软件错误是否会导致数据状态错误,以及错误 的数据状态错误是否会被传播到程序输出中。如果数据状态错误并没有传播到任何数 据输出中,就可以说数据状态错误被”取消”了,如果测试中所有的数据状态错误都被 取消了,那么引起该数据状态错误的错误便没有被发现,于是便导致了该程序的低可 测试性。 2 2 3 软件故障,失效模型 软件故障失效模型的理论基础是前面所讨论的软件故障导致软件失效需要三个 充分必要条件: 1 ) 程序的输入使这个软件故障得到了执行: 2 ) 被执行的故障使该程序位置之后的数据状态发生变化( 错误) ; 3 1 错误的程序数据状态被传播到程序输出,并使输出结果错误( 产生失效) 。 这三个充分必要条件实质上也反映了故障产生失效的整个过程( 如图2 2 1 所 示) 。总的来说,软件故障导致软件失效的整个过程是一个顺序的过程,在程序执行 故障之后,这个故障使该故障之后的数据状态被传染,即在故障被执行的条件下程序 的数据状态才能被传染;在数据状态被传染之后,经过若干次的迭代过程,错误的数 据状态将该错误传播到程序的输出,即在程序数据状态被传染的条件下才会传播到程 序的输出。只有当这三个条件都满足时,故障才能产生失效,才能被检测出来。 图2 2 1 故障导致失效的过程 由j e f f r e ym v o a s 的可测试性定义,软件可测试性采用软件中的故障被检测出 - l j 软件可测试性检测技术研究与实现 来的概率来表示,因此,可以根据同时满足故障被检测出来的这三个充分必要条件的 概率来计算软件的可测试性。如果用事件e 、事件i 和事件p 分别表示这三个条件, 显然,这三个事件是相互独立的,那么,故障被检测出来的概率为这三个事件的交集, 即: p ( 故障被检测出) = p ( e n i n p ) = p ( e ) p ( i ) 十p ( p ) 因此,可测试性可以用下面的公式来计算: t e s t a b i l i t y = e ( e ) + j p o ) + p ( p ) 公式2 2 1 上述的过程便是软件故障失效模型。 2 2 4 p i e 过程检测模型 j e f f r e ym v o a s 于1 9 9 1 年提出了软件可测试性的定义,并在此基础之上,以故 障失效模型为理论基础,提出了p i e 过程检测模型【1 6 1 。 依据j e f f r e ym v o a s 对可测试性的定义,“在特定的输入分布下对程序进行随机 黑盒测试时,程序暴露故障的能力”,p i e 模型通过对某个特定程序位置的故障揭示 能力的分析来达到对其可测试性迸行检测的目的:揭示故障能力强的,其可测试性也 就越强:反之,则可测试性较弱。p i e 模型由三个子算法组成:执行分析、传染分析 和传播分析。 执行分析 执行分析评估的是一个程序位置的执行概率。 执行分析首先需要确定一个程序的输入分布。然后,对任意个特定的程序位置 l ,都做如下的工作:在输入分布中随机地选择n 个程序输入,执行程序;若在这个 n 次执行过程中,l 被执行了k 次,则程序位置l 处的执行概率为k n 。 传染分析 传染分析评估当某个程序位置包含故障,且该故障被执行时。导致程序数据状态 发生变化的概率。 传染分析的实现需要用到语法变异的注入技术。其主要步骤为:首先,在某个程 序位置l 处使用某种变异算子注入语义变异p ;然后,随机选择l 中的n 个输入数 据状态,并分别执行变化前的l 与变异后的l :最后,比较得到的结果状态,若两者 有k 次不同,则变异p 下l 处的传染分析结果( 即传染概率) 为k n 。 传播分析 传播分析评估的是变化的程序状态将其影响传播到程序输出的概率。 在此分析过程中,程序状态的变化通过改变该程序状态中的一个活动变量( 对程 序输出有任何潜在影响的变量) 的值来实现。传播分析的主要步骤为:首先改变某个 南京航空航天大学硕士学位论文 程序位置l 执行后得到的数据状态中的活动变量a ,然后,分别使用变化前的数据状 态和变化后的数据状态对l 后的程序运行n 次。若在这n 次中有k 次改变数据状态 活动变量后的程序的输出与原程序的输出不同,则改变活动变量a 时程序位置l 处的 传播概率为k i n 。 在p i e 模型的三个组成部分分别得到程序位置的执行概率、传染概率和传播概率 之后,利用这三个概率对这个程序位置的可测试性进行估计。v o a s 将程序位置的故 障揭示能力作为它的可测试性。设岛表示为程序位置l 处的故障揭示能力,则可表示 为: 孛= 睁驯+ 曙+ 酬橱日) 2 z 上式中,q ,。表示程序位置1 处在变异p ,下的传播概率,n 。表示在l 中被变异的 活动变量的个数; 。表示l 处变异i 。的传染概率,m 。表示对1 进行传染分析时所 进行变化的次数:。表示1 的执行概率。u 。、u :、m ,分别表示传播分析,传染分析 和执行分析在故障揭示能力的度量过程中所占的权重,并且,u ,+ m m ,= l 。 另外,由各个程序位置的可测试性检测结果可以得到一段程序的可测试性检测结 果。设p 为程序p 的故障揭示能力。其中,假设程序p 由n 个程序位置组成,并且, 第i ( i = 1 ,2 ,n ) 处程序位置的故障揭示能力用。来表示,则 p = 瓣孛 公式2 2 3 从以上公式可以看出,程序的可测试性结果为组成该程序的各程序语句的可测试 住值的均值。 p i e 模型对每个程序位置都要进行执行分析、传染分析和传播分析,而且,为了 使分析得出结果概率尽量精确,需要有较大的样本空闯。但这样一来,就造成了算法 的时间复杂度和空间复杂度都非常巨大,从而造成模型对资源要求很高,并且效率低 下。实践证明,j e f f r e ym 。v o a s 等人在r s t 公司的支持下,以p i e 模型为原型机, 开发了p i s c e s 可测试性检测工具包,结果其效率非常低,如对一个3 0 0 0 行代码的c 程序进行分析,却需要1 0 几个小时。 2 2 5 静态可测试性检测模型 静态可测试性检测模型1 8 】【1 明建立在j e f f r e ym v o a s 的可测试性定义基础上,即通 过静态分析源程序的方法来计算程序中语旬( 也称为程序位置) 的执行概率、传染概 率和传播概率,从而得到其可测试性。该算法的具体步骤如下: 估计执行概率。e ”: 对不同类型的语句:顺序语句、i f 或w h i l e 等条件分支语句、分支体内的语句, 一1 3 一 软件可测试性捡测技术研究与实现 分别制定一个规则用来确定其被执行的概率。 估计传染概率“i ”: 传染概率与语句的类型和语句中的操作数和操作符有关。算法为语句中每一个操 作数和操作符分别赋予一个传染权值,再取这些传染权值的均值作为整个语句的传染 概率。具体的处理方法如下: 1 如果是赋值语句,由于任何赋值号左边的变量引用错误很难预料和控制,所 以只考虑赋值号右边的操作符和操作数。另外,将常量视为变量,令其i 。a = l ; 2 如果是输入输出语句,为语句i 中的每一个输入、输出变量赋予一个唯一的 传染估计值,例如对子语句“s c a n f ( d d d ,& a b ) ”,令i a = l b = l ; 3 对于其他情况: = 去( 莩五一+ 姜五,”呻 公式2 2 4 其中: o p :赋值号右边的操作符或者条件表达式中逻辑谓词的个数; o d :赋值号右边或者条件表达式中操作数的个数; n :o p + o d = n : i i ,0 p d :操作符的传染权值。例如,令“+ ,一,”的传染权值为l ;“a r o o d b ”中m o d 的传染权值为( 【a ,b 】一1 ) , a 彻等; i i , 0 1 ) d j :操作数的传染权值: 岫= 一c o r t $ t a 娩n t :1 1 2 :j一l 公式2 2 5 其中,l 为第j 个操作数最近一次被定义的位置,i r 为位置l 的传染估计值。 估计传播概率“p ”: 对于传播概率的计算该算法与v o a s 定义的方法有很大不同,本算法只考虑程序 中引用变量的条件判定和定义其它变量的程序位置处的变量,因为只是它们对程序位 置l 的传播分析具有主要影响作用。具体计算方法如下: i 在位置l 中,找到定义的变量v ; i i 从位置l ,找到在l 执行之后引用v 的位置l ,r 是一个新的程序位置,并计 算得到i r ,记l 为l ; i i i 重复以上2 个步骤,直到达到输出语句。如果不能达到输出语句,那么i ,= 0 ,否则e l = i l r 。 这个公式的含义是将位置l 中的错误在传播过程中所经历的各个语句的传染概率 之积作为程序位置l 的传播概率。 在得到这三个子过程概率之后,便可由前面所给出的计算公式来计算可测试性: 南京航空航天大学硕士学位论文 t e s t a b i l i t y = p ( e ) + p ( ,) + p ( 尸) 公式2 2 6 从以上过程可以看出,静态可测试性分析的算法思想是将程序位置处出现的操作 符和操作数分别赋予相应的权值,然后取其均值作为该位置的传染概率:接下来,将 传播过程看作是传染过程的迭加传递,并将传染概率的计算方法用于计算传播概率, 进而得到传播概率,然后计算可测试性。 该算法简单易行,但与软件可测试性定义及故障,失效模型相比,却存在一些缺 陷,本文将在下一章内对其进行详细分析。 2 2 6 可测试性检测模型小结 国际上对软件可测试性的研究已进行了十几年,而且已有十几种检测模型相继被 提出,如域检测模型【1 4 】,敏感性分析模型【7 1 等。在此由于篇幅关系,不再一一展开列 举分析。 从实现方法上来说,现有的可测试性检测模型基本上可以分为两大类:动态检测 模型和静态检测模型。动态检测模型几乎都是以故障,失效模型为理论基础,并借助 于动态插装故障变异因子技术来实现的。它要求多次运行被测程序,通过观测变异因 子对程序结果的影响来估计其p i e 概率,进而估量程序可测试性度量指标值。该过程 虽然较为贴近实际结果,但通常实现起来效率比较

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论