JUTA一个Java自动化单元测试工具严俊

上传人:无*** 文档编号:101488671 上传时间:2022-06-05 格式:DOC 页数:17 大小:60.50KB
收藏 版权申诉 举报 下载
JUTA一个Java自动化单元测试工具严俊_第1页
第1页 / 共17页
JUTA一个Java自动化单元测试工具严俊_第2页
第2页 / 共17页
JUTA一个Java自动化单元测试工具严俊_第3页
第3页 / 共17页
资源描述:

《JUTA一个Java自动化单元测试工具严俊》由会员分享,可在线阅读,更多相关《JUTA一个Java自动化单元测试工具严俊(17页珍藏版)》请在装配图网上搜索。

1、JUTA:一个Java自动化单元测试工具严俊1郭涛2阮辉1玄跻峰3JUTA:An Automated Unit Testing Framework for JavaYan Jun1,Guo Tao2,Ruan Hui1,and Xuan Jifeng3123AbstractTesting is very important and time consuming in the development of high-quality softwaresystems.This paper proposes an automatic testing tool JUTA for unit testing

2、 of Java programs.Theapproach is based on sharp analysis of the programs.JUTA firstly employs the Java optimizationframework Soot to parse a single Java method into byte code and translates it into a control flow graph.It then performs depth-first or breadth-first search on the CFG to extract paths

3、from it.Sometechniques such as path length restriction are used to prevent path number explosion.Finally JUTAanalyzes the paths based on the combination of symbolic execution and constraint solving.The goal ofpath analysis lies in two folds.It can generate a set of test cases satisfying the test cri

4、terion such asstatement coverage.The test set typically has small number of test cases that are all executable.Inaddition to test generation for dynamic testing,it can also be used in static testing.JUTA can revealcertain kinds of errors from the source code automatically if the user provides proper

5、 assertions todescribe the errors.The experimental results show that this tool is efficient for both dynamic andstatic testing.Key wordsJava unit testing;dynamic testing;static testing;program analysis;symbolic execution摘要描述了一个Java自动化的单元测试工具JUTA.JUTA首先调用工具Soot解析单个Java方法的源码,并将源码解析成一个控制流图.在此基础上,采用符号执行

6、的方法分析控制流图上的路径.工具能够自动地产生满足覆盖率标准的程序的测试用例.这种方法产生的所有测试用例都是可执行的,并且一般来说具有较小的测试用例数.如果用户能够合理地给出描述程序错误的断言,框架JUTA能够自动地检查源码中部分特定类型的错误.实验结果表明工具对Java单元代码的动态测试和静态测试均能在可接受的时间内给出有效的结果.关键词Java单元测试;动态测试;静态测试;程序分析;符号执行中图法分类号TP311的控制转移都得到了覆盖.由于在控制流图模型中,语句与节点相对应,语句覆盖意味着测试路径覆盖所有的节点.同样地,分支覆盖就是所有的测试路径覆盖了控制流图中所有的边.1.2基于路径的程

7、序测试程序中的一次完整的执行过程对应控制流图中的一条完整路径.但是,并不是所有的完整路径都代表程序中的一次运行过程.这是因为可能不存在输入数据使得程序按照该路径执行.这样的完整路径称为不可行路径,否则称为可行的2.例如,在例1中,路径p1执行的语句如图2所示.易知,程序执行到第2个判断语句时,表达式i+2j不可能满足,程序控制流图中的分支S3-S4不可能被执行到.那么,路径p1是一条不可行的路径.good=TRUE;2&3;j=j-1;i+2j;good=FALSE;Fig.2Pathp1.图2路径p1由于控制流测试准则都是基于控制流图中的测试路径来定义,很自然地,我们可以采用如下方法来生成测

