




已阅读5页,还剩63页未读, 继续免费阅读
(计算机科学与技术专业论文)基于缺陷模式的自动测试技术及约束满足问题的研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京邮电大学硕士学位论文中文摘要 基于缺陷模式的自动测试技术及约束满足问题的研究 摘要 随着计算机技术的飞速发展,人们对计算机的需求和依赖与日俱 增。计算机软件的应用领域正在进一步的扩大,伴随而来的就是软件 的规模和复杂性的不断增加,这给软件测试提出了更高的要求。软件 测试自动化是提高软件测试效率的有效手段,自动化应该体现软件测 试的各个阶段,尤其是缺陷的自动检测以及测试数据的自动生成,其 中后者涉及的领域更大,而约束满足问题是其中最为重要的环节之一, 所以对于约束问题的研究具有重要的理论意思和广阔的应用前景。 本文提出了一种基于缺陷模式的软件缺陷自动检测方法,并在此 基础上,设计和实现了一个基于状态机的缺陷检测系统一d t s j a v a , 该系统通过j a c c 自动生成j a v a 源程序的分析器,并在此基础上构造 抽象语法树、控制流图等,最后,我们使用缺陷模型状态机技术,自 主开发了该自动检测系统。并就约束满足问题进行了深入的研究,同 时开发了面向j a v a 程序缺陷的约束提取原型。实验结果表明,该系 统是准确、高效、切实可行的。 关键词:缺陷模式、状态机、自动测试、区间运算、约束满足 北京邮电大学硕士学位论文 r e s e a r c ho na i7 t o n 【a t i ct e s t t e c h n o l o g ya n dc o n s t ra i ns a l s f a c o n b a s e do nd e f e c tm o d e l n o w a d a y s ,w i t ht h er a p i dd e v e l o p m e n to fc o m p u t e rt e c h n o l o g y , p e o p l em o r ea n dm o r ed e p e n do nc o m p u t e r s i n c et h e s o f t w a r e a p p l i c a t i o n i s e x p a n d e da n dt h es o f t w a r ee o m p l e x i 哆a n ds c a l e a r e i n c r e a s e d c o n t i n u o u s l y ,t h e r e r a i s em u c hh i g h e r r e q u i r e m e n t s f o r s o f t w a r et e s t i n g s o f t w a r et e s t i n ga u t o m a t i o ni sa ne f f e c t i v em e t h o dt o i m p r o v et h et e s t i n ge f f i c i e n c y t h ea u t o m a t i o ns h o u l db eu s e di ne v e r y s t a g eo fs o f t w a r et e s t i n g ,e s p e c i a l l yi nt h ed e f e c ta u t o m a t i cd e t e c t i o na n d t e s td a t ag e n e r a t i o n t e s td a t ag e n e r a t i o nr e l a t e sw i t hm a n ya r e a s ,a n dt h e c o n s t r a i ns a t i s f a c t i o ni so n eo ft h ek e yp r o b l e m s t h e r e f o r e ,t h e r ea r e g r e a tt h e o r e t i c a lm e a n i n g sa n db r o a da p p l i c a t i o np r o s p e c t st or e s e a r c ho n t h ec o n s t r a i np r o b l e m i nt h i s p a p e r ,w ep r o p o s eam e t h o dt h a ta u t o m a t i c a l l yd e t e c t st h e s o f t w a r ed e f e c t sb a s e do nt h ed e f e c tm o d e l b a s e do na b o v et e c h n o l o g i e s , 北京邮电大学硕士学位论文 a b s r r a c t w e ed e s i g n e da n di m p l e m e n t e dad e f e c td e t e c t i v es y s t e m - - - d t s j a v a a b o u tw h i c h ,w eu s ej a c ct o a u t o m a t i c a l l yg e t t h e a n a l y z e r o f j a v as o u r c ec o d e ,b a s e do nw h i c hw ec o n s t r u c tt h ea s t ( a b s t r a c t s y n t a xt r e e ) ,c f g ( c o n t r o lf l o wg r a p h ) a n ds oo n a tl a s t ,w eu s et h e s t a t em a c h i n eo fd e f e c tm o d e lt e c h n o l o g yt o d e v e l o p d t s j a v a m e a n w h i l e ,ih a v ed e e p l yr e s e a r c h e d o nc o n s t r a i ns a t i s f a c t i o na n d i m p l e m e n t e dt h ec o n s t r a i na b s t r a c to r i e n t e dt od e f e c t si nj a v ap r o g r a m f o u n d b yd t s j a v a t h ee x p e r i m e n tr e s u l t ss h o w st h a tt h es y s t e mi s e x a c t 、f e a s i b l ea n de f f i c i e n t k e yw o r d s :d e f e c tm o d e ls t a t em a c h i n ea u t o m a t i ct e s t i n t e r v a lc o m p u t a t i o nc o n s t r a i ns a t i s f a c t i o n 北京邮电大学硕士学位论文 独创性( 或创新性) 声明 本人声明所呈交的论文是本人在导师指导下进行的研究工作及取得的研究 成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中不 包含其他人已经发表或撰写过的研究成果,也不包含为获得北京邮电大学或其他 教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任 何贡献均已在论文中作了明确的说明并表示了谢意。 申请学位论文与资料若有不实之处,本人承担一切相关责任。 本人签名:碰k 扯 关于论文使用授权的说明 一学位论文作者完全了解北京邮电大学有关保留和使用学位论文的规定,即: 研究生在校攻读学位期间论文工作的知识产权单位属北京邮电大学。学校有权保一 留并向国家有关部门或机构送交论文的复印件和磁盘,允许学位论文被查阅和借 阅;学校可以公布学位论文的全部或部分内容,可以允许采用影印、缩印或其它 复制手段保存、汇编学位论文。 本人签名: 导师签名: 日期:丘叫纽u 一 日期: 北京邮电大学硕士学位论文第一章绪论 第一章绪论 1 1 选题背景、目的和意义 随着信息技术的飞速发展,使得软件系统的开发规模也逐渐扩大,其复杂度 也随之急剧提高,软件故障率也越来越高,尤其在一些航天,医疗,军工等特殊 的领域,这些故障往往会导致无法弥补的损失,因而软件质量和可靠性己引起人 们的高度重视。 软件测试是保证软件质量的重要手段之一。随着软件工程的不断发展和成熟, 软件测试在软件开发中的地位越来越重要。在软件开发领域技术领先的公司中, 软件测试人员在整个软件开发团队中的人数比例往往高达3 0 6 0 。比如, b o r l a n d 中,针对不同的产品有不同的测试人员,专职人员大约有5 q 6 0 人,测 试人员占研发人数的3 0 4 0 n 1 。在时间安排上i 软件测试也占很大比例。图灵奖 获得者f r e d e r i c kp b r o o k sj r 曾公开过他使用多年他使用多年的软件开发进 度安排的经验:1 3 一设计一1 6 - 编码,1 4 - 构件测试和早期系统测试,1 4 - 系统测试阻1 。b r o o k s 在i b m 开发出的具有划时代意义的计算机产品s 3 6 0 ,跟他 对测试的高度重视是密不可分的。由以上所述可知:在软件开发中,要开发出高 质量,高可靠性的软件产品,测试环节必不可少。 而软件测试并不像一些人( 包括。些技术人员) 理解的那样是一件“没有技 术含量”的体力活,正如g l e n f o r dj m y e r s 在软件测试的艺术中总结的软 件测试的l o 条原则的最后一条说:“软件测试是一项极富创造性、极具智力挑 战性的工作。口1 然而,令人担忧的是,国内软件公司对软件测试的认识远远 不够。软件测试工程师不足,开发测试人员比例不合理。资料显示,国内大多数 软件公司中测试人员和开发人员的比例是1 :8 ,有的是l :2 0 ,有的甚至没有专 职的测试工程师。不过,随着某些杰出的国内软件公司的不断成熟,这种情况正 在逐渐改善。总的来说,提高国内软件测试水平,还有很长的路要走。 软件测试包括多个方面:测试计划;测试设计规格说明;测试用例规格说明; 测试过程规格说明;测试项目执行报告;测试日志;测试异常报告;测试总结报 告等。 软件测试自动化是提高软件测试效率的有效手段,自动化应该体现软件测试 的各个阶段,尤其是缺陷的自动检测以及测试数据的自动生成,其中后者涉及的 领域更大,而提取约束和解约束是其中最为重要的环节之一,所以对于约束问题 的研究具有重要的理论意思和广阔的应用前景。 北京邮电大学硕士学位论文 第一章绪论 本文详细介绍基于缺陷模型的软件测试技术的技术特点、测试指标以及简要 介绍了常见的缺陷模式。并在此基础上实现了缺陷自动检测系统一d t s 。同时,就 测试用例自动生成中涉及的约束满足问题也进行了比较深入的调研,并实现了面 向缺陷覆盖的约束提取原型。 1 2 本文的主要研究内容 目前,软件测试在学术界、i t 行业、工业、航空、能源、金融等各大领域 都有巨大的用价值。但是,由于软件本身的复杂度近几年有增无减,很新的问 题正层出不穷,大量的问题没有得到很好的解决。在研究中,作者重点关注的 内容是:如何将自动化应用于软件测试的各个阶段,将人力从重复费时的劳动 中解脱出来。本文着重研究了基于缺陷模式的自动化测试方法,并就约束满足 问题进行了深入的研究,同时开发实现了面向缺陷覆盖的约束提取。主要完成 了以下工作: 1 、对软件测试方法及其技术进入了深入的研究和介绍,并详细介绍基 于缺陷模型的软件测试技术的技术特点、测试指标以及简要介绍了 常见的缺陷模式。 2 、概述了软件测试中常用的自动化技术,并详细介绍了基于缺陷的自 动化测试系统- d t s ,并分模块介绍了各个组成部分的功能,具体实 现的原理与组成结构。并用该系统对实际的代码进行了分析,实验 结果表明,该系统准确、高效、切实可行。 3 、详细介绍了在测试用例自动生中所涉及的约束满足问题,对常见的 约束问题进行了分类讨论,介绍了它们的常见求解算法以及在软件 测试中的应用。并依托d t s 已有的数据结构和功能,更进一步的开 发实现了面向缺陷覆盖的约束提取,实验表明,提取功能准确、高 效。 1 3 本文的组织结构 本文的组织结构如下: 第一章:介绍论文的背景和主要内容。 第二章:概述当前已有的软件测试相关的研究成果。主要包括:软件测试、 软件测试技术和基于缺陷检测的软件测试技术。 第三章:概述软件测试中的自动化技术。 第四章:详细介绍了基于缺陷的自动化测试系统一d t s ,并分模块介绍了各 个组成部分的功能,兵体实现的原理与组成结构。并用该系统对实际的代码进 行了分析,实验结果表明,该系统准确、高效、切实可行。 2 北京邮电大学硕士学位论文第一章绪论 第五章:详细介绍了在测试用例自动生中所涉及的约束满足问题,对常见 的约束问题进行了分类讨论,介绍了它们的常见求解算法以及在软件测试中的 应用。并依托d t s 已有的数据结构和功能,更进一步的开发实现了面向缺陷覆 盖的约束提取,实验表明,提取功能准确、高效 第六章:总结全文,并展望下一步工作。 3 北京邮电大学硕士学位论文 第二章软件测试方法及研究概况 第二章软件测试方法及研究概况 软件测试的目的是为了发现软件中的错位,而不是证明程序是正确的口1 。 因此,软件测试主要关注的是,如何在更短的时间内最大限度地找出并改正错 误。即使是高度自动化的程序测试,仍然离不开人工的参与。对于自动化测试 来说,有两点需要用户指定:一就是充分的程序测试需要进行到什么程度,这 一点称为测试准则( t e s tc r i t e r i o n ) :二就是能够用计算机自动判断程序行为 是否正确的标准,这一点称之为测试预言( t e s to r a c l e ) 。 2 1 软件测试 2 1 1 软件测试的定义 软件测试是对软件需求分析、设计规格说明和编码的终审,是软件质量保 证的关键步骤。但对于什么是软件测试,一直未达成共识,根据侧重点不同, 主要有三种描述吲: 一 一 定义1 11 9 8 3 年,i e e e ( 国际电子电气工程师协会) 提出的软件工程标 准术语中给软件测试下的定义是: “使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它 是否满足规定的需求或是弄清楚预期结果与实际结果之间的差别。一 该定义包含了两方面的含义: 一。 是否满足规定的需求。 是否有差别。 如果有差别,说明设计或实现中存在故障,自然不满足规定的需求。因此, 这一定义非常明确地提出了软件测试以检验软件是否满足需求为目标。 定义1 2 软件测试是根据软件开发各个阶段的规格说明和程序的内部结 构而精心设计一批测试用例,并利用这些测试用例去执行程序,以发现软件故 障的过程。 该定义强调寻找故障是测试的目的。 定义1 3 软件测试是一种软件质量保证活动,其动机是通过一些经济有 效的方法,发现软件中存在的缺陷,从而保证软件质量。 上述三种观点实际上是从不同角度理解软件测试,但不论从那种观点出发, 都可以认为软件测试是在一个可控的环境中分析和执行程序的过程,其根本目 的是以尽可能少的时间和人力发现并改正软件中潜在的各种故障及缺陷,提高 软件的质量。 4 北京邮电大学硕士学位论文第二章软件测试方法及研究概况 测试的目的决定了测试方案的设计,如果我们的目的是要证明程序中没有 隐藏的故障存在,那就会不自觉地回避可能出现故障的地方,设计出一些不易 暴露故障的测试方案,从而使程序的可靠性受到极大的影响。但,另一方面, 如果我们的目的是要证明故障是存在的,那就会力求设计出最能暴露故障的测 试方案。软件测试是一项花费昂贵的活动,测试者希望通过软件测试来提高软 件的质量和可靠性。这就意味着要发现和改正程序中的错误。所以,在学习和 了解软件测试前,必须树立一个核心理念就是:软件测试不是证明软件是正确 的,而是要把软件当成不完善的,而尽力去暴露它的缺陷。因此,“一个好的 测试用例在于发现至今尚未被发现的故障修嘲,“一个成功的测试是发现了至 今未被发现的故障的测试 【3 】。 2 1 2 软件测试的原则 鉴于软件测试的重要性,要做好软件测试,设计出有效的测试方案和好的测 试用例,软件测试人员需要充分理解和运用软件测试的一些基本准则: 所有测试都应追溯到需求 严格执行测试计划,排除测试的随意性 软件测试应当指定明确的测试计划并按照计划执行。测试计划应包括:所测 软件的功能= 输入和输出、测试内容、各项测试的目的和进度安排、测试资料、 测试工具、测试用例的选择、资源要求、测试的控制方式和过程等。 充分注意测试中的群集现象 经验表明,程序中存在错误的概率与该程序中已发现的错误数成正比。这一 现象说明,为了提高测试效率,测试人员应集中对付那些错误群集程序。 程序员应避免检查自己的程序 为了达到好的测试效果,应该由独立的第三方来构造测试。因为从心理学角 度讲,程序人员或设计方在测试自己的程序时,要采取客观的态度是程度不同地 存在障碍的。 穷举测试不可能 所谓穷举测试是指把程序所有的执行路径都进行检查的测试。但是,即使规 模较小的程序,其路径排列数也是相当大的,在实际测试过程中不可能穷举每一 种组合。这说明,测试只能证明程序中有错误,不能证明程序中没有错误。 妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供 方便。 5 北京邮电大学硕士学位论文 第二章软件测试方法及研究概况 2 2 软件测试技术及方法 软件测试中的概念很多,为了方便介绍,可以从不同的角度加以分类,这里 列举几种常见的分类嘲: 首先,按照阶段划分,著名的软件测试的“v 字模型最早由p a u lr o o k 在 上世纪8 0 年代后期提出。对应不同的软件开发阶段,软件测试可以分为单元测 试、集成测试、系统测试、验收测试以及回归测试等。 其次,根据测试方式分类,若从是否需要执行被测软件的角度,可以分为静 态测试和动态测试方法。最后,若按照功能划分,可分为白盒测试和黑盒测试方 法。分别综述如下: 2 2 1 静态测试与动态测试 1 ) 静态测试 静态测试包括代码检查、静态分析、代码质量度量等。静态测试可以由人工 进行,充分发挥人的逻辑思维优势;也可以借助软件工具自动进行。经验表明, 使用人工测试能够有效地发现3 0 7 0 的逻辑设计和编码错误。 代码检查主要检查代码和设计的一致性,包括代码的逻辑表达的正确性,代 码结构的合理性等方面。这项工作可以发现违背程序编写标准的问题,程序中不 安全、不明确和模糊的部分,找到程序中不可能移植部分,违背程序编程风格的 问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结 构检查等内容。代码检查包括审查、代码走查、桌面检查、静态分析等具体方式。 代码审查:小组集体阅读、讨论检查代码。 代码走查:小组成员通过用“人脑 研究、执行程序来检查代码。 桌面检查:由程序员自己检查自己编写的程序。程序员在程序通过编译之后, 进行单元测试之前,对源代码进行分析、检验、并补充相关文档,目的是发现程 序的错误。 静态分析:对代码的机械性、程序化的特征分析方法,包括控制流分析、数 据流分析、接口分析、表达式分析。 2 ) 动态测试 静态测试不实际运行软件,主要通过人工进行。动态测试是基于计算的测试, 是为了发现错误而执行程序的过程。或者说,是根据软件各个阶段的规格说明和 程序的内部结构而精心设计一批测试用例( 即输入数据及其预期的输出结果) , 并利用这些测试用例去运行程序,以发现程序错误的过程。 6 北京邮电大学硕士学位论文 第二章软件测试方法及研究概况 设计高效、合理的测试用例是动态测试的关键。测试用例( t e s tc a s e ) 是 为测试设计的数据。测试用例由测试输入数据和与之对应的预期输出结果两部分 组成。测试用例的格式为: 【( 输入值集) ,( 输出值集) 】 下面重点讨论动态的白盒测试方法和黑盒测试方法。 2 2 2 白盒测试方法与测试用例设计 白盒测试方法也称为结构测试或者逻辑驱动测试。它是根据软件产品的内部 工作过程,检查内部成分,以确认每种内部操作符合设计规格要求。自盒测试把 测试对象看作一个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信 息来设计或选择测试用例,对程序所有的逻辑路径进行测试。通过在不同点检查 程序的状态来了解实际的运行状态是否与预期的一致。所以,白盒测试在程序内 部进行,主要用于完成软件内部操作的验证。 自盒测试的基本原则是:保证所测模块中每一个独立路径至少执行一次;保 证所测模块所有判断的每一分支至少执行一次;保证所测模块每一个循环都在边 界条件和一般条件下至少各执行一次;验证所有内部数据结构的有效性。 。 按照白盒测试的基本原则,“白盒”法是穷举路径测试。在使用这一方案时, 测试必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程 序的独立路径数是天文数字,但即使每条路径都测试了,仍然可能有错误。第一、 穷举路径测试决不能查出程序是否违反了规范,即程序本身是个错误的程序;第 二、穷举路径测试不可能查出程序因遗漏路径而出错;第三、穷举路径测试可能 发现不了一些与数据相关的错误。 白盒测试的主要方法有逻辑覆盖、基本路径测试等。 1 ) 逻辑覆盖测试 逻辑覆盖测试是泛指一系列以程序内部的逻辑结构为基础的测试用例设计 技术。通常所指的程序中的逻辑表示有判断、分支、条件等几个表示方式。 语句覆盖:选择足够的测试用例,使得程序中每个语句至少都能被执行 一次。 【例2 1 】设有程序流程图表示的程序如图2 1 所示。 7 北京邮电大学硕士学位论文第二章软件测试方法及研究概况 按照语句覆盖的测试要求,对图2 - 1 的程序设计如下测试用例1 和测试用例2 测试用例1 : 输入j 输出一 c ,j ,一 【,j - x p ( 1 0j1 0 一【1 0 ,1 0 - 1 0 ) 一 测试用例2 : 输入一 输出一 i ,j ) 一 i j ,x ) 一 1 0 1 5 ) 一( 1 0 ,1 5 1 5 一 圈2 - 1 语句覆盖 语句覆盖是逻辑覆盖中基本的覆盖,尤其对单元测试来说。语句覆盖准则被 广泛接受,它是a n s i 标准1 7 8 b 强制要求的,从2 0 世纪7 0 年代以来曾经被成功 地使用过,但是语句覆盖往往没有关注判断中的条件可能有隐含的错误。 路径覆盖:执行足够的测试用例,使程序中所有可能的路径都至少经历 一次。 一 一 【例2 2 】设有程序流程图表示的程序如图2 2 所示 图2 - 2 路径覆盖 8 北京邮电大学硕士学位论文 第二章软件测试方法及研究概况 对图2 2 的程序设计如表2 - 1 列出的一组测试用例,可以覆盖该程序的全部 4 条路径:a c e ,a b d ,a b e ,a c d 表2 - 1 一组路径覆盖测试用倒 测试用例p 通过路径p测试用例p通过路径) 【6 t - - 2 , b :qz = 3 ) ( 输出咯) 】,( 删p( a - - - = 2 , b :1 i = 1 ) ( 输出略) 】一( 黝p 【c ;l ,b = 0 1 1x - 1 ) ( 输出咯) 】p( 蝴p【c ;3 b = o x - 1 ) ( 输出略) 】一 ( 搴g 囝p j 判定覆盖:设计的测试用例保证程序中每个判断的每个取值分支( t r u eo r f a l s e ) 至少经历一次。 根据判定覆盖的要求,对如图2 3 所示的程序,如果其中包含i j 的判断 为真值( 即为“t r u e ) 和为假值( 即为“f a l s e ”) 的程序执行路径至少经历一 次,仍然可用测试用例2 1 的测试用例1 和测试用例2 程序每个判断中若存在多个联立的条件,仅保证判断的真假值往往会导致某 些单个条件的错误不能被发现。例如,某判断是“x 5 ”,其中只要一 个条件是否错误,判断的结果都为真。这说明,仅有判断覆盖还无法保证能查出 在判断的每个条件的可能取值至少执行一次_ o 条件覆盖:设计的测试用例保证程序中每个判断的每个条件的可能取值 至少执行一次。 【例2 3 】设有程序流程图表示的程序如图2 3 按照条件覆盖的测试要求,+ 对图2 3 的程序判断框中的条件i j 和条件j o 或b o 或c o pa o 或b n e x t = e n t r y - n e x t ; e n t r y - n e x t = n e w e n t r y ; r e t u r nn e w e n t r y ; 在程序的第3 行给变量n e w e n t r y 分配了内存,当程序在第8 行返回时并没 有释放该内存,属于m l f 第一种类型。 2 、安全漏洞模式 安全漏洞模式为攻击者攻击软件提供了可能。一旦软件被攻击,系统就可能 发生瘫痪,所造成的危害较大,因此,应当尽量避免此类漏洞。 攻击软件的方法多种多样的,病毒就是其中一种,但这不是我们要讨论的内 容。本小节主要从源代码角度讨论软件可能存在的安全漏洞。程序代码是导致信 息系统安全问题的重要来源。为防止软件留有后门,国家安全要求政府采购的重 要软件公开源代码。为提高代码抵抗攻击的能力,微软和j a v a 开发组织提出了 进行系统开发时应该遵循的安全准则和指南,并且提供了一系列的安全函数库。 如:缓冲区溢出漏洞模式 定义2 一:缓冲区溢出( b u f f e ro v e r f l o w ) 漏洞:当程序要在一个缓冲区内存 储比该缓冲区的大小还要多的数据时,就会产生缓冲区溢出漏洞。 在缓冲区溢出漏洞里,多余信息可以存储在缓冲区的邻接区域内,从而破坏 了原来存储在该区域的有效信息。虽然缓冲区溢出漏洞在一般的程序错误中也可 能发现,但表现更多的是安全问题。在缓冲区溢出的攻击中,多余信息可能包含 诸如破坏用户文件,改变数据和泄露用户有用信息等的程序代码。缓冲区溢出的 根源是c 或c + + 语言中缺乏边界检查的功能。 缓冲区溢出主要有两种类型:数据复制造成的缓冲区溢出和格式化字符串造 成的缓冲区溢出。 数据复制造成的缓冲区溢出 如果数据是从外部传进来的或者是在缓冲区之间进行数据复制,在使用之前 没有进行检测,那么有可能出现安全问题。 【例2 8 】考虑下列程序 m a i n ( i n ta r g c ,c h a r 掌a r s v ) s h o r tl a s t e r r o r ; c h a r b u f f e r 1 6 ; i f ( a r g c = = 2 ) s t c p y ( b u f f e r , a g r v 1 ) ; 1 9 北京邮电大学硕士学位论文第二章软件测试方法及研究概况 在程序的第5 行中,s t r c p y 的第二个字符串参数来自程序命令行输入,其 长度如果超过1 5 则可能导致一个缓冲区溢出。因此,在进行字符串复制之前必 须对a r g v 1 的长度进行检查。 格式化字符串造成的缓冲区溢出 函数在使用格式化字符串控制数据存储到缓冲区中时,如果对数据长度不加 限制,就可能造成溢出。 【例2 9 】考虑下列程序 i n tm a i n ( i n ta r g c , c h a r a r g v ) c h a r b u f f e r 1 0 ; s p r i n t f ( b u f f e r , ”v e r yl o n gf o r m a ts t r i n g n ”) ; r e t u r n0 ; 程序中的第3 行向一个长度为1 0 的缓冲区空间输出一个字符串,但是,在 输出之前并没有检查字符串长度,因此可能导致一个缓冲区溢出。 3 、缺陷模式 低性能模式 该模式导致软件运行效率低下,因此建议采用更高效的代码来完成同样的功 能。这类模式主要包括使用低效函数或代码、使用多余函数、j a v a 中显示垃圾回 收、冗余代码、头文件中定义静态变量、不必要的文件包含、字符串低效操作和 用更简单的运算替代等。 【例2 9 】考虑下列程序 s t a t i cv o i dc h e c k ( i n ta r r ) i f ( a r r | - n u l l a r r 1 e n g t hl - 0 ) f o o o ; r e t u r n ; ) 在逻辑表达式中不要用b i n a r y ( & 和i ) 运算符,而要用短路运算符( 和1 1 ) 。 从性能上看,用短路运算符更好。 北京邮电大学硕士学位论文第三章自动化测试技术简介 第三章自动化测试技术简介 在绪论中提到,自动化应该体现软件测试的各个阶段,尤其是缺陷的自动检 测以及测试数据的自动生成,其中后者涉及的领域更大。目前,测试用例的生成 主要是手工完成,这使得测试过程具有一定的盲目性,效率低下,测试充分性也 得不到保障,从而导致软件成本居高不下,软件质量也无法保证。为此,迫切需 要改进软件测试的方法,开发有效的测试用例自动生成工具,以提高软件测试效 率,降低软件成本,保障软件质量。 这一节主要介绍自动化测试技术及相关的工具。跟软件测试技术分类一致, 针对相应类别来介绍这些自动化技术即:动态分析、静态分析、白盒测试用例生 成、黑盒测试用例生成。 3 1 动态分析 问题的非形式化描述:设所求问题为q ,给定一个程序p ,p 的输入空间为 q ,求x q 满足q 。动态分析的思路是:。从输入空间q 中选一组数据x 作为问 题q 的一个近似解。代入p ,运行程序,根据运行情况,按照某种算法( 如k o r e l 为代表的搜索寻优、g u p t a 采用的迭代逼近法等) 来修正x ,得到一个新的x , 再继续迭代,使结果逼近期望值m 。 为了能够方便地获取程序的执行信息,可以采用程序插装( p r o g r a m i n s t t d m e n t a t i o i n ) 技术瞪1 。程序插装是一种基本的测试手段,在软件测试中有 着非常广泛的应用。简单地说,程序插装就是借助被测程序中插入操作来实现测 试目的的方法。在调试程序时,人们往往要在程序中插入一些打印语句,或者加 一些断点( 如果有相应的调试工具) 。其目的在于,希望程序执行时,顺带打印 出人们最关心的信息。进一步通过这些信息了解执行过程中程序的一些动态特性。 从这一思想发展出的程序插装技术能够按用户的要求,获得程序的各种信息,成 为测试工作的有效手段。 程序插装一般在程序中插入两类语句。首先,是记录动态特性的语句,或者 说是探测语句,目的是为了把程序执行过程中发生的一些重要历史事件记录下来。 如果我们想要了解一个程序在某次运行中所有可执行语句被覆盖的情况,或是每 个语句的实际执行次数,最好的办法是利用插装技术,在程序点插入计数。这样 程序从入口开始执行,到出口结束凡经历的计数语句都能记录下该程序点的 执行次数。另外一种语句就是断言( a s s e r t i o n ) 语句。在程序中的特定部位插入 某些用以判断变量特性的语句,使得程序执行中这些语句得以证实,从而使程 序的运行特性得到证实。 2 1 北京邮电大学硕士学位论文第三章自动化测试技术简介 动态分析工具可分成两类n 钉:一类是基于可执行的程序,在可执行代码上 插入一些观测点,然后在一个虚拟机上运行,如开源工具v a l g r i n d n 们另一类 工具主要是基于源代码的,也就是说需要在插入观察语句之后再进行编译,如 c c u r e d n 刀可以用来检查指针相关的错误。动态分析的商用工具代表有,i b m r a t i o n a lp u r i f y 检查内存泄露等指针错误;p a r a s o f t 的i n s u r e + + 能进行代码 的性能监控和分析优化;c o m p u w a r e 公司的b o u n d s c h e c k e r 能检查指针相关错 误。 3 2 静态分析 虽然静态测试技术不用生成测试用例,但是很多测试用例生成技术都可以移 植过来,例如,一种可能的方法是将静态测试的预言取反作为断言加入程序合适 的地方,并查找所有经过断言的可行路径,如果这些路径能够找到测试用例,我 们就找到了程序中的一个错误。同时,形式化方法里的很多技术,比如模型检测 等,也可以与其他测试方法相结合应用到静态分析中。因此程序静态分析的主要 问题,就是减少需要路径的数目以及简化被分析的路径。 _ 切片技术【1 1 1 一般来说,测试人员分析程序的时候,可能只关注某些具体的对象,而对程 序的其他部分不太关心。程序切片技术,就是用来分析这些被观测对象的技术, 所谓程序切片( p r o g r a ms l i c e ) 就是以数据为核心,将程序中可能影响关注对象 ( 变量等) 的片段保留下来,以达到简化程序结构。选择片段的方法称为切片准 则( s l i c i n gc r i t e r i o n ) 。 一【例3 1 】考虑如下j a v a 程序片段1 ,如果只关心变量j ,则可以得到关j 的程 序切片,见片段2 片段1 : p u b l i c c l a s ss l i c e t e s t p u b l i cv o i df ( i n tc o u n t ) ( i n ti 一1 ; i n tt o t a l = 0 ; l o n gj = 1 ; f o r ( ;i ( a 簟b ) 2 4 北京邮电大学硕士学位论文第三章自动化测试技术简介 2 ) 从后往前( b a c k w a r ds u b s t i t u t i o n ) 建立约束系统,每遇到分支谓词就记 录下来;每遇到赋值语句,就把记录下来的所有分支谓词更新,具体更新过程是: 若在布尔表达式中出现了被赋值的变量,则直接替换为赋值语句右端的值;如果 被赋值的是数组成员,还必须考虑它的下标和布尔表达式中同名数组的下标是否 相等,是则替换,否则就不替换。当数组多层嵌套时,必须为数组标上层数,再 从里往外更新,与从前往后替换方法不同的是,从后往前替换方法无须保存各变 量的符号值,但两者得到的约束系统是相同的。如: n 9 ;n = n + l ;n 3 ; 这是一个简单的路径例子,首先,我们得到的是表达式n 枣入t h e n 入j e l s e 讲 f o l l o w ( a = a v ts = + a a u ( i fs = ,i at h e n # ) e l s e0 p r e d i c t ( a b ) = f i r s t ( b ) ,当f i r s t ( b ) 不含有入 = f i r s t ( b ) 一 入 uf o l l o w ( a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区义工培训课件
- 中国头戴立体耳机行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2025年中国高锝酸钠注射液行业市场发展前景及发展趋势与投资战略研究报告
- 2025年 运河高等师范学校招聘考试笔试试题附答案
- 2025年 工业锅炉G1证理论考试练习题附答案
- 节能报告范文17汇编
- 税务师网盘课件下载指南
- 中国文化娱乐服务行业全景评估及投资规划建议报告
- 2025年中国消防火灾报警系统行业发展前景预测及投资战略咨询报告
- 中国体育场地与设施建设行业全景评估及投资规划建议报告
- 2022版义务教育课程方案测试题及答案+学习义务教育课程方案心得体会
- 最新教师培训课件:教师专业发展
- 水池深基坑开挖专项施工方案
- (整理)萨提亚沟通模式课件
- 水产品冷冻食品加工行业解决方案
- 茶知识与科学饮茶课件
- 手术通知单模板
- 2021年安康市中心医院医护人员招聘笔试试题及答案解析
- 医院医疗精神科危险物品管理PPT课件讲义
- 第二讲:黔东南州优势矿产资源
- 康复医院的设计要点精选
评论
0/150
提交评论