已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 软件测试是为了发现错误而执行程序的过程,是保证软件质量的重要手段,是软件生命周期的重要阶 段。软件测试已经越来越引起软件用户及开发人员的关注。据统计,目前在软件开发总成本中, 用在测试上的开销婴l 片3 0 5 0 。测试本身是一项十分繁重的工作,纯粹手:r 测试己无法满足大规模 软什的需求,越来越多的测试t 作需要测试 j 具的支持。 在已有的测试工具中,源代码测试工具有着重要的应用。而c 语言作为一种表达能力强、目标代码效 率高、可移植性好的语言,在软件开发中得到普遍使用。本文提出了一整套源代码自动分析测试的解决方 案,讨论了一种基于程序插装的动态测试框架,分析了c 程序流图的构造方法,并在此基础上给 出了程序插装分析算法。最后描述了嵌入式软件测试支撑系统e t s 其中单元测试子系统e s u t k i t 的具体实现。 e s u tk i t 主要由测试覆盖率分析、时间性能瓶颈分析和内存使用分析三个工具组成。测试 覆盖率分析是一种结构测试技术,对评估测试的充分性、确定何时停止测试具有很大帮助。时间 性能是一项常用的重要性能指标,它可以用米跟踪特定程序段的实际运行情况,是实时检测的有 效手段。为提高软件的时间性能,往往需要找出软什中运行时间较长的程序段,即软件的时间性 能瓶颈。在c 语言中,引入了使用极为灵活的指针机制,它给程序员带来了很大便利,但同时也 制造了许多的麻烦。由于指针使用不当而引起的错误通常很难发现,定位错误也很困难,这时需 要专门的工具来检测内存使用错误并给予准确定位。 利用e s u tk i t 子系统,软件开发人员和测试人员可以了解在源代码级别上的软件的质量,从而对 代码进行改进,提高软件测试效率,降低开发成本。 关键字:软件测试、覆盖分析、时间性能瓶颈、内存使用分析、程序插装 a bs t r a c t s o f t w a r et e s t i n gi s a ni m p o r t a n tp h a s eo fs o f t w a r el i f ec y c l ea n da l s oap a r to fs o f t w a r ep r o d u c t q u a l i t ya s s u r a n c e ,w h i c hi st h ep r o c e s so f e x e c u t i n gap r o g r a m w i t ht h ei n t e n t i o no ff i n d i n gf a u l t s i ti s r e d o r t e d3 0 5 0 o fs o f t w a r ed e v e l o p i n gc o s ti ss p e n ti nt e s t i n g p r e s e n t l y ,p r o g r a m sh a v eb e c o m e l a r g e ra n dm o r ec o m p l e x s o f t w a r et e s t i n gi sb e c o m i n gm o r ea n dm o r ed i f f i c u l t h e n c e ,i t i sn e c e s s a r y t op r o v i d eas o l u t i o n ,s u p p o r t e db ya u t o m a t i ct o o l s ,w h i c hc a nr e d u c et h ec o s ta n di m p r o v et h eq u a l i t y o f t e s t i n g , m a n yt o o l s h a v eb e e nd e v e l o p e dr e c e n t l y ,i n c l u d i n gs o u r c ec o d et e s t i n gt o o l s ,w h i c hc a nh e l p d e v e l o p e r sa n dt e s t e r st o d e t e r m i n et h eq u a l i t yo fs o f t w a r ea ts o u r c ec o d el e v e l a sag e n e r a l - p u r p o s e p r o g r a m m i n gl a n g u a g et h a t f e a t u r e se c o n o m yo fe x p r e s s i o n ,cp r o g r a r m m n gl a n g u a g ei sw i d e l yu s e dd u r i n g s o f t w a r ed e v e l o p m e n t ,i nt h i st h e s i s ,w ep r o p o s eas o l u t i o nf o rs o u r c ec o d ea u t o m a t i ca n a l y s i sa n dt e s t t h et h e s i s p r e s e n t sad y n a m i ct e s t i n ga r c h i t e c t u r eb a s e d o np r o g r a mi n s t r u m e n t a t i o na n di n t r o d u c e st h ep r o g r a mf l o wg r a p h ( p f g ) o fcp r o g r a m s b a s e d o nt h ec o n s t r u c t i o no fp f g , t h et h e s i s p r o p o s e s t h ea r i t h m e t i co fp r o g r a m i n s t r u m e n t a t i o na n a l y s i s f i n a l l y , t h et h e s i sd e s c r i b e st h ei m p l e m e n t a t i o no ft h eu n i tt e s t i n gs u bs y s t e me s u t k i t i ne m b e d d e ds o f t w a r et e s t i n gs u p p o r ts y s t e me t s , e s u tc o n s i s t so ft h r e em a i nt o o l s :c o v e r a g ea n a l y s i st o o l ,t i m ep e r f o r m a n c eb o t t l e n e c ka n a l y s i s t o o la n dm e m o r yu s a g ea n a l y s i st o o l ,c o v e r a g ea n a l y s i si sas t r u c t u r a lt e s t i n gt e c h n i q u e ,w h i c hh e l p s t e s t e r st oe v a l u a t et h es u f f i c i e n c yo fs o f t w a r et e s t i n ga n dd e t e r m i n ew h e nt o s t o pt e s t i n g t i m e p e r f o r m a n c e b o t t l e n e c ki sa n i m p o r t a n t c r i t e r i o ni ns o f t w a r e t e s t i n g 。i n o r d e rt o i m p r o v e t h e p e r f o r m a n c e o ft e s t e d p r o g r a m ,g e n e r a l l yw es h o u l d f i n dt h et i m e p e r f o r m a n c eb o t t l e n e c k o ft h a t p r o g r a m ,a n d t h e n m o d i f y t h e s e p a r t s i n c p r o g r a m m i n gl a n g u a g e ,p o i n t e r m e c h a n i s mm a k e s p r o g r a m m e r s c o n v e n i e n tt ow r i t e p r o g r a m s ,b u t a l s o b r i n g sm a n yp r o b l e m s e r r o r s a r o u s e db y u n s u i t a b l ep o i n t e ru s a g ea r e a l w a y s d i f f i c u l tt ob ef o u n do u ti tn e e d s s p e c i a l t o o l st oc h e c kt h e m e m o r yu s a g eo ft h ep r o g r a ma n df i n do u te r r o r sa b o u tp o i n t e ru s a g e , u s i n ge s u tk i t ,d e v e l o p e r sa n dt e s t e r sc a nd e t e r m i n et h eq u a l i t yo fs o f t w a r ea t s o u r c ec o d e l e v e l ,w h i c hc a ni m p r o v et h et e s t i n ge f f i c i e n c ya n dd e c r e a s et h es o f t w a r ed e v e l o p i n gc o s t , k e y w o r d s :s o f t w a r et e s t i n g ,c o v e r a g ea n a l y s i s ,t i m ep e r f o r m a n c eb o t t l e n e c k ,m e m o r yu s ea n a l y s i s p r o g r a mi n s t r u m e n t a t i o n 东南大学学位论文 独创性声明及使用授权说明 沁s i 秘孕; 一、学位论文独创性声明 本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及 取得的研究成果。尽我所知,除了文中特别加以标注和致谢的地方外,论 文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得东南大 学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对 本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。 签名:堕叁日期: 二、关于学位论文使用授权的说明 0 神,j 东南大学、中国科学技术信息研究所、国家图书馆有权保留本人所送 交学位论文的复印件和电子文档,可以采用影印、缩印或其它复制手段保 存论文。本人电子文档的内容和纸质论文的内容相一致。除在保密期内的 保密论文外,允许论文被查阅和借阅,可以公布( 包括刊登) 论文的全部 或部分内容。论文的公布( 包括刊登) 签名:堕垒!导师签名 大学研究生院办理。 日期 山一,3 查塑查兰堡二l :堂些堡苎 1 1 选题依据 第一章引言 随着软件规模的不断扩大,程序复杂度的提高,软件测试变得越来越困难,纯粹手工测试已无 法满足人规模软件的需求,越来越多的测试t 作需要测试工具的支持。在已有的测试t 具中,无论 是原型系统m 5 1 还是应用系统睁”,源代码测试工具有着重要的廊用。源代码测试工具可以帮助开发 人员和测试人员了解在源代码级别上的软件的质量,主要包括:代码的执行时间瓶颈、代码执行的 覆盖率统计、是否存在数组越界、分配内存未释放等状态。 论文研究的目的旨在通过对实时嵌入式操作系统平台下的a n s ic 程序的分析,记录程序在实 际执行过程中的信息,研究测试覆盖率分析、时间瓶颈分析、内存使用分析等方面的应用,最终实 现一个源代码测试系统。 1 2 软件测试的目标与意义 人们研究使用计算机,开发程序完成预定的任务已有5 0 多年的历史。在多年的软件开发测试中, 人们积累了许多成功的开发经验,也总结出不少失败教训,逐渐认识到软件测试在成功的软件开发 中的重要意义。但是,究竟什么是软件测试i l “”j ,人们对这一基本概念很长时间以来存在着一定的 误解。测试程序自然是为了提高程序的质量和可靠性,提高程序的可靠性就意味着发现并改正程序 中的错误。所以,进行测试,1 ;应拦为了显示程序是好的,而应从程序中含有错误这个假定出发去 测试程序,从中发现尽可能多的错误。所以从根本上说,软件测试是为了发现错误而执行程序的过 程。软件测试的目标是以各种有效手段通过对软件的分析和运行尽可能多的发现程序中的错误,使 产出投入比达到最大。 随着软件开发的规模越来越大,软件越来越复杂,会出现软件开发效率不高,质量无法保证的 问题,这需要在软件工程的各阶段予以改善解决。 止如任何生产过程离不开产品质量检测一样,在计算机软件的开发中测试工作是必不可少的。 软纠测试在整个软件开发过程中占有非常突出的重要位置,无论怎样强调软件测试的重要性以及它 对软件质量的影响都不会过分。 软件测试可以使软件质量得到不断的改善,提高软件的可靠性、稳定性和执行效率。软件测试 为软件质量定量评定提供依据,通过软件测试可以验收软件功能、性能、容量、约束和限制等是否 满足软件需求和系统任务所规定的要求,这对软件评价、验收及管理工作都具有十分现实的意义。 1 3 主要工作 根据国内外在源代码级测试工具方面的研究、开发现状,以及最新发展动态,我们拟在测试覆 盖率分析、时间瓶颈分析、内存使用分析几个方面对测试系统的设计与实现展开深入研究。具体而 言,论文将在以f 几个方面展开研究。 ( 1 ) 测试覆盖率分析 测试覆盖率分析足一种结构测试技术,对评估测试的充分性、确定何时停止测试具有很大帮助。 测试覆盖率分析是一种自盒测试技术。,“义一e ,测试覆盖率分析包括检测未被测试用例激活的代码、 构建更多的测试用例以提高覆盖率、榆测冗余的测试用例以及给覆盖率一个定量的度量等等。 东南大学硕十学位论文 ( 2 ) 时间性能瓶颈分析 时间性能是一项常用的重要性能指标,为提高软件的时间性能,往往需要找山软件的时间性能瓶颈。 对于时间百分比较高的测试实体,说明该实体是程序的一个时间性能瓶颈,应予以修改,从而提高程序的 执行效率。 ( 3 ) 内存使用分析 c 语言中内存管理的困难是众所周知的,目前已经有一些方法试图解决这类问题。在本文中,我们主 要研究内存泄漏、数组越界、指针空挂、凄取未初始化内存等几种常见的内存使用错误。 1 4 论文结构 本文各主要章节内容安排如下: 第一章作为整个论文的绪论,介缁相关的背景知识,描述论文的研究方案,在给出研究内容、方 法和工具后,简要地介绍论文结构。 第二章介绍有关软件测试技术及其各自特点,包括静态测试技术及动态测试技术。 第三章介绍程序插装的概念与方法,提出了一种基于程序插装的动态测试框架。 第四章详细讨论程序结构图的构造和插装点的选取,在此基础上,讨论了相关的插装算法。 第五章具体讨论关于系统实现的一些细节,包括系统基本框架、数据结构等问题,最后给出了利 用该系统分析得出的数据。 第六章是对整个论文研究和实践工作的总结。综述我们在c 程序分析与测试辅助技术研究领域 获得的成果,以及在其它相关领域所做的研究工作,并且指出我们现有工作的局限性和有待提高及 改进的方面,简要阐述我们正在进行或将要进行的研究工作。 2 东南大学颂二匕学位论文 第二章软件测试基本技术 从上一章的内容可知,软件测试的日的是要在资源和进度允许条什下尽可能多地发现软件错 误,从而使软件质量得到提高。本章将从软件测试技术角度进行分析来实现这个目标。这些测试技 术的采用使软件测试高效、高质量地完成有了技术保障。虽然软件测试技术在不断发展,但传统的 几种基本技术仍然适用0 。1 ”。按使用的测试技术不同可以将测试分成以下介绍的几类。 2 1 静态测试技术 静态测试是不执行程序代码而寻找程序代码中可能存在的错误或评估程序代码的过程。静态测 试可以手工进行,也可卧借助软什t 具自动进行。 静态测试包括主要由人工进行的代码审查、走查以及主要由软件工具自动进行的静态分析。下 面将对这几种技术进行简单介绍。 2 1 1 代码审查 代码审查( 包括代码评审和走奁) 主要依靠有经验的程序设计人员根据软件设计文档,通过阅 读程序来发现软什错误利缺陷。代码审查一般按代码审查单阅读程序,查找错误。其内容包括:检 查代码和设计的一致性;检查代码的标准性、可读性;检查代码逻辑表达的正确性和完整性;检查 代码结构的合理性。代码审查虽然在发现程序错误上有一定的局限性,但它不需要专门的测试工具 和设备,且具有一日发现错误就能定位错误和一次发现一批错误等优点。 一个代码审查组通常由四人组成,其中一人为组氏,组长是关键,最好是一个称职的程序员, 但不是被测试程序的编写者,也不需要对所检查的程序很熟悉,但需要较强的组织协调和语言能力。 组长的职责包括分配资料、安排计划、主持会议、记录并保存被发现的错误。其余成员包括资深程 序员、程序编写者与专职测试人员。根据测试的组织方式( 如内部测试和独立测试) 不同,代码审查 小组组成可以调节,但组长角色不能变动。 审查的范同比走查广泛得多,它具有五个基本步骤:综述、准备、审查、返工和跟踪,这一过 程中的每一步都是正规化的。这种正规化体现在:仔细地区分错误的类型,并将这些信息运用在后 继阶段的文档审查中以及米来产品的审商中。 审查是检测错误的一种优秀的方法,使用审查能使错误在软件过程的早期就被发现。这就是说, 在修改的代价变得昂贵之前就可发现。 2 1 2 代码走查 代码走查与代码审查相似,它也是由一组程序和错误检查技术组成,只是程序和错误检查技术 不完全相同。 代码走查以小组方式进行。其中包括:组睦,类似代码审查组| 受;秘书,负责记录发现的错误; 测试人员,应是具有经验的程序没计人员,或精通程序设计语言人员,或从未介入被测试程序的设 计工作的技术人员,这样的人没有约束,比较容易发现问题。 走查的步骤要比审查要少,而且没有审查那样正规。相对丁审查的五个步骤,走查过程只有两 步:首先是准备,然后走查组对程序及文档进行分析。 2 1 3 静态分析 静态分析主要对程序进行控制流分析、数据流分析、接e 1 分析和表达式分析等。静态分析一般 由计算机辅助完成,对计算机程序进行分析,根据程序设计语言的不同,相应的静态分析工具也不 东南大学硕士学位论义 同。 2 1 4 静态测试技术特点 ( 1 ) 静态测试1 i 必动态地运行程序,也就不必进行测试用例设计和结果判读等t 作a ( 2 ) 静态测试可以由人l ,进行,充分发挥人的思维优势,实践证明行之有效,对一个软件的测试 原则上从静态测试开始。 ( 3 ) 静态测试实施不需要特别条件,容易开展。这可以从前两条特性中推论而出。 2 2 动态测试技术 动态测试主要指根据程序的具体运行来设计测试数据,并分析程序执行结果以发现错误的过程。 根据测试理论,如果测试数据满足一定要求,通过测试可以发现程序中大多数错误,并且可以依据 一定的标准对测试后的程序质量( 正确性、可靠性等) 进行定量评估。动态测试包括三个基本步骤: 生成测试数据、执行程序与验证程序的输出结果。其中最重要的问题是测试数据的生成策略,它是测 试有效、高效的关键。 动态测试叉分为黑盒测试和自盒测试两大类,下面将做具体介绍。 2 2 1 黑盒测试 黑盒测试( b l a c k ,b o xt e s t i n g ) 是一种从软件需求出发,根据软件需求规格说明设计测试用例,并 按照测试用例的要求运行被测程序的测试方法。它较少关心程序内部的实现过程,侧重于程序的执 行结果,将被测程序看成是不可见的黑盒子,因此被称为黑盒测试。黑盒测试着重于验证软件功能 和性能的正确性,其典型测试项目包括功能测试、性能测试、边界测试、余量测试、强度测试等。 黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每 个功能是否都能正常使用。在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进 行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用程序是否能适当地接收输入 数据而产生正确的输山信息,并且保持外部信息( 如数据库或文件) 的完整性。黑盒测试方法主要 有等价类划分、边值分析、因果图、错误推测等,主要用于软件确认测试。“黑盒”法着眼于程序 外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试, 只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试 情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测 试。 2 2 2 白盒测试 白盒测试( w h i t e b o xt e s t i n g ) 是一种按照程序内部的逻辑结构和编码结构设计并执行测试用例 的测试方法,它的基本思想是:既然程序的结构和逻辑是为实现某种设计构造的,那么通过考察这 些结构和逻辑在运行中的实际作用,就能验证它们是否符合设计要求,为了让特定的结构和逻辑在 程序运行中实际运转起来,我们就必须确定一组特定的输入作为测试数据。 自盒测试通常根据覆盖准则设计测试用例,尽量使程序的每个语句、每个分支条件、每个控制 路径都在程序测试中受到检验,所以,白盒测试需要跟踪程序的执行路径。 白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品 内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条 通路是否都有能按预定要求正确工作,而不顾它的功能,自盒测试的主要方法有逻辑驱动、基路测 试等,主要用丁软件验证。 “白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。“白盒”法是穷举路径测试。 4 垄堕查兰堡圭堂垡笙生一 在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯 穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试 不能查出程序违反了设计规范,即程序本身是个错误的程序;第二,穷举路径测试不可能查山程序 中冈遗漏路径而出错;第三,穷举路径测试可能发现不了。些与数据相关的错误。 我们知道,程序由控制平i i 数据两人冈紊构成对这两方面因素的考察构成了白盒测试的两类主 璎技术:控制流测试和数据流测试。 ( 1 ) 控制流测试 控制流测试依据作为程序结构模型的控制流程图产生测试用例,通过对不同控制结构成份的测 试逐步验证程序的控制结构。顺序结构和分支结构是构成程序结构的基本元素,通过顺序结构和分 支结构的组合,形成程序路径。 所谓验证某种控制结构即指使这种控制结构在程序运行中得到执行,也称这一过程为覆盖。不 同的覆盖技术考察不同层次的结构,也反映出测试的全面性和彻底性m “1 。基于附带考察对程序结 构测试的完备性,称为测试覆盖准则。为了达到覆盖,我们根据程序结构及要执行的路径形成测试 用例。 语句覆盖 语句覆盖是域起码的测试要求,因为某条语句含有错误而它在测试中没有执行,这个错误就 不可能被发现。语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。 分支覆盖 分支覆盖要求设计足够多的测试用例,使程序中的每一个分支至少通过一次,即每一条分支语 句的真值执行一次,假值也执行一次。 条件覆盖 条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果。 - 条件组合覆盖 条件组合覆盖要求设计足够多的测试用例, 然这个选法能包含“条件覆盖”和“分支覆盖” 路径覆盖 使得每个判定中条件的各种组合至少出现一次。显 的各种要求。 按路径覆盖要求设计足够多的测试用例,使程序沿所有可能的路径执行。 ( 2 ) 数据流测试 数据流测试是用控制流程图来分析数据异常。并从揭示数据异常的角度确立测试路径选择准则, 这些准则能填补路径覆盖、分支覆盖和语句覆盖之间的距离,比较策略、通用、有效,而且有一定 的工具支持。 数据流测试通过一定的覆盖准则检查程序中每个数据对象的每次定义、使用和消除。 2 2 3 动态测试技术特点 ( 1 ) 实际运行被测试程序,取得程序运行的真实情况、动态情况,进而进行分析。实际运行需要 运行环境、输入数据及输出处理,有时还需有控制运行的手段。 ( 2 ) 必须生成测试数据来运行程序,测试质量依赖于测试数据。 ( 3 ) 生成测试数据、分析测试结果工作量大,使开展测试工作费时、费力。 ( 4 ) 动态测试中涉及多方面工作,人员多、设备多、数据多,要有较好的管理和工作规程。 ( 5 ) 动态测试常刚于模块测试和集成测试阶段。 东南大学硕十学位论文 2 3 软件测试的步骤 一个大型软什系统通常由若干个子系统构成,每个子系统又由若干模块构成。软什测试分以下 几个步骤: ( 1 ) 模块测试:又称单元测试,在这个测试步骤中发现的往往是编码和设计的错误,目的是检杏 每个模块是否能独立地准确运行。 ( 2 ) 子系统测试:又称集成测试,把经过模块测试运行正确的模块放在一起形成子系统后再测试。 主要测试模块间的协调和通信问题,测试该系统足否达到功能要求。 ( 3 ) 系统测试:把经过测试运行准确的子系统组装成完整的系统后再进行测试。在这个过程中不 仅能发现设计和编码的错误,还验证系统是否能提供需求说明书中指定的功能,系统的动态测试是 否符合预定要求。在这个测试步骤中发现的往往是软件设计中的错误,也可能发现需求说明书中的 错误。 ( 4 ) 验收测试:把软件系统作为单一的实体进行测试,测试内容与系统测试基本类似。但它是在 用户积极参与r 进行的,主要使崩实际数据进行测试,目的是验证系统是否满足用户的需求。在这 个步骤中发现的往往是系统需求说明书中的错误。 ( 5 ) 平行运行:比较重大的软件产品在验收之后往往不立即投入生产性运行,而是要经过一段试 运行时间。平行运行就是此时新开发的系统与原先老系统同时运行,以便比较新旧两个系统的处理 结果。 以上方法都是在机器上测试程序,此外还有人工测试,即用程序审查会和人工运行方法查找错 误,特别对逻辑设计和编码错误采用人工测试相当有效。 在软件测试的几个步骤中,单元测试是在软件开发过程中要进行的虽基本的测试活动。在单元 测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。 在一种传统的结构化编程语言中,比如c ,要进行测试的单元一般是函数或子过程。在如c + + 这样的面向对象的语言中,要进行测试的基本单元是类。对a d a 语言来说,开发人员可以选择是在 独立的过程和函数,还是在a d a 包的级别上进行单元测试。 单元测试不仅仅是作为无错编码的一种辅助手段在开发过程中使用,单元测试必须是可重复的, 无论是在软件修改,或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统 的生命周期中进行维护。 经常与单元测试联系起来的另外一些开发活动包括代码走读、静态分析和动态分析。静态分析 就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行; 动态分析就是通过观察软件运行时的动作,来提供执行跟踪、时间分析以及测试覆盖度方面的信息。 本文在后面的章节中,针对单元测试阶段的测试覆盖率分析、时间瓶颈分析、内存使用分析等 几方面问题,进行了比较深入的研究,并设计和实现了相应的测试系统。 6 查塑盔兰堡主堂笪丝苎 第三章基于程序插装的动态测试 根据是否执行被洲程序,软件测试技术可分为静态测试和动态测试。静态测试是指不实际执行程序, 只对程序进行词法、语法分析,静态分十厅程序的可能执行情况:动态测试则完成对被测程序的一次实际运 行,记录分析程序的实际执行情况。相对丁静态测试而言,动态测试分析的结果更加精确。本文所设计的 系统是一个单元测试阶段的动态白盒测试系统。 3 1 基本概念 为了获得被测程序的动态执行信息,需要对其进行跟踪,一般使用插装方法”。”1 。所谓插装就是在 保持被测程序的逻辑完整- 肚的基础上,在被测程序的特定部位插入一段检测程序( 又称探针函数) ,通过 探针的执行抛出程序的运行特征数据。基于这些特征数据分析,可以获得程序的控制流及数据流信息,进 而获得逻辑覆盖等动态信息,这样就可以在被测程序执行的过程中动态地同步执行程序的检测工作。 插装方法又分为泺代码级程序插装( s c i ) 和目标代码级程序插装( o c i ) 。利用o c t 技术插装后不用 对被测代码进行重新编泽,效率较高,而且可以分析没有源程序的第三方代码。为了充分探明利i = jo c i 技 术进行代码分析的有关问题,我耵j 已经在c a t e r 系统中对测试覆盖率、时间性能瓶颈的有关问题进 行了比较深入的研究p j 。但o c i 技术本身也存在着几个缺陷:第一,实现起来难度较大,因为这涉及到 厂家对语言的具体实现和操作系统的一些底层机制,这些机制往往是保密的;第二,由于编译器对源代码 的编译过程中进行了某种优化,对于分支结构生成与之等价的非分支指令。所以利用o c i 技术无法获得源 代码的结构信息,在覆盖率统计时,只能达到函数覆盖和语句覆盖,无法对分支覆盖、条件覆盖等覆盖标 准进行计算。 相比较而言,s c i 技术简便易行,效率也比较高。对源代码进行词法、语法分析后,可以按各种标准 进行插装,分析计算山在各种标准下的测试数据。 程序插装在实践中应用j “泛,可以用来捕获程序执行过程中变量值的变化情况,也可以用来检测程序 的语句覆盖利分支覆盖等逻辑覆盖情况。程序插装的关键技术包括要探测哪些信息、在程序中什么部位设 置探针、如何设计探针、以及探针函数捕获数据的编码和解码。 3 2 动态测试的框架 动态测试必须在静态测试部分获得的被测程序的结构信息、静态数据信息、控制流信息等基础上,应 用插装技术向被测程序中的适当位置植入相应类型的探针,通过运行带有探针的被测程序而获得程序运行 的动态数据。 动态分析要通过运行被测程序来测定程序的各种指标,如覆盖率、时间性能、内存使用等等,实现动 态分析的关键技术是程序插装。程序插装借助于插入到源程序中的监控语句来收集执行信息,以达到揭示 程序内部行为和特性的目的。利用动态分析,可以查找静态分析不能找到或不易找到的错误。 图3 2 1 所示的基于程序插装的动态测试框架分为4 个主要的阶段: ( 1 ) 插装交互与动态测试信息分析; ( 2 ) 插装阶段; ( 3 ) 插装库制作阶段; ( 4 ) 测试实施阶段。 插装交互与动态测试信息分析是软件测试工具与用户交互的界面。用户通过该界面选择要进行动态测 试的程序模块,_ _ 】f :产生相应的插装选择记录文件。用户还可以通过该交互界而浏览动态测试结果信息,在 东南人学硕士学位论文 软件测试上具的实现上采用可视化的方式显示这些动态信息。 插装阶段实现了在被测程序中植入探针,并生成带有插装信息的渊文件。在此过秽中,首先将被测程 序经过顶处理展开为不包含宏、条件编译年头文件的文件格式。然后,按照定的插装策略,根据前面生 成的插装选择记录文t | :,将探针函数加载到该文什中,晟后生成插装后的程序a 插装库制作阶段的目的是生成插皴序中的探针函数,它含有插装语旬调用的函数及其函数的定义。显 然,插装过程中生成的目标文件中含有探针函数的桩( s t u b ) ,而探针函数的实现恰恰在本过程完成。需要 指出的是,插装库的制作过程是独立于动态测试过程之外的,可以与软件测试工具开发同步。 测试实施阶段将捕装过程生成的文什与插装库制作过程生成的插装静态库连接生成带有插装信息的 司执行文件,选取测试用例,运行凄稗序,可以获得被测程序的动态跟踪信息。 播装阶段 图3 2 1 基于程序插装的动态测试实现原理图 在以上四个阶段中,其中的插装交互与动态测试信息分析与测试实施阶段是测试人员的可视部分,通 过这两部分,用户与系统交互,完成测试工作。而插装阶段与插装库制作阶段对测试人员是不可见的,在 后台完成,对于用户而言,这两部分是完全透明的。 在性能方面,采用插装方法应尽量减少插装开销。为了达到不同的统计目的( 如语句覆盖、分支覆盖 等) ,应尽量减少插装次数。若能仅仅插装一次就能完成多种类型的统计,则可使插装代码得到优化。此 外应尽量减少插装代码的数虽,减少插装代码的运行次数,从而达到减小插装代码运行开销的目的。特 别是对于些实时系统的测试,在这方面的要求尤为苛刻。 3 3 动态测试的数据流模型 从动态测试过程的框架中可以看出,动态测试过程中有多次数据交换与共享操作。图3 , 3 1 描述了动 态测试过程中的数据流图,体现动态测试过程中各个阶段生成的数据。 被测艘序源文件+ c :趟由h j 户选择的被测工程所包含的所有c 文件; 。预处理展开文件4 i :该文什是将被测程序经过预处理展开为不包含宏、条什编译和头文件的文件格式: 查堕查堂型:邑垡鱼三! 一 插装选择记录文件+ i l l s :对被测程序进行分析,记录其探针的插装点及探针类型,对于源代码的插装, 采用词法语法分析方法,生成该记录文件: 口旱文件+ m a k :记录r 被测t 程包含的所有文件信息; 插装后的文件+ r 根据预处理展开的文件+ ,j 和插装选择记录文件+ m s ,按照一定的插装策略将探针植 入被测程序中: 插装后程序生成的目标文件+ o u t :根据工程文件+ m a k 和插装后的文件+ _ s ,编译生成+ o u t ; 插装库源文什s t u b 1 i b :该文件在插装库制作完成后生成,含有生成插装库中的探针函数a 将该文件与+ s 编译后的目标文件链接,使得生成的可执行文件中含有探针函数的桩( s t u b ) ; 含有插装信息的可执行文件m e x e :+ s 编译后的日标文件和s t u bl i b 链接后生成的可执行文件,执行该文 件,在适当的位置触发探针,可以动态记录下程序的执行情况; 动态跟踪数据文件+ o u t :该文件是被测程序动态运行过程中由植入的插装探针函数创建r 记录的程序的 执行轨迹。通过适当的编码方式,可以使不同类型的动态测试信息共存于一体a 3 4 插装策略 图3 3 1 动态测试过程的数据流图 在对被测程序进行静态分析并植入探针生成插装后的文件过程中,必须考虑相应的插装策略。 插装策略是讨论如何在程序中植入探针,包括植入的位置和方法。本文着重研究测试覆盖率分析、 时间性能瓶颈分析和内存使用分析。因此,按照探针要完成的任务类型,将探针策略分成5 种类型: 判定与初始化探针、语句覆盖探针、分支覆盖探针、时间探针和内存使用探针。 判定与初始化探针;在每个函数的方法体中的第一块开始处植入该探针,该探针能否被触发,取决于该 函数是否被执行,如果执行,探针可以记录下函数的执行次数和本次进入时刻。此外,对于m a i n ( ) 函数, 还需要负责创建数据跟踪文件; 语句覆盖探针:为了提高效率,采用了以“块”为单位的语句插装,一个语句块只被插装一次。所谓“块”, 是指逻辑上连续执行的最火的语句序列。一条语句所在的块被执行,该探针即被触发; 分支覆盖探针:在c 语青中,分支结构分为i f 、i f - e l s e 、s w i t c h c a s e 、w h i l e 、d o - w h i l e 、f o r 几种结构。 无论哪种分支结构都含有条件判定,而分支覆盖探针则是对条件表达式的值进行跟踪; 时间探针:在指明时问跟踪的位置,植入时间探针函数以截获系统时问; 9 东南大学坝士学位论文 内存使用探针:在指针、数组声明,内存中请、使用、释放的位置,植入内存使用探针咀记录内存使用 情况。 3 5 目标代码插装技术 插装方法可分为源代码级程序插装( s c i ) 荆l 目标代码级程序插装( o c i ) 。上面介绍的都是源代码 插装技术,s c i 技术简便易行,效率也比较高。但是它有两个缺陷,一是要对不同的语言甚至同一语言的 不同版本作不同的处理,二是无法分析没有源程序的第三方代码。v i s u a lc + + 作为一种常用的编程环境, 它本身使用了大量第三方代码,如果不能够对这部分进行分析,将无法发现一些潜在的错误。o c i 技术实 现起来难度较大,因为这涉及到厂家对语言的具体实现和操作系统的一些底层机制,这些机制往往是保密 的。但一旦掌握这些技术,工具就可以适用于同一操作系统下的多种语言( 它们的目标代码的格式基本相 同) ,还能够对第三方代码进行分析。在【9 1 中,我们对一个基于o c i 技术的测试系统的设计与实现做了详 细的介绍,该系统可以对c 十十程序进行语句覆盖、函数覆盖及时间性能瓶颈分析。 下面我们对o c i 方法做一一个简要的介绍。 系统实现主要分为预处理、测试执行和结果汇总3 个阶段,工作流程如图3 5 1 所示,系统主要工作 是围绕断点而进行的。在预处理阶段,首先静态分析被测程序的目标代码,查找待测程序中源代码各语句、 函数入口点在目标代码中的对应位置,然后在相应位置插入断点;在测试执行阶段,启动调试进程,当被 测程序执行到断点处时,响应断点信息,在相应的断点处完成相应的统计操作;在结果汇总阶段,根据各 断点处的统计结果,按不同的统计角度进行归并、综合,得到最终的统计数据。 ( 1 ) 被测代码预处理 在测试预处理阶段对被测程序的目标代码进行分析,可阻获得目标代码与源代码中语句、函 数的对应关系。在目标代码中为相对应的源代码的每条语句及每个函数的入口点插入断点”,”】。对 于第三方代码,只要其目标代码格式与v c 60 下生成的目标代码格式一致,我们就可以用与分析用 户代码同样的方法获取信息。获取断点的信息后,为所有的断点建立断点链表。同时建立语句及函 数的信息链表,供随后的测试执行阶段存储信息。预处理流程如图3 5 2 所示。 图3 5 1 系统的工作流程 图3 5 2 预处理阶段的工作 ( 2 ) 测试执行阶段 利用o c i 技术,我们把测试执行看作足一个在被测进程和检测进程间不断切换的过程。每当被测进程 遇到断点,就会将自身 阵起,同时发送消息唤醒检测进程,检测进程根据当前断点的地址在断点链表中查 找相应节点,并查找对应的语句或函数信息,记录该语句或函数的执行次数、到达或离开的时刻,供以后统 计之用a 然后,将插入的断点信息去除,恢复原来的指令,转入被测进程继续执行。在转入被测进 g 之前, 必须将上一个断点处的断点恢复( 上一个断点处的断点在指令运行时被去除了) 。具体流程如图3 53 所示 o 查塑查堂堡! 堂篁鲨苎 为了对被测程序进行调试,首先要创建调试进稗” ”】。w i n 3 2 调试a p i 以w a i t f o r d e b u g e v e n t 函数为 中心,在产生或连接一个进群之后,调试器调用w a i t f o r d e b u g e v e n t 产生一个指向d e b u g e v e n t 结构 的指针,根据调试事件进行相应的操作。无论何时w a i t f o r d e b u g e v e n t 给调试器反馈个事件,子进程的 所有作用将被冻结。调试器不必担心子进程的所有线程挂起,不管何时用这个事件去惆用 c o n t i n u e d e b u g e v e n t 函数,都会使该进程重新运行。w i n 3 2 调试器的核心是循环调用两个a p i 函数: w a i t f o r d e b u g e v e m 和c o n t m u e d e b u g e v e n i ,直到附试器接收到一个e x i l p r o c e s s _ d e b u g _ e v e n t 凋 试事件为止。 为了统计每个函数执行的时间,不仅要在每个函数的入口点插入断点,记录下进入时的时刻正。,还 需在每个函数的出口点插入断点。但不能简单地在函数的结尾处设一个断点,因为一个函数的出口可能有 多个。我hj 采取的方法是在每个函数的第一条指令上获得控制权,读出栈顶e s p 寄存器的值( 返回地址) , 保存并写入一个固定地址。这样,在函数返回时,会返同到该固定地址,在这固定地址上写入断点( 0 x c c ) , 在函数结尾时获得控制权,记录函数的出口时刻t o 。,该函数本次执行所花费的时间就是兀。一正。 陌司 蹩型蚓 响应断点消息i 仝 山 7 毛 l 据当前地址在断点 各 项 日攒居。 统 计 结 琏表中查找相应节 o 完毕7 果 ;,并查找对应的行 或函数信息 山 l 记录行或函数的 汇 l 执行次数、时间否 总 山 ! e 复上一次断点 山 陋除当前断点tj、e= 。 l 恢复原指令i 7 i 垫! ! i 、 图3 5 3 测试执行阶段工作流程 ( 3 ) 数据统计与结果汇总 在测试执行阶段,调试器接收到e x i t _ p r o c e s s _ d e b u g _ e v e n t 调试事件时,结束调试进程,进 入结果汇总阶段。根据各断点处的统计结果,按n n n - 矧, f n 度进行归并
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全体员工大会方案
- 关于某某个人数字遗产继承与执行委托合同
- 音综现场乐队全景解析
- 静脉全身麻醉宣教
- 静电技术课程介绍
- 厂房消防安全培训
- 考研经济联考试题及答案
- 池州学院物理试卷及答案
- 中考短文填空真题及答案
- 2025深圳市考驾照题库及答案
- 240T循环流化床锅炉使用说明书
- “农药水悬浮剂加工及贮藏中的常见问题及其对策”课件
- 铁路下穿高速公路安全评价报告
- 农民工工资舆情应对培训交底资料
- 人教部编版八级历史上册八国联军侵华与《辛丑条约》签订优秀课件ppt
- 楼宇自控系统报价清单
- Q∕GDW 11421-2020 电能表外置断路器技术规范
- 商旅服务方案(详细版)
- 激光切割机使用说明书
- 40000t高密度澄清池设计计算书
- 电工仪表与测量课堂教案
评论
0/150
提交评论