8、试用例:首先从控制流图中找到一组路径满足覆盖准则,然后从每条路径中找出各变量的一组初始值使得程序能够按照路径执行,这些初值就构成了测试用例集合.一般来说,一个自动测试用例生成系统主要可以分成3个部分3:1.程序分析器,其主要工作是把程序转化成容易处理的中间模型;2.路径选择器,如何选择路径满足我们的测试需求;3.测试数据生成器,如何从测试路径中得到我们需要的测试数据.在实际开发中,程序分析器也被称为前端,后两部分合起来被称为后端.这样的自动测试生成的系统主要用于程序的动态测试,即采用测试用例测试被测程序.与动态测试对应的静态测试方法,其框架与测试生成大体相同.主要的不同指出在于其输出并不是测试

9、用例,而是直接报告程序是否包含某类错误,或者给出能检出某类错误的具体的测试数据.由于程序测试的需求众多,实际的测试系统尤其是商用系统,可能还包括一些其他的辅助模块,比如测试脚本的自动生成器等.1.3路径分析方法不可行路径给自动化测试带来了一个难题,我们不可能简单地通过从程序控制流图的信息中抽取路径来选择测试用例,在测试用例选择时必须分析数据流的信息.为了精确地分析控制流图中一条完整的路径,我们可以采用符号执行4的方法.所谓符号执行,相对于普通的程序执行来说,就是程序并不真正用数值来替换程序的变量,而是用一组关于初始值的表达是来表示程序中出现的项.用符号执行加约束求解进行程序分析的基本思想是:采

10、用Hoare逻辑可以将程序路径表示成PQR,其中P是程序的前置条件,R是程序的后置条件.假定在程序的符号执行过程中由PQ可以推导出约束条件c1c2cn,则应该有c1c2cnR.在一般的测试中,如果后断言永真,那么可以对约束条件c1c2cn求解,可以得到变量的初值,从而得到测试用例.另一方面,我们可以对约束c1c2cn瓙R求解,如果有一组解满足这一约束,说明存在一组输入使运行程序的结果和规范不符.如果程序的规范正确,则程序中必定包含错误.对于不包含函数调用代码来说,程序的语句可以分成3类:1动作,也就是赋值语句;2判断语句,也就是一个逻辑表达式;3其他不影响变量的表达式,如控制台打印语句Syst

11、em.out.println.我们用一个具体的例子说明符号执行的原理.考虑图2的路径p1,如果i和j的初值为i0和j0,我们可以自顶向下依次执行这段程序,用程序的赋值语句替换判断语句,最后得到一个只含有判断语句的约束集合i0+25;2&3.这个集合就是程序初值的约束.由于这个约束集是不可满足的,所以路径p1是不可行的.关于符号执行的具体细节请参考文献2,5-6.符号执行的好处是能够精确地分析程序的行为,但它的缺点也是显而易见的.由于符号执行方法过于依赖源代码,并且需要消耗较大的计算资源,因1842计算机研究与发展2010,47而无法精确分析带有很多模块调用的程序.同时,程序需要能够用约束精确模

12、拟复杂程序结构,比如指针和数组的执行,这是一件很困难的事情.最后,为了保证分析的精确性,符号执行需要有一个能力非常强的完备解法器.针对不同的程序,这个解法器可能需要处理位操作等复杂的约束.这一点也限制了符号执行方法的使用.工具JUTA中采用较为简单的方式在工具的处理能力和精确度之前作了一个平衡.我们将程序中的表达式限制为布尔逻辑和线性数值约束两种类型,并且将程序的外部调用抽象成简单的赋值语句和后置断言.具体内容见本文第2节.2工具JUTA的设计与实现本节将详细介绍JUTA工具的流程以与工具的模块组成,同时对每一个模块给出其功能以与简要的描述,主要目的是为工具提供一个整体的框架描述.2.1工具流

13、程为了便于理解源程序需要对程序的源代码进行一定的处理.首先要做的就是编译分析,包括语法语义错误的检查、建立中间表示并生成控制流图等.同时为了以后的分析,我们还需要识别出源代码中的循环,并对循环进行处理,建立一棵循环控制树.这部分通常成为前端处理.有了前端处理的程序结构和数据信息,我们就可以通过算法遍历控制流图,得到一系列的路径,并通过符号执行和约束求解来分析这些路径,对其可行性进行判断,对于可行的路径为其生成测试数据,最后收集这些测试数据就得到了满足某些性质的目标测试数据集.因而,从整体上工具分为两个部分:前端处理和后端分析,其整体结构如图3所示:Fig.3Framework of JUTA.

