当前位置: 首页 > 专利查询>南京大学专利>正文

一种面向Java程序的随机测试用例生成方法技术

技术编号:7898102 阅读:213 留言:0更新日期:2012-10-23 04:19
本发明专利技术公开了一种面向Java程序的随机测试用例生成方法,其步骤为:(1)解析Java程序的类定义,获取对象方法列表;(2)建立对象方法间的依赖关系图,包括方法调用图和属性依赖图;(3)确定待覆盖的目标方法列表;(4)以公有类的实例化为目的生成调用链,维护类对象库;(5)以目标方法覆盖为目的生成调用链,维护调用链库;(6)基于调用链库生成Java程序的测试用例集。本发明专利技术可广泛应用于大中型Java软件系统的自动化测试工作,可完全自动化地生成测试用例,能够以较少的测试用例数量达到更高的代码覆盖率,同时能够处理复杂的数据结构,自动生成测试断言;测试用例生成方法简单有效,具有良好的适用性和扩展性。

【技术实现步骤摘要】

本专利技术涉及Java软件程序的自动化测试用例生成,特别涉及利用Java语言本身提供的反射机制和虚拟机设施,分析对象方法间的依赖关系,应用组合测试技术,完全自动化地生成测试用例。
技术介绍
随机测试是一种有效的能够完全实现自动化的测试用例生成方法。随机测试基于软件程序的输入空间,利用随机算法独立采样测试输入,进而生成测试用例。随机测试的优势包括测试用例生成步骤简单,能够在较短的时间内生成庞大数量的测试用例;能够利用现有的伪随机数生成算法,基本不需要人工干预;随机算法能够保证测试输入的无偏性,避免人工测试的主观偏见问题;随机算法能够保证测试输入的独立性,在足够数量的测试用例前提下,能够采用统计学方法对软件质量做定量评估。随机测试同时也存在一些劣势,主要包括对于复杂数据类型难以处理,难以自动识别其所对应的输入空间类型;测试断言难以生成,难以自动确定每个测试用例的预期结果;输入空间过于庞大,为达到有效的代码覆盖率(各种分支条件的覆盖),常需要生成海量的测试用例,冗余的测试用例过多;对于特定的程序上下文,随机测试所生成的测试输入有很大比例是无意义的,导致无效和非法的测试用例。Java程序是一类面向对象程序。随机测试应用到面向对象程序可以有效提高测试用例生成的多样性和实用性,能够有效降低测试用例生成的成本和时间。在面向对象程序测试中,生成一个测试用例不仅需要考虑测试输入,还需要考虑相关对象所处的状态(由类中属性变量的不同取值决定);对象状态的生成需要通过进一步的类(对象)实例化和对象方法调用来完成,其中类实例化实际上是对类中构造方法的调用;于是对应一个对象方法的调用序列,定义为调用链。因此面向对象程序的随机测试需要随机生成调用链,同时为调用链中的每一个对象方法调用随机生成测试输入。目前应用于Java程序的随机测试方法包括JCrasher、Randoop> Eclat等,这些随机测试方法尚存在无效和冗余测试用例过多,随机生成的调用链过于复杂,缺少合理的系统化指导,测试生成时间过长或者对人工干预的要求较多等问题。
技术实现思路
本专利技术的主要目的是针对传统面向对象随机测试方法存在的无效和冗余测试用例过多、代码覆盖率过低等问题,提出,应用组合测试技术,分析对象方法之间的依赖关系,系统化生成和维护调用链,自动化生成测试用例。为实现本专利技术所述目的,本专利技术采用如下的步骤I)解析Java程序的类定义,获取对象方法列表;利用Java语言提供的反射机制,首先从指定目录读取所有的.class文件和.jar文件;再进一步从.jar文件中析取.class文件,获得Java程序中所有可能包含的类的定义;基于每一个类,根据.class文件读取其中的属性变量和对象方法的定义体;最后输出Java程序的对象方法列表; 2)建立对象方法间的依赖关系图,包括方法调用图和属性依赖图,其中构建方法调用图的过程是基于对象方法的定义体,发掘对象方法之间是否存在调用与被调用,再构建出方法调用 3)确定待覆盖的目标方法列表,组成目标覆盖集7(.; 4)以公有类的实例化为目的生成调用链,维护类对象库; 5)以目标方法覆盖为目的生成调用链,维护调用链库; 6)基于调用链库生成Java程序的测试用例集。 上述步骤2)中构建方法调用图的过程是基于对象方法的定义体,发掘对象方法之间是否存在调用与被调用,再构建出方法调用图。上述步骤2)中构建属性依赖图的过程是首先将对象方法作为属性依赖图的节点;根据每个对象方法的定义体,通过分析其中每一条语句,确定该对象方法的读属性集合和写属性集合;然后对任意两个对象方法和mJ (节点对),如果⑴;的读属性集合AUs'和 的写属性集合之间的交集不为空集,则添加有向边<> ;从另一角度,如果W>/I ,和i %之间的交集不为空集,则添加有向边< > ;最后处理完所有对象方法的节点对后,输出属性依赖图。上述步骤3)中待覆盖的目标方法必须满足4个基本条件 条件I.在方法调用图中是顶层节点,即没有其他对象方法调用m ;或者只有“main”方法调用了m ; 条件2. I不能是构造方法,构造方法与类同名; 条件3. m必须是公有方法,即m由访问修饰符“public”定义; 条件4. m必须是实体方法,即m必须有定义体,不能由抽象修饰符“abstract”定义、或者在接口 “Interface”类中定义; 从Java程序对象方法列表中,筛选满足上述4个条件的对象方法组成目标覆盖集TC。上述步骤4)中以公有类的实例化为目的生成调用链是指以公有“public”构造方法为覆盖目标生成调用链;用二元组< MSnpOki >表示,其中况5’印代表一个调用链,结尾以“New”操作符调用该构造方法,可能涉及多个调用链的串接; %'代表所创建的对象;(.%'对应的类不能是不可以实例化的抽象“abstract”类或者接口 “interface”类;利用Java虚拟机设施运行Λ/5Μ/,通过测试断言判定其运行是否正确;如果正确,则将二元组<MSnh Ohj >添加入类对象库;否则将A+/Sff/添加入调用链库。上述以公有构造方法为覆盖目标生成调用链的过程是首先对Java程序中包含的公有类排序,排除其中的接口类和抽象类;排序的依据是排在前面的类在构造方法中尽量不会引用排在后面的类;然后按顺序对每一个公有类,处理其中每一个公有的构造方法为构造方法的每一个参数按照参数类型设置级别;再根据参数级别的两两组合,为每一个参数级别组合构造调用链y ;其中两两组合是指对任意两个参数 和S,其级别的所有可能组合至少出现一次。上述判定调用链WSYg运行是否正确的测试断言基于以下4个判定组成 判定I.运行过程中没有抛出异常; 判定2.对象不能为空,即“assertNotNull (Obj) ” ; 判定 3.对象等于自身,即 ^assertTrue (Obj. equals (Obj)) ” ; 判定4.对象的散列值等于自身的散列值,即“assertTrue (Obj. hashcode O==Obj.hashcodeO)”。上述步骤中按照参数类型设置级别时分以下4种场景 场景I.基本数据类型参数,分以下4种情况进行处理 情况I.整数类型(包括长整型、短整型和字符型),分为4个级别(Level):。、任一个正整数、任一个负整数、最大值(如Integer. MAX_VALUE); 情况2.浮点类型(包括单精度和双精度),分为4个级别0、任一个正浮点数、任一个负浮点数、最大值(如Double. MAX_VALUE); 情况3.布尔类型,分为2个级别true、false ; 情况4.枚举类型,分为I个级别任一个枚举值; 场景2.字符串类型(即String类),分为4个级别null、空串、任意长度普通串、任意长度包含特殊字符(如VO的串; 场景3.对象类型(排除String类以及同基本数据类型对应的类如Integer、Double等),分3种情况处理 情况I.普通类,即可以实例化的类;此时根据类所拥有的公有构造方法数量来决定参数的级别数量若参数I有I个以上的公有构造方法,则 的级别本文档来自技高网
...

【技术保护点】
一种面向Java程序的随机测试用例生成方法,其特征在于包括以下步骤:1)解析Java程序的类定义,获取对象方法列表;利用Java语言提供的反射机制,首先从指定目录读取所有的.class文件和.jar文件;再进一步从.jar文件中析取.class文件,获得Java程序中所有可能包含的类的定义;基于每一个类,根据.class文件读取其中的属性变量和对象方法的定义体;最后输出Java程序的对象方法列表;2)建立对象方法间的依赖关系图,包括方法调用图和属性依赖图,其中构建方法调用图的过程是:基于对象方法的定义体,发掘对象方法之间是否存在调用与被调用,再构建出方法调用图;3)确定待覆盖的目标方法???????????????????????????????????????????????的列表,组成目标覆盖集;4)以公有类的实例化为目的生成调用链,维护类对象库;5)以目标方法覆盖为目的生成调用链,维护调用链库;6)基于调用链库生成Java程序的测试用例集。2012102192859100001dest_path_image002.jpg,2012102192859100001dest_path_image004.jpg...

【技术特征摘要】

【专利技术属性】
技术研发人员:顾庆张孟乐汤九斌陈道蓄
申请(专利权)人:南京大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1