CN102736980A - 一种面向Java程序的随机测试用例生成方法 - Google Patents

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

Info

Publication number
CN102736980A
CN102736980A CN2012102192859A CN201210219285A CN102736980A CN 102736980 A CN102736980 A CN 102736980A CN 2012102192859 A CN2012102192859 A CN 2012102192859A CN 201210219285 A CN201210219285 A CN 201210219285A CN 102736980 A CN102736980 A CN 102736980A
Authority
CN
China
Prior art keywords
class
rank
call chain
situation
parameter
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN2012102192859A
Other languages
English (en)
Other versions
CN102736980B (zh
Inventor
顾庆
张孟乐
汤九斌
陈道蓄
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN201210219285.9A priority Critical patent/CN102736980B/zh
Publication of CN102736980A publication Critical patent/CN102736980A/zh
Application granted granted Critical
Publication of CN102736980B publication Critical patent/CN102736980B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

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

Description

一种面向Java程序的随机测试用例生成方法
 
技术领域
本发明涉及Java软件程序的自动化测试用例生成,特别涉及利用Java语言本身提供的反射机制和虚拟机设施,分析对象方法间的依赖关系,应用组合测试技术,完全自动化地生成测试用例。
背景技术
随机测试是一种有效的能够完全实现自动化的测试用例生成方法。随机测试基于软件程序的输入空间,利用随机算法独立采样测试输入,进而生成测试用例。随机测试的优势包括:测试用例生成步骤简单,能够在较短的时间内生成庞大数量的测试用例;能够利用现有的伪随机数生成算法,基本不需要人工干预;随机算法能够保证测试输入的无偏性,避免人工测试的主观偏见问题;随机算法能够保证测试输入的独立性,在足够数量的测试用例前提下,能够采用统计学方法对软件质量做定量评估。随机测试同时也存在一些劣势,主要包括:对于复杂数据类型难以处理,难以自动识别其所对应的输入空间类型;测试断言难以生成,难以自动确定每个测试用例的预期结果;输入空间过于庞大,为达到有效的代码覆盖率(各种分支条件的覆盖),常需要生成海量的测试用例,冗余的测试用例过多;对于特定的程序上下文,随机测试所生成的测试输入有很大比例是无意义的,导致无效和非法的测试用例。
Java程序是一类面向对象程序。随机测试应用到面向对象程序可以有效提高测试用例生成的多样性和实用性,能够有效降低测试用例生成的成本和时间。在面向对象程序测试中,生成一个测试用例不仅需要考虑测试输入,还需要考虑相关对象所处的状态(由类中属性变量的不同取值决定);对象状态的生成需要通过进一步的类(对象)实例化和对象方法调用来完成,其中类实例化实际上是对类中构造方法的调用;于是对应一个对象方法的调用序列,定义为调用链。因此面向对象程序的随机测试需要随机生成调用链,同时为调用链中的每一个对象方法调用随机生成测试输入。目前应用于Java程序的随机测试方法包括JCrasher、Randoop、Eclat等,这些随机测试方法尚存在无效和冗余测试用例过多,随机生成的调用链过于复杂,缺少合理的系统化指导,测试生成时间过长或者对人工干预的要求较多等问题。
发明内容
本发明的主要目的是针对传统面向对象随机测试方法存在的无效和冗余测试用例过多、代码覆盖率过低等问题,提出一种面向Java程序的随机测试用例生成方法,应用组合测试技术,分析对象方法之间的依赖关系,系统化生成和维护调用链,自动化生成测试用例。
为实现本发明所述目的,本发明采用如下的步骤:
1)解析Java程序的类定义,获取对象方法列表;利用Java语言提供的反射机制,首先从指定目录读取所有的.class文件和.jar文件;再进一步从.jar文件中析取.class文件,获得Java程序中所有可能包含的类的定义;基于每一个类,根据.class文件读取其中的属性变量和对象方法的定义体;最后输出Java程序的对象方法列表;
2)建立对象方法间的依赖关系图,包括方法调用图和属性依赖图,其中构建方法调用图的过程是:基于对象方法的定义体,发掘对象方法之间是否存在调用与被调用,再构建出方法调用图;
3)确定待覆盖的目标方法列表,组成目标覆盖集                                               
Figure 2012102192859100002DEST_PATH_IMAGE002
4)以公有类的实例化为目的生成调用链,维护类对象库;
5)以目标方法覆盖为目的生成调用链,维护调用链库;
6)基于调用链库生成Java程序的测试用例集。
上述步骤2)中构建方法调用图的过程是:基于对象方法的定义体,发掘对象方法之间是否存在调用与被调用,再构建出方法调用图。
上述步骤2)中构建属性依赖图的过程是:首先将对象方法作为属性依赖图的节点;根据每个对象方法的定义体,通过分析其中每一条语句,确定该对象方法的读属性集合和写属性集合;然后对任意两个对象方法
Figure 2012102192859100002DEST_PATH_IMAGE006
(节点对),如果
Figure 576702DEST_PATH_IMAGE004
的读属性集合
Figure 2012102192859100002DEST_PATH_IMAGE008
Figure 556160DEST_PATH_IMAGE006
的写属性集合
Figure 2012102192859100002DEST_PATH_IMAGE010
之间的交集不为空集,则添加有向边
Figure 2012102192859100002DEST_PATH_IMAGE012
;从另一角度,如果
Figure 2012102192859100002DEST_PATH_IMAGE014
Figure 2012102192859100002DEST_PATH_IMAGE016
之间的交集不为空集,则添加有向边
Figure 2012102192859100002DEST_PATH_IMAGE018
;最后处理完所有对象方法的节点对后,输出属性依赖图。
上述步骤3)中待覆盖的目标方法必须满足4个基本条件:
条件1. 在方法调用图中是顶层节点,即没有其他对象方法调用
Figure 582235DEST_PATH_IMAGE020
;或者只有“main”方法调用了
Figure 39761DEST_PATH_IMAGE020
条件2. 
Figure 854133DEST_PATH_IMAGE020
不能是构造方法,构造方法与类同名;
条件3. 
Figure 738912DEST_PATH_IMAGE020
必须是公有方法,即
Figure 5946DEST_PATH_IMAGE020
由访问修饰符“public”定义;
条件4. 
Figure 267163DEST_PATH_IMAGE020
必须是实体方法,即
Figure 936042DEST_PATH_IMAGE020
必须有定义体,不能由抽象修饰符“abstract”定义、或者在接口“Interface”类中定义;
从Java程序对象方法列表中,筛选满足上述4个条件的对象方法组成目标覆盖集TC
上述步骤4)中以公有类的实例化为目的生成调用链是指以公有“public”构造方法为覆盖目标生成调用链;用二元组
Figure 2012102192859100002DEST_PATH_IMAGE022
表示,其中
Figure 2012102192859100002DEST_PATH_IMAGE024
代表一个调用链,结尾以“New”操作符调用该构造方法,可能涉及多个调用链的串接;
Figure 2012102192859100002DEST_PATH_IMAGE026
代表所创建的对象;
Figure 181603DEST_PATH_IMAGE026
对应的类不能是不可以实例化的抽象“abstract”类或者接口“interface”类;利用Java虚拟机设施运行
Figure 998249DEST_PATH_IMAGE024
,通过测试断言判定其运行是否正确;如果正确,则将二元组
Figure 735261DEST_PATH_IMAGE022
添加入类对象库;否则将添加入调用链库。
上述以公有构造方法为覆盖目标生成调用链的过程是:首先对Java程序中包含的公有类排序,排除其中的接口类和抽象类;排序的依据是排在前面的类在构造方法中尽量不会引用排在后面的类;然后按顺序对每一个公有类,处理其中每一个公有的构造方法:为构造方法的每一个参数按照参数类型设置级别;再根据参数级别的两两组合,为每一个参数级别组合构造调用链
Figure 750807DEST_PATH_IMAGE024
;其中两两组合是指对任意两个参数
Figure 2012102192859100002DEST_PATH_IMAGE028
Figure 2012102192859100002DEST_PATH_IMAGE030
,其级别的所有可能组合至少出现一次。
上述判定调用链
Figure 54750DEST_PATH_IMAGE024
运行是否正确的测试断言基于以下4个判定组成:
判定1. 运行过程中没有抛出异常;
判定2. 对象不能为空,即“assertNotNull(Obj)”;
判定3. 对象等于自身,即“assertTrue(Obj.equals(Obj))”;
判定4. 对象的散列值等于自身的散列值,即“assertTrue(Obj.hashcode()==Obj.hashcode())”。
上述步骤中按照参数类型设置级别时分以下4种场景:
场景1. 基本数据类型参数,分以下4种情况进行处理:
情况1. 整数类型(包括长整型、短整型和字符型),分为4个级别(Level):0、任一个正整数、任一个负整数、最大值(如Integer.MAX_VALUE);
情况2. 浮点类型(包括单精度和双精度),分为4个级别:0、任一个正浮点数、任一个负浮点数、最大值(如Double.MAX_VALUE);
情况3. 布尔类型,分为2个级别:true、false;
情况4. 枚举类型,分为1个级别:任一个枚举值;
场景2. 字符串类型(即String类),分为4个级别:null、空串、任意长度普通串、任意长度包含特殊字符(如\n)的串;
场景3. 对象类型(排除String类以及同基本数据类型对应的类如Integer、Double等),分3种情况处理:
情况1. 普通类,即可以实例化的类;此时根据类所拥有的公有构造方法数量来决定参数的级别数量:若参数
Figure 392190DEST_PATH_IMAGE028
有1个以上的公有构造方法,则
Figure 35661DEST_PATH_IMAGE028
的级别为:null、分别与不同构造方法对应的级别;若
Figure 433144DEST_PATH_IMAGE028
没有公有构造方法,则为2个级别:null、任一个可以返回该类对象的调用链;
情况2. 接口“Interface”类;此时根据实现“Implement”该接口的普通类数量来决定参数的级别数量;每个级别分别对应一个普通类,在具体取参数值时,按情况1随机选择相应普通类的一个级别赋值;
情况3. 抽象“abstract”类;此时根据继承“extends”该抽象类的普通类数量来决定参数的级别数量;每个级别分别对应一个普通类,在具体取参数值时,按情况1随机选择相应普通类的一个级别赋值;
在上述情况2和情况3中,如果实现或继承的类是抽象类,则进一步按情况3确定继承该抽象类的普通类,数量累计入参数的级别数量。
场景4. 数组类型,按照数组的长度划分级别,分为3个级别:0、1、任一个正整数;对于每一个数组元素,再按照其所属的类型随机选择一个级别来赋值。
上述步骤5)中以目标方法覆盖为目的生成调用链的过程是:首先按照属性依赖图对目标覆盖集中的目标方法排序,排序的依据是排在前面的目标方法尽量在属性操作上不依赖于排在后面的目标方法;然后顺序对每一个目标方法,从运行主体、参数列表、以及属性依赖三个层面分别设置级别,再按照层面级别的两两组合,为每一个层面级别组合构造调用链;所构造的调用链
Figure 303197DEST_PATH_IMAGE024
以该目标方法的调用为结尾,可能涉及多个调用链的串接;
Figure 860562DEST_PATH_IMAGE024
添加入调用链库中;如果该目标方法返回了类对象库中不存在的类的对象,则应用测试断言判定
Figure 632209DEST_PATH_IMAGE024
运行正确后,将二元组
Figure 645164DEST_PATH_IMAGE022
添加入类对象库中。
上述步骤中对目标方法按照不同层面设置级别分以下三个层面:
(1)运行主体,指运行目标方法的类(static)或对象。如果是静态(static)方法,不考虑运行主体;如果是非静态方法,则运行主体是实例化的对象,分以下两种情况处理:
情况1. 普通类,同处理对象类型参数时的情况1类似,根据该类所拥有的公有构造方法数量划分级别,不考虑Null,级别数量等同于公有构造方法的数量;
情况2. 抽象类,同处理对象类型参数的情况3类似,根据继承该抽象类的普通类数量划分级别,不考虑Null,级别数量等同于继承该类的普通类数量。
(2)参数列表,参数列表的处理与步骤4)中构造方法的参数列表处理方式相同:按照参数类型设置级别,生成所有参数级别的两两组合。
(3)属性依赖,考虑目标方法所读取的所有属性变量,即读属性集合
Figure 2012102192859100002DEST_PATH_IMAGE032
;按
Figure 589986DEST_PATH_IMAGE032
中属性变量的个数设置级别;每一个级别对应任一个写入相应属性变量的目标方法,其写属性集合
Figure 2012102192859100002DEST_PATH_IMAGE034
中包含该属性变量。
上述步骤6)中遵循JUnit框架基于调用链库生成Java程序测试用例集的过程是:首先以Java程序中的类为单位创建“TestCase”类,用以组织调用链;对调用链库中的每一个调用链,按所覆盖的构造方法或目标方法
Figure 4787DEST_PATH_IMAGE020
创建一个“Test”方法,其中按步骤4)所述加入测试断言;然后按照
Figure 947335DEST_PATH_IMAGE020
所从属的类,将“Test”方法添加入对应的“TestCase”类中;最后将所有非空的“TestCase”类添加入“TestSuite”类中,作为最终生成的Java程序的测试用例集。
本发明通过引入了组合测试技术,充分考虑对象方法间因属性变量操作而导致的依赖关系,有效利用Java语言的反射机制和虚拟机设施,系统化生成和维护调用链,自动生成测试断言,高效率生成测试用例集。基于Java软件程序的实验数据表明,同现有面向Java的随机测试方法相比,为达到相同的代码覆盖率,本发明方法需要更少的测试用例数量;而在同样的测试用例生成时间内,本发明能够生成更多的测试用例;组合测试技术的引入为本发明提供了测试用例生成过程何时终止的合理判定,使得测试用例生成过程更具有系统性。运用本发明时,在测试用例生成过程中完全不需要人工干预,缓解和部分解决了现有随机测试方法存在的无效和冗余测试用例过多、代码覆盖率过低等问题;本发明可广泛应用于大中型Java软件系统的自动化测试工作,适用于单元测试、集成测试和系统测试各个阶段;具有良好的适用性和扩展性。
下面结合附图进行详细说明。
附图说明
图1 是面向Java程序的随机测试用例生成方法的结构图;
图2 是解析Java程序的类定义并获取对象方法列表的工作流程图;
图3 是一个Java程序对象方法列表的示例图;
图4 是构建对象方法间属性依赖图的工作流程图;
图5 是确定待覆盖的目标方法列表的工作流程图;
图6 是以公有类实例化为目的生成调用链的工作流程图;
图7 是对象方法调用链的一个示例图;
图8 是以目标方法覆盖为目的生成调用链的工作流程图;
图9 是基于调用链库生成Java程序测试用例集的工作流程图。
具体实施方式
如图1所示,本发明方法包含六个基本步骤:(1)解析Java程序的类定义,获取对象方法列表;(2)建立对象方法间的依赖关系图,包括方法调用图和属性依赖图;(3)确定待覆盖的目标方法列表;(4)以公有类的实例化为目的生成调用链;(5)以目标方法的覆盖为目的生成调用链;(6)基于调用链库生成Java程序的测试用例集。其间需要维护和扩充类对象库和调用链库,以助于生成有效的测试用例。方法的输入是Java程序,可以由包含Java程序的目录、或者整合了Java程序的jar包(.jar文件)表示;输出是测试用例集,采用JUnit测试用例框架描述。
步骤一是解析Java程序的类定义,并获取对象方法列表;过程如图2所示。一个Java程序由若干“类(class)”组成,每个类的定义中包含“属性”和“方法”,分别称之为“属性变量”和“对象方法”;对象方法可分为两个类别:构造方法和一般方法。所有属性变量和对象方法都可定义访问修饰符,分别是“public”、“protected”、及“private”,其中“public”修饰符代表外部可以访问该对象方法(或属性变量),即公有方法(或公有属性),能够作为测试用例的调用入口。属性变量和对象方法还可以定义静态修饰符“static”,代表该属性变量或对象方法从属于“类”,由该“类”所有实例化的(动态)对象共享。
Java语言提供反射(Reflection)机制,能够根据Java程序的二进制代码(.class文件)读取和识别Java程序的类定义信息。利用反射机制,首先从指定目录读取所有的.class文件和.jar文件;再进一步从.jar文件中析取所有.class文件,获得Java程序中所有可能包含的类定义;基于每一个类,读取其中的属性变量和对象方法定义,最后输出Java程序的对象方法列表。
图3是一个Java程序的部分对象方法列表的示意图,其中包含对象方法的名称、参数列表(参数类型列表)和返回值(类型)、对象方法所属的类名、以及对象方法的访问修饰符。类名用目录形式表示,图中“java/lang/String”代表类“java.lang.String”;单个字母表示的参数或返回值类型代表基础类型,如“I”代表整型;字母“L”代表对象类型,紧跟其后为类名;字母“[”代表数组类型,紧跟其后为数组元素所属的类型。
步骤二是建立对象方法间的依赖关系图,包括方法调用图和属性依赖图。其中方法调用图反映对象方法之间的调用关系,方法调用图的构建可以利用现有的技术,在反射机制所获取的对象方法之定义体的基础上发掘对象方法间是否存在调用与被调用。构建属性依赖图的过程如图4所示。属性依赖图定义为一个有向图
Figure 2012102192859100002DEST_PATH_IMAGE036
,其中
Figure 2012102192859100002DEST_PATH_IMAGE038
为节点集,每一个节点代表一个对象方法;
Figure 2012102192859100002DEST_PATH_IMAGE040
为边集,代表对象方法间的属性依赖关系。每个对象方法的定义体确定了对象方法可能读取的属性变量集合(读属性集合)和可能写入的属性变量集合
Figure 992838DEST_PATH_IMAGE034
(写属性集合);对于任意两个对象方法
Figure 465407DEST_PATH_IMAGE004
Figure 641174DEST_PATH_IMAGE006
Figure 2012102192859100002DEST_PATH_IMAGE042
),如果
Figure 631651DEST_PATH_IMAGE004
的读属性集合的写属性集合
Figure 326440DEST_PATH_IMAGE010
之间的交集不为空集,即,则
Figure 801284DEST_PATH_IMAGE004
在属性变量操作上依赖于
Figure 891600DEST_PATH_IMAGE006
,即存在一条从
Figure 73183DEST_PATH_IMAGE006
的有向边
Figure 2012102192859100002DEST_PATH_IMAGE046
如图4所示,首先利用反射机制获取每个对象方法的定义体,通过分析定义体的每一条语句确定该对象方法的读属性集合和写属性集合;然后对任意两个对象方法
Figure 287312DEST_PATH_IMAGE004
Figure 853423DEST_PATH_IMAGE006
,如果读属性集合和写属性集合
Figure 577982DEST_PATH_IMAGE010
之间的交集不为空集,则添加有向边
Figure 47926DEST_PATH_IMAGE012
;从另一角度,如果
Figure 417727DEST_PATH_IMAGE014
Figure 308323DEST_PATH_IMAGE016
之间的交集不为空集,则添加有向边
Figure 167694DEST_PATH_IMAGE018
;最后处理完所有的对象方法对后,输出属性依赖图。
步骤三是确定待覆盖的目标方法列表,组成目标覆盖集;过程如图5所示。对一个对象方法
Figure 12340DEST_PATH_IMAGE020
Figure 85338DEST_PATH_IMAGE020
成为目标方法(即
Figure 2012102192859100002DEST_PATH_IMAGE048
)需要满足以下4个基本条件:
条件1. 在方法调用图中是顶层节点,即没有其他对象方法调用
Figure 115611DEST_PATH_IMAGE020
;或者只有“main”方法调用了
Figure 211743DEST_PATH_IMAGE020
条件2. 不能是构造方法,构造方法与类同名,在图3中由“<init>”标识。
条件3. 
Figure 850851DEST_PATH_IMAGE020
必须是公有方法,即
Figure 989709DEST_PATH_IMAGE020
由访问修饰符“public”定义;
条件4. 必须是实体方法,即
Figure 885170DEST_PATH_IMAGE020
必须有定义体,不能由抽象修饰符“abstract”定义、或者在接口(Interface)类中定义;
按图5,首先从方法调用图中删除所有“main”方法代表的节点,以及其关联的所有边;然后针对每一个顶层节点所对应的对象方法
Figure 932760DEST_PATH_IMAGE020
;如果
Figure 242519DEST_PATH_IMAGE020
满足条件2、3和4,则将
Figure 313243DEST_PATH_IMAGE020
添加入目标覆盖集;最后处理完所有的顶层节点后,输出目标覆盖集
步骤四是以公有类的实例化为目的生成调用链,同时维护类对象库;过程如图6所示。公有类指由“public”修饰符定义的外部可以访问的类,一般包含由“public”修饰符定义的构造方法;公有类实例化是指以构造方法为覆盖目标生成调用链,用二元组
Figure 271676DEST_PATH_IMAGE022
表示,其中
Figure 814653DEST_PATH_IMAGE024
代表一个调用链,
Figure 107094DEST_PATH_IMAGE026
代表所创建的对象,对应的类必须可以实例化,不能是抽象(abstract)类或者接口(interface)类;图7所示是一个调用链的示例,其中包含先后执行的对象方法;图中以“new”操作符开头代表对构造方法的调用。
同一般的对象方法类似,构造方法可以包含一组参数;每一个参数可以是基本数据类型,也可以是字符串类型、对象类型或者数组类型。对于基本数据类型参数,分以下4种情况进行处理:
情况1. 整数类型(包括长整型、短整型和字符型),可以分为4个级别(Level):0、任一个正整数、任一个负整数、最大值(如Integer.MAX_VALUE);
情况2. 浮点类型(包括单精度和双精度),可以分为4个级别:0、任一个正浮点数、任一个负浮点数、最大值(如Double.MAX_VALUE);
情况3. 布尔类型,分为2个级别:true、false;
情况4. 枚举类型,分为1个级别:任一个枚举值。
对于字符串类型(即String类),可以分为4个级别:null、空串、任意长度普通串、任意长度包含特殊字符(如\n)的串。
对于对象类型(排除String类以及同基本数据类型对应的类如Integer、Double等),分3种情况处理:
情况1. 普通类,即可以直接实例化的类;此时根据类所拥有的公有构造方法数量来决定参数的级别数量;假设参数
Figure 26508DEST_PATH_IMAGE028
对应的类拥有3个公有的构造方法,则
Figure 720795DEST_PATH_IMAGE028
可以分为4个级别:null、3个分别与不同构造方法对应的级别。如果对应的类没有公有构造方法,则
Figure 479989DEST_PATH_IMAGE028
分为2个级别:null、任一个可以返回该类对象的调用链;
情况2. 接口(Interface)类;此时根据实现(Implement)该接口的普通类数量来决定参数的级别数量;假设参数
Figure 937515DEST_PATH_IMAGE028
对应的接口类由3个普通类实现,则
Figure 486309DEST_PATH_IMAGE028
可以分为3个级别,分别对应一个普通类;每个级别在具体取参数值时,按情况1随机选择相应普通类的一个级别赋值;
情况3. 抽象(abstract)类;此时根据继承(extends)该抽象类的普通类数量来决定参数的级别数量;假设参数
Figure 574350DEST_PATH_IMAGE028
对应的抽象类由3个普通类继承,则
Figure 903700DEST_PATH_IMAGE028
可以分为3个级别,分别对应一个普通类;每个级别在具体取参数值时,按情况1随机选择相应普通类的一个级别赋值;
在上述情况2和情况3中,如果实现或继承的类是抽象类,则进一步按情况3确定继承该抽象类的普通类,数量累计入参数的级别数量。
对于数组类型,按照数组的长度划分级别,可分为3个级别:0、1、任一个正整数;对于每一个数组元素,再按照其所属的类型随机选择一个级别来赋值或实例化。
确定所有参数可能划分的级别之后,采用两两组合的方法(组合测试技术)生成所有参数的级别组合。两两组合是指对任意两个参数
Figure 102601DEST_PATH_IMAGE028
Figure 568217DEST_PATH_IMAGE030
,其级别的所有可能组合至少出现一次。令一个构造方法(或对象方法)有三个参数
Figure 643806DEST_PATH_IMAGE030
,其中
Figure 440205DEST_PATH_IMAGE028
设置3个级别(
Figure 2012102192859100002DEST_PATH_IMAGE052
),
Figure 963591DEST_PATH_IMAGE030
设置2个级别(
Figure 2012102192859100002DEST_PATH_IMAGE054
),
Figure 455752DEST_PATH_IMAGE050
也设置2个级别(
Figure 2012102192859100002DEST_PATH_IMAGE056
);则按照两两组合,所生成的参数级别组合如表1所示:
表1
No
Figure 494115DEST_PATH_IMAGE028
Figure 97135DEST_PATH_IMAGE030
Figure 740606DEST_PATH_IMAGE050
1
Figure 2012102192859100002DEST_PATH_IMAGE058
Figure 2012102192859100002DEST_PATH_IMAGE060
Figure 2012102192859100002DEST_PATH_IMAGE062
2
Figure 2012102192859100002DEST_PATH_IMAGE064
Figure 2012102192859100002DEST_PATH_IMAGE066
Figure 262723DEST_PATH_IMAGE062
3
Figure 2012102192859100002DEST_PATH_IMAGE068
Figure 991644DEST_PATH_IMAGE060
Figure 2012102192859100002DEST_PATH_IMAGE070
4
Figure 132776DEST_PATH_IMAGE058
Figure 630753DEST_PATH_IMAGE066
Figure 202067DEST_PATH_IMAGE070
5
Figure 418285DEST_PATH_IMAGE064
Figure 715591DEST_PATH_IMAGE070
6
Figure 720456DEST_PATH_IMAGE068
Figure 158391DEST_PATH_IMAGE066
Figure 579008DEST_PATH_IMAGE062
如图6所示,首先对Java程序中包含的公有(public)类排序,排除其中的接口(interface)类和抽象(abstract)类;排序的依据是排在前面的类在构造方法中不会引用排在后面的类;由于类之间引用关系的复杂性,如类
Figure 2012102192859100002DEST_PATH_IMAGE072
的某个构造方法中引用了类
Figure 2012102192859100002DEST_PATH_IMAGE074
对象做参数,而类
Figure 113894DEST_PATH_IMAGE074
的某个构造方法又引用了类
Figure 24082DEST_PATH_IMAGE072
对象;上述排序允许忽略一些引用关系。然后对每一个公有类,处理其中每一个公有的构造方法:为构造方法的每一个参数按照其类型设置级别;再根据参数级别的两两组合,为每一个参数级别组合构造调用链。所构造的调用链
Figure 949312DEST_PATH_IMAGE024
以该构造方法的调用(new操作符+对应类名和参数列表)为结尾,表示创建了该类的一个对象(实例)
Figure 235937DEST_PATH_IMAGE026
,对应的二元组
Figure 563013DEST_PATH_IMAGE022
可能添加入类对象库中。
不难发现,构造方法中若某个参数本身是对象类型,则该参数所设置的级别需要实例化时,需要在类对象库中查询对应的调用链
Figure 2012102192859100002DEST_PATH_IMAGE076
,嵌入到新生成的
Figure 909681DEST_PATH_IMAGE024
之中,这相当于调用链扩展或串接。对于复杂的有多个对象类型参数的构造方法(对象方法),常需要串接多个调用链,形成复杂的测试用例。未避免不必要的串接,需要利用Java虚拟机设施确认准备加入类对象库的
Figure 322208DEST_PATH_IMAGE024
运行正确,确认
Figure 146944DEST_PATH_IMAGE024
运行正确基于以下4个判定:
判定1. 运行过程中没有抛出异常;
判定2. 对象不能为空,即“assertNotNull(Obj)”;
判定3. 对象等于自身,即“assertTrue(Obj.equals(Obj))”;
判定4. 对象的散列值等于自身的散列值,即“assertTrue(Obj.hashcode()==Obj.hashcode())”。
上述4个判定构成测试断言。最后运行不正确的
Figure 387914DEST_PATH_IMAGE024
代表可能发现了程序中的缺陷或问题,因此将存在错误的
Figure 905483DEST_PATH_IMAGE024
添加入调用链库。
步骤五是以目标方法覆盖为目的生成调用链,同时维护调用链库;过程如图8所示。目标方法满足步骤三中所述的4个基本条件,可以是一个静态(static)方法,也可以是一个非静态方法;非静态方法需要在实例化的对象中运行,而静态方法直接在类中运行。考虑目标方法覆盖需要关注三个层面:运行主体、参数列表、属性依赖,下面分别予以说明。
(1)运行主体,指运行目标方法的类(static)或对象。如果是静态(static)方法,不考虑运行主体;如果是非静态方法,则运行主体是实例化的对象,分以下两种情况处理:
情况1. 普通类,同处理对象类型参数时的情况1类似,根据该类所拥有的公有构造方法数量划分级别(Level),不考虑Null,级别数量等同于公有构造方法的数量;
情况2. 抽象(abstract)类,同处理对象类型参数的情况3类似,根据继承(extends)该抽象类的普通类数量划分级别,不考虑Null,级别数量等同于继承该类的普通类数量。
(2)参数列表,参数列表的处理与步骤四中公有构造方法的参数列表处理方式相同,生成所有参数级别的两两组合。
(3)属性依赖,考虑目标方法所读取的所有属性变量,即读属性集合
Figure 805306DEST_PATH_IMAGE032
;按中属性变量的个数设置级别;例如某个目标方法读取了3个属性变量,则设置3个级别,每一个级别对应任一个写入相应属性变量的目标方法(其写属性集合中包含该属性变量)。
确定所有层面的级别设置后,再按照两两组合生成所有的层面级别组合。假设目标方法“SomeClass.func(…)”是一个非静态方法:运行主体层面,类“SomeClass”有2个公有的构造方法,设置2个级别;参数列表层面,令“func(…)”有3个参数,级别设置与表1相同,于是共有6个参数级别组合;属性依赖层面,令“func(…)”的读属性集合
Figure 158293DEST_PATH_IMAGE032
包含3个属性变量,设置3个级别。按两两组合要求,共需要18个层面级别组合,如表2所示:
表2
No 运行主体(A) 参数列表(B) 属性依赖(C)
1 A1 B1 C1
2 A2 B2 C2
3 A1 B3 C3
4 A2 B4 C1
5 A1 B5 C2
6 A2 B6 C3
7 A2 B1 C2
8 A1 B2 C1
9 A1 B4 C3
10 A2 B3 C1
11 A2 B5 C3
12 A1 B6 C2
13 A1 B1 C3
14 A1 B3 C2
15 A1 B5 C1
16 A1 B2 C3
17 A1 B4 C2
18 A1 B6 C1
对每一个层面级别组合生成一个调用链,所构造的调用链以该目标方法的调用为结尾。与步骤四中情况类似,其中涉及调用链的串接:在运行主体层面,对象实例化本身对应一个调用链;在参数列表层面,每一个对象类型参数可能对应一个调用链;在属性依赖层面,所依赖的每一个目标方法对应一个调用链。
如果该目标方法返回一个类对象库中不存在的类的对象,有两种情况:一是该类不是公有(public)类;二是该类没有定义公有的构造方法。则利用Java虚拟机设施按步骤四中所述方法确认运行是否正确,如果运行正确,将二元组
Figure 868126DEST_PATH_IMAGE022
添加入类对象库中。
如图8所示,首先按照属性依赖图对目标覆盖集中的目标方法排序,排序的依据是排在前面的目标方法尽量在属性操作上不依赖于排在后面的目标方法;由于对象方法在属性操作上复杂性,上述排序允许忽略部分属性依赖关系。然后对每一个目标方法,从运行主体、参数列表、以及属性依赖层面分别设置级别,再按照层面级别的两两组合,为每一个层面级别组合构造调用链;所构造的调用链以该目标方法的调用为结尾,可能涉及多个调用链的串接。
Figure 509826DEST_PATH_IMAGE024
添加入调用链库中。最后如果该目标方法返回了类对象库中不存在的类的对象,则确认
Figure 520507DEST_PATH_IMAGE024
运行正确后,将二元组添加入类对象库中。
上述处理过程中需要在类对象库中和调用链库中查询层面级别设置所对应的调用链,如果不存在指定的(对象实例化或者是目标方法覆盖)调用链,则忽略相应的级别组合。
步骤六是基于调用链库生成Java程序的测试用例集;过程如图9所示。测试用例按照JUnit框架组织,以Java程序中的类为单位创建“TestCase”类,用以组织调用链。首先获取调用链库,对库中的每一个调用链,按所覆盖的构造方法或目标方法
Figure 646912DEST_PATH_IMAGE020
创建一个“Test”方法,其中按步骤四所述加入测试断言;然后按照
Figure 92937DEST_PATH_IMAGE020
所从属的类,将“Test”方法添加入对应的“TestCase”类中;最后将所有非空的“TestCase”类添加入“TestSuite”类中,作为最终生成的Java程序的测试用例集。
本发明方法引入了组合测试技术,充分考虑对象方法间因属性变量操作而导致的依赖关系,有效利用Java程序的反射机制和虚拟机设施,系统化生成和维护调用链,自动生成测试断言,高效率生成测试用例集。我们基于四个不同规模和类型的Java软件程序应用本发明方法生成测试用例,并同Randoop等测试用例生成方法相比较;实验数据表明,同现有面向Java的随机测试方法相比,为达到相同的代码覆盖率,本发明方法需要更少的测试用例数量;而在同样的测试用例生成时间内,本发明方法能够生成更多的测试用例;最后,组合测试技术的引入为本发明方法提供了测试用例生成过程何时终止的合理判定,使得测试用例生成过程更具有系统性。运用本发明方法,在测试用例生成过程中完全不需要人工干预,缓解和部分解决现有随机测试方法存在的无效和冗余测试用例过多、代码覆盖率过低等问题;具有良好的适用性和扩展性。