14、图3JUTA的框架目前,工具JUTA实现了两方面的功能:静态测试与动态测试.本文1.2节曾指出,这两种测试方法可以公用相同的前端,主要区别在于工具的后端.接下来我们将按照功能分别介绍工具的各模块.2.2工具输入工具输入包含两部分.首先是被测的Java源码.源码中包含被测Java代码的单个方法.由于工具JUTA的主要功能是完成单元测试,所以,工具将丢弃方法中的外部调用.用户在测试时,需要手工将重要的外部调用替换成赋值语句或者约束表达式.例如,对于语句y=foo,假定外部调用foo将y的值改变为foo x,并且这个值的范围是lb,ub.那么可以将这行代码替换为:y=foo x;assertlb =

15、foo x&foo x;另一部分的输入是一些描述性质的断言以与断言的插入位置.具体请参见本文2.4.2节.2.3前端处理前端分析整体上相当于一个编译器的前端,功能上相当于一个不产生目标代码的编译器.在这一部分我们借用的是Java分析优化工具框架Soot7的编译分析功能.Soot是一个功能很强大的分析框架,融合了编译前端以与分析器的各种功能.工具JUTA的前端在Soot框架下扩展其功能,产生后端分析所需要的中间结果.在JUTA中,我们主要使用了Soot的语法语义检查、中间表示、循环控制分析以与控制流图1843严俊等:JUTA:一个Java自动化单元测试工具生成等模块.接下来简要介绍这几个模块的功

16、能.2.3.1语法语义检查模块该模块主要完成源代码语法语义的检查,确保给定的输入程序是没有语法语义错误的,同时建立一棵等价于源程序的抽象语法树.2.3.2中间代码生成模块这部分通过遍历抽象语法树,对各种语句进行处理,产生中间表示,便于以后的分析和处理.Soot提供了4种中间表示形式:Baf,Jimple,Shimple和Grimp.工具JUTA使用了Soot的Jimple中间表示.Jimple是一种简单的带类型的3地址表示形式.例如图4为Java源码与对应的Jimple代码.图4所示的一段简单的Java代码,经过Soot翻译后得到图4所示:public static intfuncinty=

17、-1;if0y=1;elsey=2;returny;public static intfuncintx,y,temp0,temp1;x:= parameter0:int;y= -1;ifx0 goto label0;goto label1;label0:nop;temp0=1;y=temp0;goto label2;label1:nop;temp1=2;y=temp1;label2:nop;returny; Fig.4Java source code and the corresponding Jimplecode.Java source andJimple code.图4Java源码与对应的

18、Jimple代码.Java源码;Jimple代码2.3.3控制流图建立模块本模块通过遍历中间表示的列表,将中间表示序列划分为基本块,控制流图即是以基本块为节点的有向图,描述了源代码中的控制流.工具JUTA使用Soot中的Brief Block Graph,只为源代码中基本的控制流提供支持,目前无法处理异常.2.3.4循环控制分析模块这一部分主要是分析控制流中的循环,Soot中将每一个循环抽象成一个对象,每一个循环都存储自己的循环头部以与循环体.一般来说,结构化的程序中的循环分成3类,孤立循环、嵌套循环以与串联的循环8.我们可以建立一个抽象的循环控制森林,森林中每一个节点是一个表示循环的对象,用

19、来描述循环之间的关系.循环A是循环B的子节点,当且仅当循环B内嵌在循环A之中.当被测程序中不包含串联循环时,循环控制森林退化为循环控制树.2.4后端分析本节将介绍工具的后端.考虑到动静态测试的不同之处,我们将分别介绍动态和静态测试的功能模块,之后对两者进行一个比较.2.4.1动态测试后端动态测试的目标是生成一组满足覆盖率的测试数据.所以,动态测试的后端需要分析前端处理后得到的数据信息,根据路径产生策略以与覆盖准则产生满足要求的路径,并且通过分析路径的可行性得到测试数据.这一部分有以下4个模块:路径生成、路径转换、路径分析以与路径选择.1路径生成模块这一模块将分析由前端处理得到的控制流图,并抽取

