具体实施方式
在下文中,仅以数据库作为各种数据源的示例,文中的“数据库”并不限制多种数据源的类型,而是仅为举例目的。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
在本发明的实施方式中,基于用户输入来建立逻辑对象,并且自动地建立逻辑对象与待测应用的应用编程接口之间的关联,从而自动地向该应用的数据库中批量注入数据在下文中,将参考图1至图3详细描述根据本发明的实施方式的方法和设备。
图1示意性示出了根据本发明的一个实施方式的向应用的数据库注入数据的方法的流程图100。如图1所示,流程100在步骤S102将应用的应用编程接口(API)导入到目标系统中。将应用编程接口导入目标系统,从而可以分析得出与向数据库中输入数据相关的API,进而可以分析各API之间的调用关系以及参数对象之间的关系。
如本领域技术人员所已知,应用通常采用API来与外部实现数据交互,例如对数据库、数据文件进行读写数据,或者实现与其他应用之间的数据交互。应用的最终用户通常对于该应用的API并不具有深入的了解,他/她们仅需理解如何使用基于API实现的该应用的上层功能即可,而并不需要了解纷繁复杂的API之间的调用关系、各个API的参数以及每个API实现的功能。通过查阅用户手册或者其他帮助文件,用户可以获取应用中各API的信息,包括API的名称、调用参数、返回参数、该API的注释以及各API之间的调用关系等等。
然后,流程100在步骤S104,基于用户输入来建立逻辑对象。应当理解,由于不要求用户熟知应用的API的细节,所以本发明的一个实施方式在用户的有限认知与应用的复杂API之间建立“逻辑对象”以作为桥梁。逻辑对象是能够完整地描述应用中的使用场景中的一个实体,在本发明的一个实施方式中,将用户定义的逻辑对象关联到应用的API,此时这个API即为向数据库中插入该逻辑对象所代表的数据的入口。
用户可以以多种方式定义逻辑对象,例如用户可以指定需要访问的数据库中的表的名称、或者指定API的操作对象的名称、或者还可以通过搜索API的注释而向用户提供可选择的API列表等。
之后,在步骤S106中,在逻辑对象与应用的API之间建立关联。根据本发明的一个实施方式,逻辑对象可以具有多种属性,并且已知的是,应用的API可以具有多个参数对象(其中包括简单参数对象和复杂参数对象)。建立所述关联的目的在于,可以在所述逻辑对象的属性与所述应用编程接口的简单参数对象之间建立映射;以及在所述应用编程接口的复杂参数对象与其他逻辑对象之间建立映射,也即通过间接方式在逻辑对象与API的简单参数对象之间建立映射。
接着,在步骤S108中,形成数据注入规则。应当理解,数据注入规则是在向应用的数据库中注入数据时所采用的约束关系。即,在注入数据过程中,可以对原有数据文件中的数据进行过滤,或者利用随机方式来生成满足该约束关系的数据。注入规则可以包括各种形式,例如:至少一个所述逻辑对象的属性的取值范围、被注入数据的数量、生成被注入数据时使用的随机值生成器、被注入数据中的至少一个值的类型以及被注入数据中的至少一个值的出现频度,等等。
接着,在步骤S110中,基于所述关联和所述数据注入规则,向所述应用的所述数据库注入数据。后文将举例说明注入数据的多种可行方式。
图2示意性示出了根据本发明的又一个实施方式的向应用的数据库注入数据的方法的流程图200。如图2所示,流程200在步骤S202将应用的API包导入目标系统。对于不同应用,API包可以具有不同的形式。在根据本发明一个实施方式的方法中,可以分析应用的配置文件或程序设置文件,例如针对JAVA应用而言,可以从该应用的JNI.jar文件中导入该应用的API。
应当注意,根据本发明的一个实施方式,在被导入的API包中不必对API的功能进行区分。通常不能仅通过导入API包中的各API而得知其中哪些API的功能涉及向应用的数据库中注入数据。要判断哪些API与向数据库中注入数据有关,需要在导入全部API之后分析各API的功能并进行过滤。
在步骤S202之前、之中、之后或与之并行,流程200在步骤S204中过滤掉与向应用的数据库注入数据无关的API。应当注意,与向应用的数据库注入数据相关包括直接相关和间接相关两种情况。本领域技术人员应当理解,由于API中可以存在复杂的调用关系,即使某API如API 1本身没有直接向应用的数据库中注入数据,并不意味着该API 1与注入数据无关而可以立刻将其过滤掉。而是,API 1可能与向数据库注入数据间接相关,例如,当某API如API 1的返回参数是作为直接注入数据的API 2的参数对象时即为间接相关。例如,两个API分别示例如下:
API_1(var1,var2);
API_2(var3);
其中API_2与数据注入直接相关,并且此时参数var3必须经过调用API_1(var1,var2)才能实现,即在调用API_2时出现了这样的情况:API_2(API_1(var1,var2))。即,在调用API_2的过程中,嵌套调用了API_1。由此API_1也是与数据注入相关联的API,其中API_1是间接相关,而API_2是直接相关。
在下文中,将以具体示例的方式示出将应用编程接口包导入目标系统的过程。应该注意,在本说明书通篇使用了以软件研发行业通常使用的变更管理应用的示例,来描述根据本发明的实施方式的方法的整体操作流程。其中该变更管理应用提供了与需求管理、质量管理、版本控制等相关的API,并提供资产登记、状态变化、流程监控等变更功能。
例如,选择该应用提供的API包,如JAVA应用的JNI.jar,导入该API包后可以得到所有API列表,如表1所示,其中仅示意性示出了部分API:
表1 应用的API列表
序号 |
API定义 |
1 |
…… |
2 |
Attachment AddAttachment(str,str,UserSession) |
3 |
Email(……) |
4 |
UserSession Logon(str,str,Database) |
5 |
Database DBConnect(str,str,str,str) |
6 |
NewResource(str,str,int) |
7 |
Chart(……) |
8 |
CPUCount(……) |
9 |
Boolean NewRecord(str,str,Resource,Date,Attachment,UserSession) |
10 |
Query(……) |
11 |
…… |
应当注意,上文表1中仅示意性示出了各API的定义。例如,应用编程接口Database DBConnect(str,str,str,str)表示,该API的名称为DBConnect,返回对象的类型为Database,并且该API调用的参数对象是4个字符串型(“str”)的简单参数对象。
在过滤无关API的同时,可以记录与数据注入有关的API以及它们之间的制约关系。为方便下文描述起见,首先对作为API的参数对象进行分类:
1)简单对象是指编程环境中直接提供的数据类型的对象,例如当前各种编程语言所提供的整型、浮点型、布尔型、字符串型、日期类型等等类型的对象。应当注意,对于在不同编程环境中开发的应用,其简单对象的种类可以不同。
2)复杂对象是指不是由编程环境中直接提供的类型的对象,而是由开发人员自己定义的数据结构,例如可以是面向对象编程设计中的类或者结构,还可以具有其他类型的表现形式。复杂对象可以由其他API来返回。为方便描述起见,根据参数对象的复杂性,将调用API时的参数的对象分别称为简单参数对象和复杂参数对象;而将作为API的返回结果的对象分别称为简单返回对象和复杂返回对象。
根据本发明的一个实施方式,通过上文中关于直接相关和间接相关的分析可知,可以以两个步骤实现过滤操作。首先,找到直接向应用的数据库中注入数据的API,即直接相关的API;继而,检查在第一步中找到的API的参数对象的复杂性,并且找到以复杂参数对象为返回对象的全部API,即间接相关的API。
现在返回图2中的步骤S206,在该步骤中,基于用户输入来建立逻辑对象。应当理解,由于不要求用户熟知应用的API的细节,所以本发明的一个实施方式在用户的有限认知与应用的复杂API之间建立“逻辑对象”以作为桥梁。逻辑对象是能够完整地描述应用中的使用场景中的一个实体,在本发明的一个实施方式中,将用户定义的逻辑对象关联到应用的API,此时这个API即为向数据库中插入该逻辑对象所代表的数据的入口。
用户可以以多种方式定义逻辑对象,例如用户可以指定需要访问的数据库中的表的名称、或者指定API的操作对象的名称、或者还可以通过搜索API的注释而向用户提供可选择的API列表等。
之后,在步骤S208中,在逻辑对象与应用的API之间建立关联。根据本发明的一个实施方式,逻辑对象可以具有多种属性,并且已知的是,应用的API可以具有多个参数对象(其中包括简单参数对象和复杂参数对象)。建立所述关联的目的在于,可以在所述逻辑对象的属性与所述应用编程接口的简单参数对象之间建立映射;以及在所述应用编程接口的复杂参数对象与其他逻辑对象之间建立映射,也即通过间接方式在逻辑对象与API的简单参数对象之间建立映射。
接着,在步骤S210中,形成数据注入规则。应当理解,数据注入规则是在向应用的数据库中注入数据时所采用的约束关系。即,在注入数据过程中,可以对原有数据文件中的数据进行过滤,或者利用随机方式来生成满足该约束关系的数据。注入规则可以包括各种形式,例如:至少一个所述逻辑对象的属性的取值范围、被注入数据的数量、生成被注入数据时使用的随机值生成器、被注入数据中的至少一个值的类型以及被注入数据中的至少一个值的出现频度,等等。
接着,在步骤S212中,基于所述关联和所述数据注入规则,向所述应用的所述数据库注入数据。后文将举例说明注入数据的多种可行方式。
现在参考图3,其中示意性示出了根据本发明的一个实施方式的向应用的数据库注入数据的设备300的结构框图。根据本发明一个实施方式的设备300可以包括逻辑对象接口机构310、元数据操作机构320、应用编程接口集成机构330以及元数据XML存储器340。
通过使用应用编程接口集成机构330来导入应用的API,用户并不需要了解应用API的详细信息,也不必了解待注入数据的数据库的设计方式、存储结构,即可向其中注入数据,亦不需额外的开发和维护的工作。逻辑对象接口机构310支持用户建立自己可理解的逻辑对象,并帮助用户在与该逻辑对象相关的应用API之间建立关联。逻辑对象接口机构310还支持用户制定数据注入规则,并控制向数据库注入数据或者清空先前装载的数据。元数据操作机构320管理相关的逻辑对象之间的关系、逻辑对象与应用API之间的关系、应用API之间的关系以及数据注入规则等,并将上述内容以元数据的方式存储在元数据XML存储器340中。应当注意,本发明的一个实施方式中采用XML的形式来存储元数据,本领域技术人员应理解还可以使用其他的存储形式来存储上述内容。
在图3的虚线框部分中示出了多个应用(应用1至应用N)和相对应的数据库(应用1数据库至应用N数据库)。图3所示应用的一个例子是可从国际商业机器公司购得的ClearQuest。图3所示应用的另一个例子是同样可从国际商业机器公司购得的ClearCase。一个目标系统中可以包括也可以不包括图3中所示的一个或多个应用。在一个实施方式中,将目标系统中不包括的一个应用集成到该目标系统中以测试该应用的性能。为此,利用图3所示的设备来向该待集成的应用的对应的数据库中注入数据。因此,可以使用本发明的设备来将一个新的应用集成到目标系统中。在一个实施方式中,在完成数据注入之后,也可以去除所集成的应用。注意,此时已经向该应用相应的数据库中注入了所需数据,因此,去除该应用并不会对已注入数据的数据库的内容造成不利影响。
在图3中,应用编程接口集成机构330从被集成的应用中导入API包,并且过滤掉与数据注入无关的API。该应用编程接口集成机构330同待集成的应用直接进行交互,其功能包括:导入应用的API包,初始化应用API的调用环境,调用应用API向应用数据库中注入数据,清除数据等。过滤后得到的API或者是与数据注入直接相关的API,或者是与该直接相关的API的复杂参数对象相关的API。在该应用编程接口集成机构330进行处理之后,可以将过滤后得到的API、API的参数对象、API之间的关系以及涉及到的应用数据库表的基本信息等传输至元数据操作机构320,并以XML等形式存储到一个存储器中,如元数据XML存储器340中。
元数据操作机构320管理如下关系:逻辑对象与应用的API之间的关系、逻辑对象之间的关系、逻辑对象属性的取值范围以及逻辑对象之间的制约关系等。表2示意性示出了元数据的内容:
表2 元数据的内容
元数据 |
备注 |
逻辑对象 |
逻辑对象的基本信息 |
逻辑对象之间的关系 |
|
逻辑对象与应用API之间的关联关系 |
|
逻辑对象属性的取值范围1 |
由用户定义 |
逻辑对象属性的取值范围2 |
由应用API的操作对象类型决定 |
逻辑对象属性的取值范围3 |
由应用API的返回对象的值决定 |
逻辑对象属性与应用API参数对象之间的对应关系 |
属性可以对应于简单参数对象和复杂参数对象 |
应用API与数据库中数据表的对应关系 |
针对哪些数据表进行操作 |
应用API与参数对象的关系 |
API操作哪些参数对象 |
应用API之间的关联关系 |
API之间的调用关系 |
现在将概述逻辑对象接口机构310的功能。根据本发明的一个实施方式,逻辑对象接口机构310是用户直接操作的组件,用户通过该接口机构310的界面(在下文中将参见图10举例描述)来进行如下操作:
1)创建逻辑对象;
2)指定逻辑对象与应用API之间的关系;
3)根据与逻辑对象关联的API之间的调用关系,向用户提示逻辑对象之间的关系;
4)根据与逻辑对象关联的API的参数对象,向用户提示该逻辑对象拥有哪些属性;
5)向用户提示逻辑对象相关属性的类型和取值范围;
6)接收用户制定的注入规则;
7)根据用户指定的逻辑对象,生成相应的逻辑对象属性值的集合,并通过逻辑对象操接口机构变换为应用的API调用,通过元数据操作机构320和应用编程接口集成机构330向待集成的应用的数据库中插入数据;
8)清除应用数据库中所有数据,等等。
在下文中,将参考图4详细描述如何对应用的API进行过滤。根据本发明一个实施方式,将寻找与数据注入有关API的过程划分为两个阶段。设计原理在于:首先找到与数据注入直接相关的API(定义为初始集合),继而找到与该直接相关的API直接和/或间接相关的API(定义为扩展集合)。初始集合中的API例如包括向数据库中插入数据的API(包含insert、load或者import指令等),或者也可以由用户直接指定。初始集合中的API直接向数据库中注入数据,因而与数据注入相关联。初始集合中的API的参数对象可以是简单对象或者复杂对象。当参数对象是复杂参数对象时,该复杂参数对象需要调用另一API来返回;在另一API也调用了复杂参数对象时,出现嵌套调用的情况。此时的另一API则也与数据注入相关联,而这种关联是通过两个(或者更多)API之间的调用关系实现的间接关联。由此,在一个实施方式中,通过构建完备的扩展集合,来保证正确调用初始集合中的API。
图4示意性示出了根据本发明的一个实施方式的过滤掉无关的应用编程接口的方法的流程图400。
流程400开始于步骤S402,在此获得应用编程接口的初始集合,其中初始集合包括与向应用的数据库注入数据有关的应用编程接口。
接着在步骤S404中,获得应用编程接口的扩展集合,扩展集合包括对初始集合中的应用编程接口的复杂参数对象和复杂返回对象中的至少一个进行定义的应用编程接口。应当注意,此处的初始集合可以理解为发起过滤操作的“种子”集合,即以初始集合中的API作为种子进行操作,直到收获得出满足条件的扩展集合为止。
最后在步骤S406中,过滤掉除所述初始集合和所述扩展集合中的应用编程接口之外的一个或多个应用编程接口。
根据本发明的一个实施方式,可以采用以下至少一种方式指定初始集合:将向数据库中插入数据的应用编程接口的合集指定为初始集合;以及基于用户输入指定初始集合。应该理解,在一个实施方式中,初始集合是获取与数据注入有关的API的起始点,初始集合所包括API的种类和数量将影响最终获得的扩展集合中的API的种类和数量。
图5示意性示出了根据本发明的一个实施方式的构建与数据库注入有关的应用编程接口的初始集合的方法的流程图500。图5所示流程的目的之一在于寻找与数据注入直接相关的API,其核心思想之一在于遍历导入到目标系统中的多个API并将负责向数据库中插入数据的一个或多个API包括到初始集合中。
在步骤S502中,流程500检查所导入的API的内容。继而,在步骤S504中判断该API是否包括向应用的数据库插入数据的操作。如果步骤S504的判断结果为“是”,则流程500前进至步骤S506。在步骤S506,流程500将该API加入初始集合。如果步骤S504的判断结果为“否”,则流程500前进至步骤S508。在步骤S508,流程500判断该API是否为所导入的最后一个API。
如果在步骤S508中的判断结果为“否”,即,还存在其他API,则流程500前进至步骤S510。在步骤S510,流程500获取下一API,并返回步骤S502。如果步骤S508的判断结果为“是”,即,已经处理了全部导入API,则流程500结束,此时完成构建初始集合的操作。
根据本发明的一个实施方式,还可以基于用户输入来指定初始集合。例如,用户可以指定数据库中的数据表的集合来限定初始集合的范围,或者可以根据API的注释来设置仅指定将某些API加入初始集合。可以单独地或者结合地使用图5举例示出的流程500和用户指定这两种方式来构建初始集合。
现在将参考图6描述构建扩展集合的过程,图6示意性示出了根据本发明的一个实施方式的构建与数据库注入有关的应用编程接口的扩展集合的方法的流程图600。
在步骤S602中,将初始集合中的API的参数对象和返回对象加入对象集合。这里的参数对象和返回对象既包括简单对象,也包括复杂对象。接着在步骤S604中判断对象集合中的当前对象是否为简单对象。如果步骤S604中的判断结果为“否”,即,当前对象为非简单对象,则操作流程600转向步骤S606;否则转向步骤S610。
在步骤S606中,遍历导入的API并且搜索以当前的非简单对象为返回对象的API的集合;并且在步骤S608中,将所述API集合加入扩展集合,并将该API集合中的API的参数对象加入对象集合。
在步骤S610中判断当前对象是不是最后一个对象。如果步骤S610中的判断结果为“否”,则流程600转向步骤S612并得到下一对象,继而循环执行步骤S604至S612的操作。如果步骤S610中的判断结果为“是”,即,已经处理了当前对象的全部参数对象,则操作流程600转向步骤S614。在步骤S614,流程600结束针对当前API的处理。然后,流程600结束。应当注意,需要针对初始集合和扩展集合中的每个API执行步骤S602至S614的操作;注意,此时扩展集合中的元素是动态变化的,还需要针对新加入的元素进行处理。
换言之,此过程600是一个迭代实现的过程,直到所述初始集合和所述扩展集合中的参数对象和返回对象为简单对象,或者是由所述初始集合和所述扩展集合中的应用编程接口定义(也即,直到所有参数对象和返回对象或者是简单对象、或者在所述对象集合中为止)。
在下文中,将给出如何构建扩展集合的具体示例。
例如,初始集合中仅包括API:UserSession Logon(str,str,Database),而该API的参数对象包括简单参数对象str和复杂参数对象Database。则此时几个集合的状态如表3所示。
表3 集合状态1
集合名称 |
集合元素 |
初始集合 |
UserSession Logon(str,str,Database) |
扩展集合 |
空 |
对象集合 |
str,Database |
当发现初始集合中API的参数对象包括复杂参数对象Database时,则需要将以该复杂参数对象Database为返回对象的API:DatabaseDBConnect(str,str,str,str)加入扩展集合,并将DBConnect的参数对象加入对象集合。那么,此时几个集合的状态如表4所示。
表4 集合状态2
集合名称 |
集合元素 |
初始集合 |
UserSession Logon(str,str,Database) |
扩展集合 |
Database DBConnect(str,str,str,str) |
对象集合 |
str,Database |
此时,初始集合和扩展集合中的全部API的全部参数对象分别为1)“str”——简单对象;2)Database——复杂对象,由扩展集合中的API所返回,已经在对象集合中。因此,已经得出了最终的初始集合和扩展集合。应当注意,根据本发明的一个实施方式,构建扩展集合的过程是一个迭代过程,需要针对初始集合和扩展集合中原有的API、以及向扩展集合中新加入的API的参数对象进行循环操作。
下文将参考图7所示的树状结构详细描述构建初始集合与扩展集合的过程的例子。图7示意性示出了根据本发明的一个实施方式的构建有关应用编程接口的初始集合与扩展集合的过程中构造的树状结构的示意图700。为便于理解,首先简要叙述图7中的树状结构中各个节点的含义:
1.以矩形图标表示API节点,并且在附图标记中采用API为前缀,例如API 710和API 720这两个节点分别表示如下两个API:
Attachment AddAttachment(str,str,UserSession);以及
Boolean NewRecord(str,str,Resource,Date,Attachment,UserSession)。
2.以圆形图标表示简单参数对象,例如“str 711”表示字符串型参数对象,“Date 723”表示日期型参数对象等;
3.以椭圆形图标表示复杂参数对象,并且在附图标记中采用前缀“CO”(Complex Object,即复杂对象的缩写)来表示。例如“CO 7301”和“CO 7501”分别表示复杂参数对象UserSession和Resource。
4.以连接线表示两个节点之间的关系:
1)参数对象关系,如简单参数对象“str 711”与应用编程接口“API710”之间的连线表示API AddAttachment的一个简单参数对象的类型是str(字符串);
2)返回对象关系,如复杂参数对象“CO 7301”与“API 730”之间的连线表示,API Logon返回的是UserSession类型的复杂对象。
在下文中,将参考图7给出对API进行过滤的具体示例。
例如,构造初始集合:对导入的API包进行分析,判断哪些API包括向数据库注入数据的操作。例如API AddAttachment和NewRecord中均包括对数据库进行插入的语句“insert”,因此构造初始集合为:
初始集合:{AddAttachment,NewRecord}。
通过前文中根据本发明的实施方式描述的方法,在已经构造了初始集合API 700包括子节点API 710和API 720的情况下,根据前文所述导入的API包中保存的API之间的调用关系,可以得出如图7中所示的树状结构。
例如,当发现初始集合中的AddAttachment API 710的参数分别为(str,str,UserSession)时,以圆形图标str 711和str 712表示简单参数对象,以椭圆形图标CO 7301表示复杂参数对象UserSession,并将其作为API 710的子节点。又通过查找表1可知,复杂参数对象UserSession由应用编程接口Logon返回,即UserSession Logon(str,str,Database)。则在CO 7301表示的复杂对象UserSession与API 730表示的API Logon之间建立返回关系。
以此方式构造树状结构700,所生成的树状结构700中的初始集合中元素以外的全部API节点即构成了扩展集合,并且树状结构700中的所有叶节点均为简单参数对象。应注意,树状结构700中最右侧的Attachment CO 724和UserSession CO 725,分别由AttachmentAddAttachment(str,str,UserSession)和UserSession Logon(str,str,Database)返回。为简单起见,在图7中并未示出相应的子树(它们类似于子树AddAttachment API 710和UserSession CO 7301)。
尽管图7中仅示出了在初始集合中包括两个API的情况,本领域技术人员可以根据所示方法的原理,在初始集合中包括更多API的情况下,以类似方法得出扩展集合,并进而过滤掉与数据注入无关的API。应当理解,本领域技术人员还可以以其他方式构造初始集合和扩展集合,并且还可以用深度优先、或者广度优先的方式迭代地获取与数据注入有关的API。在此示出的树状结构的示例,并不对实现本发明的方法构成任何限制,而是仅用作举例目的。由此,在图7所示的例子中过滤后得到的与数据注入相关的API如表5所示:
表5 过滤后的与数据注入相关的API
序号 |
API定义 |
1 |
Attachment AddAttachment(str,str,UserSession) |
2 |
UserSession Logon(str,str,Database) |
3 |
Database DBConnect(str,str,str,str) |
4 |
Resource NewResource(str,str,int) |
5 |
Boolean NewRecord(str,str,Resource,Date,Attachment,UserSession) |
图8示意性示出了根据本发明的一个实施方式的在逻辑对象属性与应用编程接口参数对象之间建立映射的方法的流程图800。
首先,在步骤S802中,基于用户输入801来向用户提示符合条件的API集合。这里所述的用户输入801是指用户建立逻辑对象时的用户输入,用户可以根据自己期望向应用的数据库中注入的数据来定义逻辑对象。在一个实施方式中,建立逻辑对象的原则是,一个逻辑对象能够完整地描述应用中的使用场景中的一个实体,如测试用例,测试方案等。根据本发明的一个实施方式,提示符合条件的API集合的方式例如可以包括:用户选择数据库中的数据表的名称,或者用户选择API的参数对象名称、或者通过搜索API的注释向用户提供可选择的API列表等。
接着在步骤S804中,接收用户选择的API,并且根据所选择API的参数对象提示该逻辑对象的属性集合。之后,可以在逻辑对象与应用API之间建立关联。根据本发明的一个实施方式,建立逻辑对象与应用的应用编程接口之间的关联包括以下至少一个:在逻辑对象的属性与应用编程接口的简单参数对象之间建立映射;以及在应用编程接口的复杂参数对象与其他逻辑对象之间建立映射。
现在将参考步骤S806至S814来详细说明如何建立上述两种类型的关联。根据本发明的一个实施方式,当用户建立逻辑对象时,如果所选择的API的参数对象均为简单参数对象,则可以在该逻辑对象与该所选择的API的简单参数对象之间直接建立关联。
例如,在步骤S806中,判断参数对象是否为简单对象。如果步骤S806中的判断结果为“是”,则操作流程800直接跳转至步骤S812;否则,操作流程800前进至步骤S808。在步骤S808中,系统根据以该非简单对象为返回对象的API创建新的逻辑对象,并在当前API与新的逻辑对象之间进行关联。其后,在步骤S810中,用户可以针对该新的逻辑对象进行编辑操作,例如,对系统创建的逻辑对象进行重命名。在步骤S812中,在逻辑对象的属性与简单对象之间建立关联,并判断当前的逻辑对象是否为最后一个逻辑对象。如果步骤S812中的判断结果为“是”,即,当前逻辑对象是最后一个逻辑对象,则流程800转向步骤S814;否则,流程800返回步骤S806,继续处理下一逻辑对象。在步骤S814中,即在已经建立关联之后,用户还可以修改逻辑对象的关联。然后,流程800结束。
现在以具体示例说明步骤S806至S812的操作过程。例如,在用户建立了名称为“数据库”的逻辑对象之后,用户从提示的API中选择了Database DBConnect(str,str,str,str)。此时由于API DBConnect的各个参数均为简单参数对象“str”,则此时可以在所述逻辑对象“数据库”的属性与所述应用编程接口DBConnect的简单参数对象(即,4个字符串型参数)之间建立映射。
当用户选择的API的参数包括复杂参数对象时,则需要在所述应用编程接口的复杂参数对象与其他逻辑对象之间建立映射。例如,用户建立了名称为“用户登录对话”的逻辑对象,并从所提示API中选择了UserSession Logon(str,str,Database),则此时由于所选择API的参数对象包括复杂参赛对象Database,而需要在该API与其他逻辑对象之间建立映射。由于Database DBConnect(str,str,str,str)返回复杂参赛对象Database,因而可以针对API DBConnect创建新的逻辑对象(例如命名为“数据库”),并将该新的逻辑对象“数据库”与所选择的API Logon相关联。其后,用户可以针对该新的逻辑对象进行编辑操作,例如重命名等。应当注意,在一个实施方式中,建立关联的过程是一个迭代的过程,直到最终找到的所有对象均为简单对象为止。
根据本发明的一个实施方式,还可以在逻辑对象之间建立制约关系。例如,可以通过与逻辑对象关联的API之间的调用关系来决定上述制约关系。例如,在上文的示例中,逻辑对象“用户登录对话”与API UserSession Logon(str,str,Database)相关联。逻辑对象“数据库”与API Database DBConnect(str,str,str,str)相关联。其中Logon的一个参数对象是API DBConnect的返回对象。那么,逻辑对象“用户登录对话”依赖于逻辑对象“数据库”。即,在进行数据注入时,需要先注入逻辑对象“数据库”的数据,再注入逻辑对象“用户登录对话”的数据。
此外,也可以人为地修改逻辑对象之间的制约关系。即,人为地增加一些在API调用关系中检测不到的逻辑对象之间的制约关系。
参见图9举例说明如何在逻辑对象与应用API之间进行关联,其中图9示意性示出了根据本发明的一个实施方式的在逻辑对象属性与应用编程接口参数对象之间建立映射的过程中构造的树状结构的示意图900。
例如,根据用户选择而向用户提示符合条件的API集合,用户可选择与所创建逻辑对象对应的API,如:用户创建了一个逻辑对象,将其命名为“变更记录”,并指定了数据库中的数据表ChangeRequestRecords。可以根据用户所选的这个表的信息,提示如下API与此表关联:Boolean NewRecord(str,str,Resource,Date,Attachment,UserSession)。用户继而可以选择将此NewRecord与逻辑对象“变更记录”相关联。
树状结构900的构建过程与图7中的树状结构700相类似,在此不再赘述。不同之处在于,其中椭圆形图标表示逻辑对象,并且以前缀“LO”(Logical Object,逻辑对象的缩写)来表示。
然后,将逻辑对象“变更记录”的属性与NewRecord的参数对象进行关联,如果参数对象是复杂对象,则根据该复杂对象作为返回对象的API创建新的逻辑对象进行关联。如:
在Boolean NewRecord(str,str,Resource,Date,Attachment,UserSession)中,参数对象Resource是复杂参数对象,需要如下API返回:
Resource NewResource(str,str,int),此时系统自动为新添加的API NewResource创建了逻辑对象。用户可以对此逻辑对象进行重命名,例如将其命名为“资源”。
针对复杂参数对象Attachment、UserSession、Database等,也进行类似操作,并且创建相应的逻辑对象。最终形成如表6中所示的逻辑对象与API之间的对应关系。
表6 逻辑对象与API之间的对应关系
逻辑对象 |
API |
变更记录 |
Boolean NewRecord(str,str,Resource,Date,Attachment,UserSession) |
资源 |
Resource NewResource(str,str,int) |
附件 |
Attachment AddAttachment(str,str,UserSession) |
用户登录对话 |
UserSession Logon(str,str,Database) |
数据库 |
Database DBConnect(str,str,str,str) |
根据本发明的一个实施方式,用户也可以随时修改逻辑对象与应用API之间的关联。可以采用图9中所示的树状结构900来描述在逻辑对象属性与应用编程接口参数对象之间建立映射关联的过程。其中以圆形图标表示的全部叶节点,即为建立关联关系后得出的简单参数对象。而图9中的椭圆形图标表示的所有节点为此过程中所涉及的全部逻辑对象,例如,LO 900表示逻辑对象“变更记录”;LO 940表示逻辑对象“数据库”。并且从图中可知,该逻辑对象“数据库”与API DBConnect相关联(在图中表示为节点API 940)。
图10示意性示出了根据本发明的一个实施方式的在逻辑对象属性与应用编程接口参数对象之间建立映射的用户界面示意图1000。如图所示,界面1000示出了建立逻辑对象1时的操作界面:如图10左侧所示,用户可以使用控件1002对该逻辑对象的属性进行重命名,可以使用控件1004来将逻辑对象的属性与API的参数对象进行关联,可以使用控件1006来调整逻辑对象属性的取值范围,等等。在图10的中部和右侧分别示出了逻辑对象的属性1010以及API的参数对象1020,两者之间的箭头表示属性和参数之间的关联关系,例如属性1 1012可由参数1 1022赋值(相关联),逻辑对象2 1016可由API的复杂参数对象1026赋值(相关联)。
根据本发明的一个实施方式,用户还可以定义数据注入规则。其中形成数据注入规则包括以下至少一个:根据所述目标系统的默认方式,形成所述数据注入规则;以及根据用户的自定义方式,形成所述数据注入规则。在此所述的默认方式即根据本发明的实施方式中注入数据的默认方式,例如可以将“随机生成”或者“全部注入”作为默认注入方式。此外用户还可以自己定义注入规则。
根据本发明的一个实施方式,向所述应用的所述数据库注入数据包括:从至少一个数据文件向所述应用的所述数据库批量地注入数据;以及根据所述数据注入规则自动生成随机数据,并向所述应用的所述数据库批量地注入所述随机数据。应该理解,可以从现有的数据文件中读取数据,并且向应用的数据库中注入数据。例如,在一个实施方式中,数据文件是现有的集中式或者分布式数据库,或者是保存了全部用户数据的数据文件。在另一个实施方式中,将当前生成的数据(例如随机生成数据)或者从其他数据生成系统中导出的数据注入应用的数据库中。
根据本发明的一个实施方式,用户可以定义逻辑对象的属性的取值范围。该范围通常是由与该逻辑对象关联的应用API的参数对象所决定的。如果是简单参数对象,则符合该简单对象的取值范围。如果是复杂参数对象,则其取值范围将是以此复杂参数对象为返回对象的API的参数(包括简单参数对象和复杂参数对象)的取值范围。相关逻辑对象的属性以及其取值的范围均被记录在元数据存储当中。如前文已述,以XML的形式记录元数据仅仅是一种记录方式,本领域技术人员还可以自定义其他任何类型的记录方式,只要能够准确无误地记录元数据即可。
在下文中,将给出定制逻辑对象取值范围的具体示例。应当注意,此处的取值范围具有广泛的含义,可以包括参数的类型(例如,整数)、连续区间的取值范围(例如,大于0),离散区间的取值范围(例如,[0,1]、[3,5]),或者枚举类型(例如,TRUE、FALSE)等。
例如,为简单对象“时间”设定其取值范围为Date(2009-02-0100:00:00)~Date(2009-05-31 00:00:00),则以XML形式表示的元数据表示如下:
又例如,为简单对象“工资”设定为取值范围大于0的整数,以XML表示如下:
又例如,为简单对象“性别”设定取值范围为Male或者Female,以XML表示如下:
在下文中,将给出制定数据注入规则的具体示例。
用户根据系统提供的逻辑对象之间的制约关系以及逻辑对象属性的取值范围执行数据注入的规则。例如:在上文示例的背景环境中,向应用的数据库批量注入变更记录数据,可以根据需求制定如下注入规则,
1.数量为1000条;
2.变更记录的标题使用复合一定格式的固定字符串、时间戳和随机字符串的组合;
3.按照变更记录的不同类型,创建相应的比例:用户变更记录20%,系统变更记录80%;
4.从数据文件resource中随机选择设置为变更记录的Owner(文件中列出了100个用户id);以及
5.需要提前创建50个“Resource”。
在XML元数据存储中可以如下方式表示,其中右侧“元数据”一栏中列出了XML表示的元数据的示例,而左侧规则一栏中是与该XML表示相对应的规则:
规则 |
元数据 |
|
<data><object_name>Record<object_name> |
规则1 |
<amount>1000</amount> |
|
<rules> |
规则2 |
<rule><object>Record.Title</object><type>NameGenerator</type><expression>”RecordTitle-”+Date()+“-“+Random(32)</expression></rule> |
规则3 |
<rule><object>Record.Type</object><type>Weight</type><weight><name>Workitem.Type.User</name><value>20%</vaule></weight><weight><name>Workitem.Type.System</name><value>80%</vaule></weight></rule> |
规则4 |
<rule><object>Record.Owner</object><type>Random</type></rule></rules> |
规则5 |
<dependencies><dependency><object_name>Resource<object_name><amount>50</amount></dependency></dependencies> |
|
<data> |
根据本发明的一个实施方式,可以基于用户定义的逻辑对象与应用的API之间的关联以及数据注入规则,来向一个应用的数据库注入数据。在一个实施方式中,此时基于该关联和数据注入规则生成代码,并且在应用API调用环境中通过程序调用应用API,进行批量数据的注入。根据本发明的一个实施方式,还可以记录各种异常,例如报错的记录数和相应的逻辑对象以及应用API。根据本发明的一个实施方式,用户可以在注入期间停止数据注入,并且还可以清空数据库。
图11示意性示出了根据本发明的另一个实施方式的用于向应用的数据库注入数据的设备1100的框图。该设备1100包括:导入装置1110,用于将所述应用的应用编程接口导入到目标系统中;建立装置1120,用于基于用户输入来建立逻辑对象;关联装置1130,用于建立所述逻辑对象与所述应用的应用编程接口之间的关联;形成装置1140,用于形成数据注入规则;以及注入装置1150,用于基于所述关联和所述数据注入规则来向所述应用的所述数据库注入数据。
如图11中箭头A所示,导入装置1110将应用的应用编程接口1160导入目标系统;并且如箭头B所示,建立装置1120基于用户输入1170来建立逻辑对象。应当注意,箭头A和B所示的过程可以以任意顺序执行,而标记A和B并不对执行顺序构成任何限制。关联装置1130接收导入装置1110和建立装置1120的输出(分别如箭头C和D所示),并在逻辑对象与应用的应用编程接口之间建立关联。最后,注入装置1150基于关联装置1130建立的关联(如箭头E所示)以及形成装置1140形成的注入规则(如箭头F所示),向应用的数据库注入数据。
在后文中将概括描述根据本发明的实施方式的向应用的数据库中注入数据的设备的更多细节。应当注意,所述设备用于执行如前文详细描述的方法的步骤,并且所述设备中的各种装置可用于执行与前文所述方法的各步骤相一致的操作,因而不再赘述其中的具体细节。
根据本发明的一个实施方式,其中所述导入装置可以包括:过滤装置,用于过滤掉与向所述应用的所述数据库注入数据无关的应用编程接口。
根据本发明的一个实施方式,其中所述过滤装置可以包括:第一获得装置,用于获得初始集合,所述初始集合包括与向所述应用的所述数据库注入数据有关的应用编程接口;第二获得装置,用于获得扩展集合,所述扩展集合包括对所述初始集合中的应用编程接口的复杂参数对象和复杂返回对象中的至少一个进行定义的应用编程接口;以及应用编程接口过滤装置,用于过滤掉除所述初始集合和所述扩展集合中的应用编程接口之外的应用编程接口。
根据本发明的一个实施方式,还可以包括以下至少一个:第一指定装置,用于将向所述数据库中插入数据的应用编程接口指定为所述初始集合;以及第二指定装置,用于基于用户输入指定所述初始集合。
根据本发明的一个实施方式,所述第二获得装置可以包括:迭代装置,用于迭代地将定义了所述初始集合和所述扩展集合中的应用编程接口的复杂参数对象和复杂返回对象中的至少一个的应用编程接口加入所述扩展集合、直到所述初始集合和所述扩展集合中的参数对象和返回对象均为简单对象、或者是均由所述初始集合和所述扩展集合中的应用编程接口定义。
根据本发明的一个实施方式,其中所述关联装置可以包括以下至少一个:第一映射装置,用于在所述逻辑对象的属性与所述应用编程接口的简单参数对象之间建立映射;以及第二映射装置,用于在所述应用编程接口的复杂参数对象与其他逻辑对象之间建立映射。
根据本发明的一个实施方式,其中所述形成装置可以包括以下至少一个:第一形成装置,用于根据所述目标系统的默认方式来形成所述数据注入规则;以及第二形成装置,用于根据用户的自定义方式来形成所述数据注入规则。
根据本发明的一个实施方式,其中所述注入装置可从至少一个数据文件向所述应用的所述数据库批量地注入数据。
根据本发明的一个实施方式,还包括随机数据生成装置,用于根据所述数据注入规则自动生成随机数据。注入装置还向所述应用的所述数据库批量地注入所述随机数据。
根据本发明的一个实施方式,其中所述数据注入规则可以包括以下至少一个:至少一个所述逻辑对象的属性的取值范围;被注入数据的数量;生成被注入数据时使用的随机值生成器;被注入数据中的至少一个值的类型;以及被注入数据中的至少一个值的出现频度。
应当注意,附图中的流程图和框图示出了根据各种实施方式的系统、方法和计算机程序应用的可能实现的架构、功能和操作。在这点上,流程图或框图中的每个步骤可以代表模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包括一个或多个用于实现指定的逻辑功能的可执行指令。还应当注意,在有些备选实现中,步骤中标注的功能也可以以不同于附图中所标注的顺序发生。例如,连续示出的两个步骤实际上可以基本并行地执行,或者这些步骤有时也可以按相反的顺序执行,这依所涉及的功能而定。
本发明可以采取完全硬件实施方式、完全软件实施方式或既包含硬件组件又包含软件组件的实施方式的形式。在优选实施方式中,本发明实现为软件,其包括但不限于固件、驻留软件、微代码等。
而且,本发明还可以采取可从计算机可用或计算机可读介质访问的计算机程序产品的形式,这些介质提供程序代码以供计算机或任何指令执行系统使用或与其结合使用。出于描述目的,计算机可用或计算机可读机制可以是任何有形的装置,其可以包含、存储、通信、传播或传输程序以由指令执行系统、装置或设备使用或与其结合使用。
介质可以是电的、磁的、光的、电磁的、红外线的、或半导体的系统(或装置或器件)或传播介质。计算机可读介质的例子包括半导体或固态存储器、磁带、可移动计算机磁盘、随机访问存储器(RAM)、只读存储器(ROM)、硬磁盘和光盘。目前光盘的例子包括紧凑盘-只读存储器(CD-ROM)、压缩盘-读/写(CD-R/W)和DVD。
适合与存储/或执行程序代码的数据处理系统将包括至少一个处理器,其直接地或通过系统总线间接地耦合到存储器元件。存储器元件可以包括在程序代码的实际执行期间所利用的本地存储器、大容量存储器、以及提供至少一部分程序代码的临时存储以便减少执行期间从大容量存储器必须取回代码的次数的高速缓冲存储器。
输入/输出或I/O设备(包括但不限于键盘、显示器、指点设备等等)可以直接地或通过中间I/O控制器耦合到系统。
网络适配器也可以耦合到系统,以使得数据处理系统能够通过中间的私有或公共网络而耦合到其他数据处理系统或远程打印机或存储设备。调制解调器、线缆调制解调器以及以太网卡仅仅是当前可用的网络适配器类型的几个例子。
从上述描述应当理解,在不脱离本发明真实精神的情况下,可以对本发明各实施方式进行修改和变更。本说明书中的描述仅仅是用于说明性的,而不应被认为是限制性的。本发明的范围仅受所附权利要求书的限制。