Claims (10)

1.一种面向Java程序的随机测试用例生成方法,其特征在于包括以下步骤:
1)解析Java程序的类定义,获取对象方法列表;利用Java语言提供的反射机制,首先从指定目录读取所有的.class文件和.jar文件;再进一步从.jar文件中析取.class文件,获得Java程序中所有可能包含的类的定义;基于每一个类,根据.class文件读取其中的属性变量和对象方法的定义体;最后输出Java程序的对象方法列表;
2)建立对象方法间的依赖关系图,包括方法调用图和属性依赖图,其中构建方法调用图的过程是:基于对象方法的定义体,发掘对象方法之间是否存在调用与被调用,再构建出方法调用图;
3)确定待覆盖的目标方法                                               
Figure 2012102192859100001DEST_PATH_IMAGE002
的列表,组成目标覆盖集
Figure 2012102192859100001DEST_PATH_IMAGE004
4)以公有类的实例化为目的生成调用链,维护类对象库;
5)以目标方法覆盖为目的生成调用链,维护调用链库;
6)基于调用链库生成Java程序的测试用例集。
2.根据权利要求1所述的面向Java程序的随机测试用例生成方法,其特征在于,上述步骤2)中构建属性依赖图的过程是:首先将对象方法作为属性依赖图的节点;根据每个对象方法的定义体,通过分析其中每一条语句,确定该对象方法的读属性集合和写属性集合;然后对于任意两个对象方法
Figure 2012102192859100001DEST_PATH_IMAGE006
,即节点对,如果
Figure 946230DEST_PATH_IMAGE006
的读属性集合
Figure 2012102192859100001DEST_PATH_IMAGE010
Figure 150946DEST_PATH_IMAGE008
的写属性集合
Figure 2012102192859100001DEST_PATH_IMAGE012
之间的交集不为空集,则添加有向边
Figure 2012102192859100001DEST_PATH_IMAGE014
;从另一角度,如果
Figure 2012102192859100001DEST_PATH_IMAGE016
Figure 2012102192859100001DEST_PATH_IMAGE018
之间的交集不为空集,则添加有向边
Figure 2012102192859100001DEST_PATH_IMAGE020
;最后处理完所有对象方法的节点对后,输出属性依赖图。
3.根据权利要求1或2所述的面向Java程序的随机测试用例生成方法,其特征在于,上述步骤3)的过程为:确定待覆盖的目标方法
Figure 222283DEST_PATH_IMAGE002
必须满足4个基本条件:
条件1. 在方法调用图中是顶层节点,即没有其他对象方法调用
Figure 891162DEST_PATH_IMAGE002
;或者只有“main”方法调用了
条件2. 
Figure 576538DEST_PATH_IMAGE002
不能是构造方法,构造方法与类同名;
条件3. 
Figure 579129DEST_PATH_IMAGE002
必须是公有方法,即
Figure 40197DEST_PATH_IMAGE002
由访问修饰符“public”定义;
条件4. 
Figure 204462DEST_PATH_IMAGE002
必须是实体方法,即
Figure 383771DEST_PATH_IMAGE002
必须有定义体,不能由抽象修饰符“abstract”定义、或者在接口“Interface”类中定义;
从Java程序对象方法列表中,筛选满足上述4个条件的对象方法组成目标覆盖集TC
4.根据权利要求1或2所述的面向Java程序的随机测试用例生成方法,其特征在于,上述步骤4)中以公有类的实例化为目的生成调用链是指以公有“public”构造方法为覆盖目标生成调用链;用二元组
Figure 2012102192859100001DEST_PATH_IMAGE022
表示,其中
Figure 2012102192859100001DEST_PATH_IMAGE024
代表一个调用链,结尾以“New”操作符调用该构造方法,可能涉及多个调用链的串接;
Figure 2012102192859100001DEST_PATH_IMAGE026
代表所创建的对象;
Figure 862157DEST_PATH_IMAGE026
对应的类不能是不可以实例化的抽象“abstract”类或者接口“interface”类;利用Java虚拟机设施运行
Figure 177732DEST_PATH_IMAGE024
,通过测试断言判定其运行是否正确;如果正确,则将二元组
Figure 778477DEST_PATH_IMAGE022
添加入类对象库;否则将
Figure 179503DEST_PATH_IMAGE024
添加入调用链库。
5.根据权利要求4所述的面向Java程序的随机测试用例生成方法,其特征在于,以公有构造方法为覆盖目标生成调用链的过程是:首先对Java程序中包含的公有类排序,排除其中的接口类和抽象类;排序的依据是排在前面的类在构造方法中尽量不会引用排在后面的类;然后按顺序对每一个公有类,处理其中每一个公有的构造方法:为构造方法的每一个参数按照参数类型设置级别;再根据参数级别的两两组合,为每一个参数级别组合构造调用链
Figure 523896DEST_PATH_IMAGE024
;其中两两组合是指对任意两个参数,其级别的所有可能组合至少出现一次。
6.根据权利要求4所述的面向Java程序的随机测试用例生成方法,其特征在于,判定调用链运行是否正确的测试断言基于以下4个判定组成:
判定1. 运行过程中没有抛出异常;
判定2. 对象不能为空,即“assertNotNull(Obj)”;
判定3. 对象等于自身,即“assertTrue(Obj.equals(Obj))”;
判定4. 对象的散列值等于自身的散列值,即“assertTrue(Obj.hashcode()==Obj.hashcode())”。
7.根据权利要求5所述的面向Java程序的随机测试用例生成方法,其特征在于,上述步骤中按照参数类型设置级别时分以下4种场景:
场景1. 基本数据类型参数,分以下4种情况进行处理:
情况1. 整数类型,包括长整型、短整型和字符型,分为4个级别:0、任一个正整数、任一个负整数、最大值;
情况2. 浮点类型,包括单精度和双精度,分为4个级别:0、任一个正浮点数、任一个负浮点数、最大值;
情况3. 布尔类型,分为2个级别:true、false;
情况4. 枚举类型,分为1个级别:任一个枚举值;
场景2. 字符串类型,即String类,分为4个级别:null、空串、任意长度普通串、任意长度包含特殊字符的串;
场景3. 对象类型,分3种情况处理:
情况1. 普通类,即可以实例化的类;此时根据类所拥有的公有构造方法数量来决定参数的级别数量:若参数
Figure 400378DEST_PATH_IMAGE028
有1个以上的公有构造方法,则
Figure 351017DEST_PATH_IMAGE028
的级别为:null、分别与不同构造方法对应的级别;若
Figure 233522DEST_PATH_IMAGE028
没有公有构造方法,则为2个级别:null、任一个可以返回该类对象的调用链;
情况2. 接口“Interface”类;此时根据实现“Implement”该接口的普通类数量来决定参数的级别数量;每个级别分别对应一个普通类,在具体取参数值时,按情况1随机选择相应普通类的一个级别赋值;
情况3. 抽象“abstract”类;此时根据继承“extends”该抽象类的普通类数量来决定参数的级别数量;每个级别分别对应一个普通类,在具体取参数值时,按情况1随机选择相应普通类的一个级别赋值;
在上述情况2和情况3中,如果实现或继承的类是抽象类,则进一步按情况3确定继承该抽象类的普通类,数量累计入参数的级别数量;
场景4. 数组类型,按照数组的长度划分级别,分为3个级别:0、1、任一个正整数;对于每一个数组元素,再按照其所属的类型随机选择一个级别来赋值。
8.根据权利要求1或2所述的面向Java程序的随机测试用例生成方法,其特征在于,上述步骤5)中以目标方法覆盖为目的生成调用链的过程是:首先按照属性依赖图对目标覆盖集
Figure 523689DEST_PATH_IMAGE004
中的目标方法排序,排序的依据是排在前面的目标方法尽量在属性操作上不依赖于排在后面的目标方法;然后顺序对每一个目标方法,从运行主体、参数列表、以及属性依赖三个层面分别设置级别,再按照层面级别的两两组合,为每一个层面级别组合构造调用链;所构造的调用链
Figure 466237DEST_PATH_IMAGE024
以该目标方法的调用为结尾,可能涉及多个调用链的串接;添加入调用链库中;如果该目标方法返回了类对象库中不存在的类的对象,则应用测试断言判定
Figure 528051DEST_PATH_IMAGE024
运行正确后,将二元组
Figure 735042DEST_PATH_IMAGE022
添加入类对象库中。
9.根据权利要求8所述的面向Java程序的随机测试用例生成方法,其特征在于,上述步骤中从运行主体、参数列表、以及属性依赖三个层面分别设置级别,其中:
(1)运行主体,指运行目标方法的类或对象;
如果是静态“static”方法,不考虑运行主体;如果是非静态方法,则运行主体是实例化的对象,分以下两种情况处理:
情况1. 普通类,同处理对象类型参数时的情况1类似,根据该类所拥有的公有构造方法数量划分级别,不考虑Null,级别数量等同于公有构造方法的数量;
情况2. 抽象类,同处理对象类型参数的情况3类似,根据继承该抽象类的普通类数量划分级别,不考虑Null,级别数量等同于继承该类的普通类数量;
(2)参数列表,参数列表的处理与步骤4)中构造方法的参数列表处理方式相同:按照参数类型设置级别,生成所有参数级别的两两组合;
(3)属性依赖,考虑目标方法所读取的所有属性变量,即读属性集合
Figure 2012102192859100001DEST_PATH_IMAGE032
;按
Figure 786174DEST_PATH_IMAGE032
中属性变量的个数设置级别;每一个级别对应任一个写入相应属性变量的目标方法,其写属性集合
Figure 2012102192859100001DEST_PATH_IMAGE034
中包含该属性变量。
10.根据权利要求1或2所述的面向Java程序的随机测试用例生成方法,其特征在于,上述步骤6)中遵循JUnit框架基于调用链库生成Java程序测试用例集的过程是:首先以Java程序中的类为单位创建“TestCase”类,用以组织调用链;对调用链库中的每一个调用链,按所覆盖的构造方法或目标方法
Figure 649088DEST_PATH_IMAGE002
创建一个“Test”方法,其中按步骤4)所述加入测试断言;然后按照
Figure 811079DEST_PATH_IMAGE002
所从属的类,将“Test”方法添加入对应的“TestCase”类中;最后将所有非空的“TestCase”类添加入“TestSuite”类中,作为最终生成的Java程序的测试用例集。
CN201210219285.9A 2012-06-29 2012-06-29 一种面向Java程序的随机测试用例生成方法 Expired - Fee Related CN102736980B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210219285.9A CN102736980B (zh) 2012-06-29 2012-06-29 一种面向Java程序的随机测试用例生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210219285.9A CN102736980B (zh) 2012-06-29 2012-06-29 一种面向Java程序的随机测试用例生成方法