20、出一系列的路径.这些路径可以用基本块的编号序列表示.路径的产生过程是通过遍历控制流图来得到的.由于程序中可能有循环,那么,从图中可能抽取出无限条路径.为了产生有限条测试路径,我们可以限制循环次数或者限制路径的长度.在工具JUTA中可以通过参数来选择使用的路径限制策略.路径产生是一个遍历控制流图各顶点的过程,在图的遍历算法中有两种常见的策略:深度优先遍历和宽度优先遍历.当采用BFS算法时,是按照路径长度由短到长的次序生成路径,所以在队列中需要存储最多两层的中间节点,当路径长度限制比较大或者循环次数限制值比较大时,队列中需要存储很多的节点.在使用DFS算法时,由于优先考虑循环的退出节点,在栈中存储

21、的元素数目比较少,但是生成的最终路径不是按照由短到长的顺序.而且很多路径都是由几个相同的基本块所组成.由上述的比较可知,使用DFS占用较少的系统资源,但是在处理过程中,尤其是在CFG包含环时容易陷入一个分支无法跳出,无法快速达到覆盖率指标,比较适用于静态测试;使得BFS能够较快达到覆盖率,但是代价相对较高,适用于在测试覆盖准则指导下的测试生成.工具JUTA的路径生成模块实现了这1844计算机研究与发展2010,470引言软件质量历来就是学术界和工业界共同关心的问题,因为软件质量问题造成巨大经济损失事件不胜枚举.当前,随着信息技术的迅速发展,特别是互联网技术的广泛应用,Java技术以其通用性、平

22、台移植性、安全性等特征,吸引了众多软件开发者,在各个重要的行业部门得到了广泛的应用.因此,如何提高软件质量,尤其是提高应用广泛的Java程序的可靠性,长期以来一直是一个非常重要的研究课题.软件测试是提高软件质量的重要手段.优秀的软件开发机构把40%的工作量花在软件测试上,软件测试费用则占到了软件开发总费用的30%50%,而对于一些要求高可靠性、高安全性的软件,测试费用已经抬高到了整个软件项目开发所需费用的35倍.单元测试是软件测试的早期阶段,这种测试方法主要测试程序的单元函数或者类中的方法,其主要原理是对源代码中的控制结构和处理过程等进行分析,检查程序内部处理是否正确,包括语句结构、分支和循环

23、结构等.由于单元测试需要分析源代码,所以测试的代价往往比较高.目前,在工业界,单元测试大多仍然是靠人工完成的,如手工设计测试用例、人工审阅代码等,不但十分繁琐,而且测试质量与测试人员的主观经验紧密相关.随着计算机软硬件规模的不断发展,以人工为主的测试方法已经无法满足测试的需求.目前,采用计算机辅助的自动化软件测试技术成为软件工程中一个活跃的研究领域.本文介绍一个Java自动化的单元测试工具JUTA.与Junit等传统测试框架不同,JUTA提供了一系列的精度和自动化程度较高的技术来生成测试用例以与检查代码中的错误,以提高测试的自动化程度和效率.1预备知识本节将简要介绍JUTA采用的控制流和数据流

24、分析技术.1.1控制流图形式化地说,控制流图是一个有向图G= N,E,s,f ,其中N代表节点的集合,E代表边的集合,s和f分别表示控制流图的起点和终点.图中每个点nN代表程序中的一系列顺序运算,或者说是一个基本块;而每条边,e=E,代表从节点ni到nj的一个转移.用流图作为程序结构的模型时,程序的运行过程可以用流图中的路径来刻画.控制流图中的一条执行路径p代表一个执行序列p= n1,n2,nm ,其中m是路径的长度,E1i.一般来说,程序的执行必须从起点s开始.我们称n1=s的这条路径为部分路径.如果n1=s并且nm=f,我们称p是程序的一条完整路径.在下文中,如无特殊说明,我们所说的程序路

25、径都是完整路径.例1.图1为一段简单的代码与其控制流图.函数foo根据输入i和j的值计算参数good的值并返回.从控制流图上易知程序有3条从起点S到终点F的完整路径:p1= S,S1,S2,S3,S4,F ,p2= S,S1,S2,S3,F ,p3= S,S1,F .public intfoo S intgood=TRUE; S1 if2&3 S2 j- ; S3 ifi+2j S4 good=FALSE; F returngood;Fig.1A piece of example code.图1一段示例代码对于基于控制流图的结构测试来说,主要的测试方法就是找到一系列的可行测试路径,这些路径的输

26、入数据就是测试用例.例如在例1中,i=3,j=4就是对应于路径p2的一个测试用例.测试人员通过执行这些测试用例来检查程序的错误.显然,由于程序代码的复杂性,通过枚举所有的测试路径来测试程序是不现实的.为了减少测试的代价,人们定义了一系列的测试覆盖准则,作为测试的标准来限制测试集的大小1.最简单的控制流覆盖准是语句覆盖和分支覆盖路径转换模块前面1.3节中介绍过,对于不包含函数调用代码来说,程序的语句可以分成3类.而我们主要关注其中两类语句,即赋值和判断.路径转换模块将采用基本块的编号序列表示的路径,根据基本块对应的Jimple中间表示,翻译成一些简单的赋值和判断语句,方便下一步的路径分析.3路径

27、分析模块这一部分主要是用来对产生的路径进行分析.张健等人在文献2,5-6中提出了基于符号执行以与约束求解的路径分析方法,并给出了一个工具EPAT用于判断C程序路径的可行性.目前,EPAT支持布尔逻辑表达式和线性数值约束表达式与其混合,同时还支持数组和指针下标的运算.考虑到经过断言插入和路径转换后的路径只包含两类基本的表达式:判断和赋值,从而可以调用EPAT来分析Java程序的路径条件,判断出路径是否可行,并对可行的路径产生测试数据.4路径选择模块为了采用较少的测试数据测试程序,可以在所有可行路径中选择一些有代表性的路径来测试被测代码.可行的选择标准就是覆盖准则,例如语句覆盖.在这种测试方法中,

28、我们力图用最少的测试数据去覆盖尽可能多的语句或者是基本块.这个问题实际上是一个测试集约简问题.Wang等人指出,这种以覆盖路径中的点或者边为目标的测试约简问题可以采用线性规划方法求解9.具体到这个问题,由于路径生成模块可能产生的路径数目太多,一般的线性规划工具无法处理这么大规模的问题,工具JUTA通过以下3个步骤来约简测试集.不可行路径删除.首先要做的就是删掉不可行路径.这一步在我们的前几个模块已经完成,所以可以不用考虑.删除冗余路径.采用贪心算法来减少可行路径集合的大小,将那些对覆盖率没有贡献的测试路径予以删除.寻找最优路径集合.可以使用线性规划工具进一步删除冗余的路径,得到一个最小的路径集

29、合.实验结果表明,这个路径约简方法能够得到接近最优的测试集合.2.4.2静态测试后端静态测试的目标是给出程序是否包含某类错误的一个判断.在原理上,工具JUTA的静态测试与动态测试都是采用路径分析方法,所以静态测试后端重用了动态测试后端的3个模块,即路径生成、路径转换、路径分析.在本文1.3节中指出,可以通过简单的断言来描述程序的错误性质,从而自动地、静态地检查程序的错误.为了便于用于描述程序错误性质,工具在静态测试的后端中的路径分析模块之前增加一个模块,用于在路径中插入断言表达式.当此模块功能打开时,工具JUTA的输出就是满足这些条件的测试路径集合.在工具JUTA中,断言插入模块读入条件表达式