Publications (2)

Publication Number Publication Date
CN102736980A true CN102736980A (zh) 2012-10-17
CN102736980B CN102736980B (zh) 2014-10-22

Family

ID=46992521

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210219285.9A Expired - Fee Related CN102736980B (zh) 2012-06-29 2012-06-29 一种面向Java程序的随机测试用例生成方法

Country Status (1)

Country Link
CN (1) CN102736980B (zh)

Cited By (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103309805A (zh) * 2013-04-24 2013-09-18 南京大学镇江高新技术研究院 xUnit框架下面向对象软件中测试目标的自动化选择方法
CN104375932A (zh) * 2014-08-27 2015-02-25 北京中电华大电子设计有限责任公司 一种Java卡代码覆盖率分析方法和装置
CN104461560A (zh) * 2014-12-23 2015-03-25 北京京东尚科信息技术有限公司 一种信息类实例的转换方法
CN105068789A (zh) * 2015-07-10 2015-11-18 武汉工程大学 一种对象使用场景提取方法及装置
CN105138569A (zh) * 2015-07-24 2015-12-09 李遵白 一种气泡数据的生成、使用方法及地理吐槽信息系统
CN105335407A (zh) * 2014-07-29 2016-02-17 阿里巴巴集团控股有限公司 一种数据自动化测试方法及装置
CN106021094A (zh) * 2016-04-29 2016-10-12 南京慕测信息科技有限公司 一种基于程序静态分析的Java单元测试教学反馈方法
CN106294127A (zh) * 2016-07-25 2017-01-04 江苏大学 基于聚类的面向对象软件测试用例生成方法
CN106528179A (zh) * 2016-12-08 2017-03-22 中国科学院软件研究所 一种Java类依赖关系的静态识别方法
CN106971003A (zh) * 2017-04-25 2017-07-21 物载天下网络科技(苏州)有限公司 一种地图气泡数据的系统、生成和使用方法
CN107038119A (zh) * 2017-03-31 2017-08-11 上海东软载波微电子有限公司 测试用例自动生成方法及装置
CN107608873A (zh) * 2016-07-11 2018-01-19 珠海优特电力科技股份有限公司 软件测试方法和系统及测试平台
CN104978182B (zh) * 2014-10-15 2018-05-22 武汉安天信息技术有限责任公司 一种将JAR文件解析成java的方法及系统
CN110007920A (zh) * 2018-01-04 2019-07-12 阿里巴巴集团控股有限公司 一种获取代码依赖关系的方法、装置及电子设备
CN111026665A (zh) * 2019-12-09 2020-04-17 中国建设银行股份有限公司 测试范围分析方法、装置及设备
CN111752841A (zh) * 2020-06-28 2020-10-09 深圳前海微众银行股份有限公司 单测模拟方法、装置、设备与计算机可读存储介质
CN112035335A (zh) * 2019-06-03 2020-12-04 北京字节跳动网络技术有限公司 自动化测试的方法、装置、设备、介质
CN113419964A (zh) * 2021-07-14 2021-09-21 上海浦东发展银行股份有限公司 一种测试案例生成方法、装置、计算机设备及存储介质

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5754760A (en) * 1996-05-30 1998-05-19 Integrity Qa Software, Inc. Automatic software testing tool

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5754760A (en) * 1996-05-30 1998-05-19 Integrity Qa Software, Inc. Automatic software testing tool

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
CHEN M,ET AL.: "《UML activity diagram-based automatic test case generation for Java programs》", 《THE COMPUTER JOURNAL》, vol. 52, no. 5, 31 December 2009 (2009-12-31), pages 545 - 556 *
何涛: "《基于UML的面向对象的类测试研究》", 《万方数据库》, 28 February 2005 (2005-02-28), pages 31 - 36 *

Cited By (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103309805A (zh) * 2013-04-24 2013-09-18 南京大学镇江高新技术研究院 xUnit框架下面向对象软件中测试目标的自动化选择方法
CN103309805B (zh) * 2013-04-24 2015-09-16 南京大学镇江高新技术研究院 xUnit框架下面向对象软件中测试目标的自动化选择方法
CN105335407A (zh) * 2014-07-29 2016-02-17 阿里巴巴集团控股有限公司 一种数据自动化测试方法及装置
CN104375932B (zh) * 2014-08-27 2017-04-19 北京中电华大电子设计有限责任公司 一种Java卡代码覆盖率分析方法和装置
CN104375932A (zh) * 2014-08-27 2015-02-25 北京中电华大电子设计有限责任公司 一种Java卡代码覆盖率分析方法和装置
CN104978182B (zh) * 2014-10-15 2018-05-22 武汉安天信息技术有限责任公司 一种将JAR文件解析成java的方法及系统
CN104461560A (zh) * 2014-12-23 2015-03-25 北京京东尚科信息技术有限公司 一种信息类实例的转换方法
CN104461560B (zh) * 2014-12-23 2018-06-15 北京京东尚科信息技术有限公司 一种信息类实例的转换方法
CN105068789A (zh) * 2015-07-10 2015-11-18 武汉工程大学 一种对象使用场景提取方法及装置
CN105068789B (zh) * 2015-07-10 2018-08-24 武汉工程大学 一种对象使用场景提取方法及装置
CN105138569A (zh) * 2015-07-24 2015-12-09 李遵白 一种气泡数据的生成、使用方法及地理吐槽信息系统
CN106021094A (zh) * 2016-04-29 2016-10-12 南京慕测信息科技有限公司 一种基于程序静态分析的Java单元测试教学反馈方法
CN107608873A (zh) * 2016-07-11 2018-01-19 珠海优特电力科技股份有限公司 软件测试方法和系统及测试平台
CN106294127A (zh) * 2016-07-25 2017-01-04 江苏大学 基于聚类的面向对象软件测试用例生成方法
CN106294127B (zh) * 2016-07-25 2019-01-08 江苏大学 基于聚类的面向对象软件测试用例生成方法
CN106528179B (zh) * 2016-12-08 2019-06-21 中国科学院软件研究所 一种Java类依赖关系的静态识别方法
CN106528179A (zh) * 2016-12-08 2017-03-22 中国科学院软件研究所 一种Java类依赖关系的静态识别方法
CN107038119A (zh) * 2017-03-31 2017-08-11 上海东软载波微电子有限公司 测试用例自动生成方法及装置
CN107038119B (zh) * 2017-03-31 2019-12-03 上海东软载波微电子有限公司 测试用例自动生成方法及装置
CN106971003A (zh) * 2017-04-25 2017-07-21 物载天下网络科技(苏州)有限公司 一种地图气泡数据的系统、生成和使用方法
CN110007920A (zh) * 2018-01-04 2019-07-12 阿里巴巴集团控股有限公司 一种获取代码依赖关系的方法、装置及电子设备
CN110007920B (zh) * 2018-01-04 2022-07-29 阿里巴巴集团控股有限公司 一种获取代码依赖关系的方法、装置及电子设备
CN112035335A (zh) * 2019-06-03 2020-12-04 北京字节跳动网络技术有限公司 自动化测试的方法、装置、设备、介质
CN111026665A (zh) * 2019-12-09 2020-04-17 中国建设银行股份有限公司 测试范围分析方法、装置及设备
CN111752841A (zh) * 2020-06-28 2020-10-09 深圳前海微众银行股份有限公司 单测模拟方法、装置、设备与计算机可读存储介质
CN113419964A (zh) * 2021-07-14 2021-09-21 上海浦东发展银行股份有限公司 一种测试案例生成方法、装置、计算机设备及存储介质

Also Published As

Publication number Publication date
CN102736980B (zh) 2014-10-22

Similar Documents

Publication Publication Date Title
CN102736980B (zh) 一种面向Java程序的随机测试用例生成方法
Meynard et al. Disentangling the drivers of metacommunity structure across spatial scales
US8364909B2 (en) Determining a conflict in accessing shared resources using a reduced number of cycles
CN102254029B (zh) 一种基于视图的数据访问系统及其方法
CN101617292A (zh) 面向生成器图形的编程和执行
CN101601012A (zh) 具有场景支持的面向生成器图形的编程框架
KR101201019B1 (ko) 보고서 프로세싱 방법, 보고서 프로세싱 시스템 및 이를 수행하는 컴퓨터 판독가능 기록 매체
US8527452B2 (en) Construction of rules for use in a complex event processing system
CN103778239B (zh) 一种多数据库数据管理方法及系统
CN103718159B (zh) 图像处理软件开发方法、图像处理软件开发装置
CN113434497A (zh) 一种由数据仓库与数据元件仓库组成的数据要素金库
Gunaratne et al. Alternate social theory discovery using genetic programming: towards better understanding the artificial anasazi
US9311111B2 (en) Programming environment with support for handle and non-handle user-created classes
CN106250134A (zh) 单一性语言的代码自动生成方法
CN109997123A (zh) 用于改进空间-时间数据管理的方法、系统和装置
Torre On collecting and validating UML consistency rules: a research proposal
Mourshed et al. Integrating building energy simulation in the design process
CN115543428A (zh) 一种基于策略模板的模拟数据生成方法和装置
CN110083339A (zh) 一种新型计算机编程语言
CN105677968B (zh) 可编程逻辑器件电路图绘制方法及装置
CN112632930A (zh) 表格数据控制方法及装置
Willenborg Simulation of explosions in urban space and result analysis based on CityGML City models and a cloud based 3D Web client
Wilson et al. Identifying key socioecological factors influencing the expression of egalitarianism and inequality among foragers
CN110956032A (zh) 模型与模型的对量方法、装置、存储介质、电子设备
US7483760B2 (en) Mechanism for execution of global flow changes in a manufacturing system

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20141022

Termination date: 20200629