30、,并将这些条件插入到路径的相应位置.目前,JUTA支持在指定的基本块前后加入前置或者后置条件.断言的语法形式是BBID expr Position Mode,其中:BBID表示基本块的编号;expr表示描述错误的性质的条件表达式,目前支持线性数值约束与布尔逻辑约束的混合;Position表示插入断言的位置有两个选项:pre和post,分别表示插入到基本块之前或者之后;Mode表示断言插入的模式,有4种选项,F表示在路径中第1次出现该基本块时插入;L表示在路径中最后一次出现该基本块时插入,A表示在所有的基本块的对应位置插入该断言;而当这一项为一个数值i时,表示在该基本块第i次出现的位置插入断言.

31、例2.假定为了测试如下循环程序是否有数组下标越界的错误. block 14 forinti=0;i block 15 read;我们在基本块15中发现被测程序对数组a下标进行了运算,则可以在基本块15之后加入如下条件表达式,描述下标越界:152i =20post L,然后让工具枚举从控制流图起点到基本块15的部分路径并检查可行性.这样,如果JUTA输出一条可行的部分路径,即存在一条可以执行的输入使得描述错误的断言可满足,则表示程序在基本块15中可能含有数组下标越界的错误.1845严俊等:JUTA:一个Java自动化单元测试工具2.4.3动静态测试后端的不同之处动态测试需要分析完整路径并给出测试

32、数据,而静态测试并不需要给出完整的路径,只需找到包含错误的部分路径即可.因而在静态测试中,路径生成模块给出的路径是以可能出错的基本块为终点的部分路径.另外,静态测试需要一个断言插入模块插入用户定义的断言以检查程序中的错误,而动态测试需要一个路径选择的模块来约简测试集.表1比较了两个后端的不同之处:Table 1Comparison Between the Backends of Static andDynamic Testing表1静态测试与动态测试后端比较Module Static Testing Dynamic TestingPath Generation Partial Path Com

33、plete PathAssertion InsertionInsert User WrittenAssertions-Path Selection-Test set reduction3实例研究本文我们将通过部分实例来展示工具的功能.3.1动态测试动态测试的目标是产生测试用例,并达到测试覆盖率.我们选择了6个方法实例,设置每个循环限制的循环次数上限是3次,覆盖准则是语句覆盖,得到一个可行路径集合F.然后通过路径选择模块约简得到一个最优测试集合O.表2列出了实验结果,所有实例的运行时间均在1 min以内.这里,圈复杂度10描述了程序的逻辑复杂度,其定义为v=e-n+2=d+1,其中,e为控制流图

34、中边的数目,n为节点的数目,而d为控制流图中判断节点的个数.一般来说,满足语句覆盖的最后测试集的大小不超过代码的圈复杂度1.Table 2Unit Test Generation表2单元测试用例生成Functionv F O triDiv6 11 3reminder2 5 1bubbleSort4 33 2binarySearch3 5 1insertSort4 9 1gcd4 4 13.2静态测试静态测试的目标是给出程序是否含有某类错误的判断.我们在冒泡排序程序中引入了一个错误,如图5所示:public static intbubbleSortBadinttemp;forinti=0;ifo

35、rintj=0;j 错误, =应该为 ifarrj+1 block 4 temp=arrj;arrj=arrj+1;arrj+1=temp;returnarr;Fig.5Faulty code of buble sort.图5冒泡排序的错误代码为了检测程序是否有数组下标溢出的错误,考虑到出现的数组下标有j和j+1,所以我们插入如下断言到基本块4:4j=sizej+1=sizepost L.设置循环次数上限为3次,工具JUTA在4 s内发现了4条以基本块4为终点的部分路径,其测试数据如表3所示.易知,这4条路径对应的数组长度均为2,但是路径执行过程中访问了arr2,发生了数组越界错误.Table

36、 3Test Data for Array Index Out of Bounds表3检出数组下标溢出的测试数据Test Path Test Data1size=2,arr0=1,arr1=0,arr2=02size=2,arr0=1,arr1=0,arr2=13size=2,arr0=0,arr1=1,arr2=04size=2,arr0=0,arr1=0,arr2=04相关工作目前,知名度最高的Java单元测试工具是由Gamma和Beck编写的回归测试框架JUnit11.JUnit测试是程序员测试,即需要程序员知道被测试的软件如何完成功能和完成什么样的功能,在此基础上,由程序员设计测试用例

37、完成测试.类似的测试框架还有Cactus12,一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码;Abbot131846计算机研究与发展2010,47是一个用来测试Java GUIs的框架.与我们的工具JUTA不同,这些框架提供了一些方便的功能,例如,自动生成测试脚本,但是不包含自动生成测试用例以与自动检查程序错误的功能.学术界对于Java单元测试进行了多年的研究.在自动测试用例生成方面,Cute14采用符号执行与具体执行相结合的方法,用于自动测试Java代码.值得一提的是Cute支持指针和数组,但是它无法处理数组下标表达式的运算.类似地采用符号执行技术的Java自动测试工具

38、还有Symstra15等.在静态分析方面,学术界也开发了部分针对Java的静态分析工具.ESC Java16是一个Compaq开发的程序设计工具,尝试通过这个程序原文的静态分析来发现在Java中的普遍运行错误.ESC Java217是ESC Java的扩展,程序员通过给方法添加前置断言、后置断言和循环不变量等JML注释,使用定理证明器Simplify,对Java程序的规范进行形式化验证.如果不添加任何注释,ESC Java2也能查找空指针、数组越界等错误,并且可以通过添加注释移除误报.Findbugs18是一个轻量级静态分析工具,它检查类或者JAR文件,将字节码通过词法分析,与一组缺陷模式进行

39、对比以发现可能的问题.Findbugs同时也使用了数据流分析技术,它主要能检测空引用、同步错误、输入输出流、字符串相关、冗余变量等错误.正如文献19指出,这些静态分析工具一般精度不高,其好处是效率很高,能处理大程序;但其问题是分析结果的可信度差,可能会有很多的误报和漏报.所谓误报就是分析工具报告的错误实际上不存在;所谓漏报就是程序中某些错误没有被分析工具发现.工具JUTA中的静态分析方法是文献19提出的精确静态分析技术在Java代码分析上的实际应用,其目标是针对小规模的程序代码作较为精确的分析,在一定程度上减少误报和漏报率.5结论与未来的工作本文描述了一个Java自动化单元测试框架JUTA.J

40、UTA对于一个给定的Java方法能够自动地扫描代码,产生满足覆盖准则的、较小的测试数据集合.同时,用户能够方便地在被测代码中插入一些表达式,从而生成满足表达式的测试用例.这样,对于能够用简单条件表达式描述的程序错误,工具也能够自动的发现该类错误.实验结果表明,该工具能够在可接受的时间内给出符合测试准则的测试用例.如果用户能给出错误描述的断言,工具能够自动地找出程序中的错误.目前,框架JUTA仅仅实现了Java语言一些自动化单元测试一些基本的功能.下一步的工作主要是对JUTA的一些功能进行扩展.例如,目前仅仅支持对单个方法进行测试,未来将会扩展到对Java的单个类进行测试,这样,工具需要对方法调

41、用进行精确和自动化的建模.另外,工具经过适当的扩展可以支持更多的测试准则以与更加灵活的错误性质描述.除此之外,还需要增加一些与测试相关的功能,例如测试脚本自动生成、错误定位等.参考文献1Zhu Hong,Hall P A V,May J H R.Software unit testcoverage and adequacyJ.ACM Computer Survey,1997,29:366-4272Zhang Jian,Wang Xiaoxu.A constraint solver and itsapplication to path feasibility analysisJ.Int Jour

42、nal ofSoftware Engineering and Knowledge Engineering,2001,11:139-1563Edvardsson J.A survey on automatic test data generationC Proc of the 2nd Conf on Computer Science andEngineering in Linkping.Linkping:ECSEL,1999:21-284King J C.Symbolic execution and program testingJ.Communications of the ACM,1976,

43、19:385-3945Zhang Jian.Specification analysis and test data generation bysolving Boolean combinations of numeric constraintsC Proc of the 1st Asia-Pacific Conf on Quality Software.Piscataway,NJ:IEEE,2000:267-2746Zhang Jian.Symbolic execution of program paths involvingpointer and structure variablesC

44、Proc of the 4th Int Confon Quality Software.Piscataway,NJ:IEEE,2004:87-927Sable Research Group.Soot:A Java optimization frameworkCP OL.2010-01-01.: sable.mcgill.ca soot tutorial index.html8Beizer B.Software testing techniquesM.New York:JohnWiley&Sons,19891847严俊等:JUTA:一个Java自动化单元测试工具9Wang H S,Hsu S R

45、,Lin J C.A generalized optimal path-selection model for structural program testingJ.TheJournal of Systems and Software,1989,10:55-6310McCabe T J.A complexity measureJ.IEEE Trans onSoftware Engineering,1976,SE-2:308-32011Beck K,Gamma E.JUnitCP OL.2010-01-01.: junit.org 12Apache Software Foundation.Ca

46、ctusCP OL.2010-01-01.: jakarta.apache.org cactus 13Wall T.AbbotCP OL. 2010-01-01.: abbot. 14Sen K,Agha G.CUTE,jCUTE:Concolic unit testing andexplicit path model-checking toolsC LNCS 4144:Proc ofthe 18th Int Conf on Computer Aided Verification.Berlin:Springer,2006:419-42315Xie T,Marinov D,Schulte W,e

47、t al.Symstra:A frameworkfor generating object-oriented unit tests using symbolicexecutionC LNCS 3440:Proc of the 11th Int Conf onTools and Algorithms for the Construction and Analysis ofSystems.Berlin:Springer,2005:365-38116Flanagan C,Rustan K,Leino M,et al.Extended staticchecking for JavaC Proc of

48、ACM SIGPLAN Conf onProgramming Language Design and Implementation.New York:ACM,2002:234-24517Cok D R,Kiniry J.ESC Java2:Uniting ESC Java and JMLC LNCS 3362:Proc of Int Workshop on Construction andAnalysis of Safe,Secure,and Interoperable Smart Devices.Berlin:Springer,2004:108-12818Pugh B,Hovemeyer D

49、.FindbugsCP OL.2010-01-01.: 19Zhang Jian.Sharp static analysis of programsJ.ChineseJournal of Computers,2008,31:1549-1553张健.精确的程序静态分析J.计算机学报,2008,31:1549-1553Yan Jun,born in 1980.PhD and associateprofessor.Member of China ComputerFederation.His main research interestsinclude constraint processing,pr

50、ogramanalysis and software testing.严俊,1980年生,博士,副研究员,中国计算机学会会员,主要研究方向为约束求解、程序分析与软件测试.Guo Tao,born in 1974.PhD and associateprofessor.His main research interestsinclude information security vulnerabilityanalysis.郭涛,1974年生,博士,副研究员,主要研究方向为信息安全漏洞分析.Ruan Hui,born in 1984.Master ofScience.His main researc

51、h interestsinclude program analysis and automaticsoftware testing.阮辉,1984年生,硕士,主要研究方向为程序分析与软件测试自动化.Xuan Jifeng,born in 1984.PhD candidate.His main research interests includeintelligent computing and automaticsoftware testing.玄跻峰,1984年生,博士研究生,主要研究方向为智能计算与软件测试.Research BackgroundProgram correctness is

52、 one of the most important issues for computer scientists and engineers.For the past ten years,wehave been working on the automatic test data generation for programs,and on finding bugs in programs through staticchecking.Building on our previous works,we propose an automatic testing tool for Java un

53、it testing in this paper.This toolgenerates a set of paths from the flow graph of a Java unit program.Then,based on the symbolic execution technique,itcomputes a set of test data that satisfies the statement or branch coverage criteria from the path set,or analyzes the programsbehavior with user-wri

54、tten assertions pared with other testing tool on Java programs,our method is more accurate andthus more automatic to some extent.Our experimental results show that the method is quite accurate and efficient.This work is partially supported by the National Natural Science Foundation of Chinaunder Grant No.60903049,the National High-Techprogram with project No.2009AA01Z148 and 2009AA010313,and the CAS InnovationProgram under grant No.ISCAS2009-DR01.1848计算机研究与发展2010,4717 / 17

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!