具体实施方式
下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的模块或具有相同或类似功能的模块。下面通过参考附图描述的实施例是示例性的,仅用于解释本申请,而不能理解为对本申请的限制。相反,本申请的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。
图1是本申请一实施例提出的智能测试方法的流程示意图。如图1所示,该方法包括:
S11:向用户展示录入页面,并接收用户在所述录入页面中录入的页面数据。
页面数据包括:待测试接口的接口名、测试方法的方法名,另外,还可以包括指定K-V,K-V是指关键字(key)和对应的值(value)。
其中,可以在录入页面中向用户提供一个或多个可供选择的接口名和方法名,用户可以选择需要的接口名和方法名。
另外,如果需要,用户还可以手工输入指定K-V。
例如,参见图2,本实施例对应的系统20中可以包括:测试管理界面21,测试管理界面21的一种功能是向用户展示录入页面。
录入页面可以如图3所示,在录入页面中,用户可以选择待测试接口的接口名31和测试方法的方法名32,另外还可以输入指定K-V 33。
一些实施例中,参见图4,该方法还包括:
S41:获取资源包,所述资源包中包含接口定义。
其中,测试请求需要基于接口定义发起,因此需要有接口定义。
以java编程为例,资源包可以具体是包含接口定义的jar包。
具体的,参见图2,系统还可以包括:测试管理组件22。用户可以通过测试管理界面21向系统上传jar包的资源文件地址,之后系统可以将获取的资源文件地址记录在数据库中。测试管理组件22用于从数据库中获取资源文件地址并根据资源文件地址下载资源文件,在下载后,可以先判断下载的资源文件是否是jar文件,如果是,则进行解压,动态类加载(load class)等加载jar文件。如果不是jar文件则可以结束流程。
S42:提取所述资源包中的关键信息,并将所述关键信息存储到资源池中。
测试管理组件22加载jar文件后,可以从中提取关键信息,例如类信息,之后将其存储到资源池中。
在存储关键信息时,具体的可以按照预设格式进行存储,本实施例称为类型仓储(map),类型仓储的结构如下:
Map<接口名,Map<方法名,List<入参类型>>>
接口名也可以称为类名,如“com.alipay.test.TestInterface”;
方法名,如“Sting queryInfo(String)”;
入参类型,如“java.lang.String”、“long”。
S43:根据所述关键信息生成可供选择的接口名和方法名,并在所述录入页面中进行展示。
在得到上述的类型仓储后,可以根据其生成可供选择的接口名和方法名,在录入页面中展示,实现页面初始化。
具体的,如上所示的类型仓储中会包含接口名、方法名等字段,可以在类型仓储的相应字段位置进行提取,从而得到可供选择的接口名和方法名,如提取出一种可供选择的接口名是“com.alipay.test.TestInterface”,提取出一种可供选择的方法名是“Sting queryInfo(String)”。
S12:根据所述页面数据,以及预先获取的资源池和请求池,生成当前实例请求。
当用户录入页面数据后,可以将其发送给系统,例如,用户点击录入页面的“发送请求”按钮后,可以将页面数据发送给系统,之后由系统进行实例请求化。
例如,参见图2,该系统还包括:实例化请求组件23,由实例化请求组件根据页面数据、资源池和请求池生成当前实例请求。
如上所示,测试管理组件22加载jar文件(资源包)后,可以将提取的关键信息存储到资源池中。
请求池是实例请求的集合,该集合可以包括历史实例请求,历史实例请求具体可以通过保存历史的测试用例,从测试用例中获取历史实例请求。另外,在得到当前实例请求后,也可以将其存储到请求池中,以提高请求池内数据的完备性和精准性。
一些实施例中,参见图5,生成当前实例请求的流程可以包括:
S51:根据页面数据中的接口名和方法名,从资源池中获取当前测试信息。
测试信息包括:接口名、方法名、入参类型以及指定K-V。例如,测试信息表示为:接口名.方法名.入参类型1,入参类型2,…,入参类型n+指定K-V。
例如,如上所示,资源池中记录的类型仓储的结构是:
Map<接口名,Map<方法名,List<入参类型>>>
通过该结构,可以找到与用户录入的接口名和方法名对应的入参类型,并由录入的接口名、方法名和对应的入参类型组成上述的接口名.方法名.入参类型1,入参类型2,…,入参类型n。另一方面,用户录入时可以输入指定K-V(如图3中的s=”test”),从而可以得到当前测试信息。
S52:确定当前测试信息与请求池中实例请求对应的测试信息之间的匹配关系。
如上所示,请求池中存储有实例请求。具体的,每个实例请求可以与测试信息对应存储,例如,测试信息_1对应实例请求_1。每个测试信息的形式可以如上所示。
通过将当前测试信息与请求池中的每个测试信息进行比较,可以确定匹配关系。
匹配关系包括:完全匹配、不完全匹配和不匹配。
其中,完全匹配是指请求池中存在与当前测试信息中的接口名、方法名和入参类型以及指定K-V均一致的测试信息,不完全匹配是指请求池中存在与当前测试信息中的接口名、方法名和入参类型一致、但指定K-V不一致(关键字K不同或值V不同)的测试信息,不匹配是指请求池中不存在与当前测试信息中的接口名、方法名和入参类型一致的测试信息。
S53:如果匹配关系是完全匹配,则从请求池中获取完全匹配的测试信息对应的实例请求,并将获取的实例请求作为当前实例请求。
例如,请求池中一个实例请求A对应的测试信息与当前测试信息完全匹配,则将实例请求A确定为当前实例请求。
S54:如果匹配关系是不完全匹配,则从请求池中获取不完全匹配的测试信息对应的实例请求,并用页面数据中的指定K-V更新获取的实例请求中的相应属性值,将更新后的实例请求作为当前实例请求。
例如,请求池中一个实例请求A对应的测试信息与当前测试信息不完全匹配,则获取实例请求A,假设实例请求A中的一个入参数据是s=”request”,同时页面数据中的指定K-V是s=”test”,则用s=”test”替换s=”request”,假设更新后得到实例请求A’,则将实例请求A’确定为当前实例请求。
S55:如果匹配关系是不匹配,则根据当前测试信息以及预设机制,进行实例化,得到当前实例请求。
预设机制例如是java反射机制。
例如,对一个从未测试过的接口发起测试,请求池中不存在匹配的测试信息,则可以根据当前测试信息,采用java反射机制进行实例化。
例如,页面数据中的接口名和方法名分别是“com.alipay.test.TestInterface”和“Sting queryInfo(String s,Stringd)”,通过在资源池中查找确定入参数据是String类型的s和String类型的d,则可以通过java反射机制,得到一个String类型的实例s和一个String类型的d,另外,如果页面数据中还包括指定K-V是s=”test”,则将实例s的值更新为”test”。
通过上述流程可以生成当前实例请求。
一些实施例中,在得到当前实例请求后,如图6所示,该方法还可以包括:
S61:将生成的当前实例请求展示给用户,以供用户确认或修改。
例如,实例请求化组件得到当前实例请求后,通过测试管理界面将其展示给用户。
用户可以通过测试管理界面确认或修改当前实例请求。
另外,用户在确认或修改当前实例请求后,可以将确认或修改后的当前实例请求保存在请求池中,以供后续使用。
S13:根据所述当前实例请求进行测试。
如果用户对展示的当前实例请求进行了修改,则测试时采用的具体是指修改后的当前实例请求。
参见图2,系统还包括:测试执行模块24,测试执行模块24用于对当前实例请求进行具体的测试执行。
S14:将测试得到的当前结果与历史结果进行比较,得到校验结果,并展示给用户。
测试执行模块24在执行测试后,会得到当前结果。
参见图2,系统还包括:结果校验组件25,结果校验组件25用于对当前结果与历史结果进行比较,得到校验结果。历史结果也可以称为历史基线。
例如,结果校验组件25可以从测试执行模块24获取到当前结果。另外,系统中还包括结果池,结果池内保存历史结果,结果校验模块25可以从结果池中获取历史结果,进而实现当前结果与历史结果的比较。
在得到比较结果后,可以通过测试管理界面21展示给用户。例如,参见图3,可以展示比较结果34。
具体的,可以根据用户的触发或者在存在历史结果是自动触发结果校验组件进行比较,得到校验结果。
结果校验组件在比较时,可以基于反射机制获取当前结果的所有属性值,并与历史结果中的属性值一一比较,并反馈给用户,还可以给出总体的结果。
另外,在展示校验结果的页面上还可以提高按钮用于变更用例结果(历史结果)数据,如用例结果数据发生变更,同步到结果池,若不做选择,保留原用例。
一些实施例中,参见图6,该方法还可以包括:
S62:根据用户的选择,根据当前实例请求及当前结果生成用例。
例如,参见图3,可以在页面上提供用于生成用例的按钮,图3中用保存为用例表示,从而实现用例的自动化生成。
一些实施例中,参见图6,该方法还可以包括:
S63:对生成的用例进行持久化。
在生成用例后,可以用新生成的用例更新请求池和结果池。例如,可以对用例进行持久化,在服务器启动时将数据加载至请求池和结果池。
一些实施例中,参见图6,该方法还可以包括:
S64:对持久化的用例进行用例管理。
用例管理例如包括:删除、修改、查看、分类、定时回放、作为发送校验请求功能的入口等。
定时回放是指配置回放周期,测试系统根据该回放周期定期生成实例请求和得到测试结果,并可以根据实例请求和测试结果生成离线报告并存储在数据库内,以供用户随时检查。
本实施例中,通过根据页面数据和资源池以及请求池生成当前实例请求,可以实现实例请求的自动生成,避免人工方式存在的问题,提高测试效率。另外,通过将当前结果与历史结果进行比较,可以更好的发现问题,从而提高测试效果。
图7是本申请另一实施例提出的智能测试装置的结构示意图,该装置70包括:测试管理界面71、实例化请求组件72、测试执行模块73和结果校验组件74。
测试管理界面71,用于向用户展示录入页面,并接收用户在所述录入页面中录入的页面数据。
页面数据包括:待测试接口的接口名、测试方法的方法名,另外,还可以包括指定K-V,K-V是指关键字(key)和对应的值(value)。
其中,可以在录入页面中向用户提供一个或多个可供选择的接口名和方法名,用户可以选择需要的接口名和方法名。
另外,如果需要,用户还可以手工输入指定K-V。
相应的,所述页面数据包括:接口名、方法名和指定K-V,所述录入页面中包含可供选择的接口名和方法名,所述测试管理界面71用于接收用户在所述录入页面中录入的页面数据,包括:
接收用户在所述录入页面中选择的接口名和方法名;
接收用户在所述录入页面中输入的指定K-V。
录入页面可以如图3所示,在录入页面中,用户可以选择待测试接口的接口名31和测试方法的方法名32,另外还可以输入指定K-V 33。
一些实施例中,参见图8,该装置70还包括:
测试管理组件75,用于获取资源包,所述资源包中包含接口定义;提取所述资源包中的关键信息,并将所述关键信息存储到资源池中;以及,根据所述关键信息生成可供选择的接口名和方法名,并通过所述测试管理界面在所述录入页面中进行展示。
其中,测试请求需要基于接口定义发起,因此需要有接口定义。
以java编程为例,资源包可以具体是包含接口定义的jar包。
用户可以通过测试管理界面向系统上传jar包的资源文件地址,之后系统可以将获取的资源文件地址记录在数据库中。测试管理组件用于从数据库中获取资源文件地址并根据资源文件地址下载资源文件,在下载后,可以先判断下载的资源文件是否是jar文件,如果是,则进行解压,动态类加载(load class)等加载jar文件。如果不是jar文件则可以结束流程。
测试管理组件加载jar文件后,可以从中提取关键信息,例如类信息,之后将其存储到资源池中。
在存储关键信息时,具体的可以按照预设格式进行存储,本实施例称为类型仓储(map),类型仓储的结构如下:
Map<接口名,Map<方法名,List<入参类型>>>
接口名也可以称为类名,如“com.alipay.test.TestInterface”;
方法名,如“Sting queryInfo(String)”;
入参类型,如“java.lang.String”、“long”。
在得到上述的类型仓储后,可以根据其生成可供选择的接口名和方法名,在录入页面中展示,实现页面初始化。
具体的,如上所示的类型仓储中会包含接口名、方法名等字段,可以在类型仓储的相应字段位置进行提取,从而得到可供选择的接口名和方法名,如提取出一种可供选择的接口名是“com.alipay.test.TestInterface”,提取出一种可供选择的方法名是“Sting queryInfo(String)”。
实例化请求组件72,用于根据所述页面数据,以及预先获取的资源池和请求池,生成当前实例请求。
当用户录入页面数据后,可以将其发送给系统,例如,用户点击录入页面的“发送请求”按钮后,可以将页面数据发送给系统,之后由系统进行实例请求化。
如上所示,测试管理组件加载jar文件(资源包)后,可以将提取的关键信息存储到资源池中。
请求池是实例请求的集合,该集合可以包括历史实例请求,历史实例请求具体可以通过保存历史的测试用例,从测试用例中获取历史实例请求。另外,在得到当前实例请求后,也可以将其存储到请求池中,以提高请求池内数据的完备性和精准性。
一些实施例中,参见图8,所述页面数据包括:接口名、方法名和指定K-V,所述实例化请求组件72包括:
第一单元721,用于根据页面数据中的接口名和方法名,从资源池中获取当前测试信息;
第二单元722,用于确定当前测试信息与请求池中实例请求对应的测试信息之间的匹配关系;
第三单元723,用于如果匹配关系是完全匹配,则从请求池中获取完全匹配的测试信息对应的实例请求,并将获取的实例请求作为当前实例请求;
第四单元724,用于如果匹配关系是不完全匹配,则从请求池中获取不完全匹配的测试信息对应的实例请求,并用页面数据中的指定K-V更新获取的实例请求中的相应属性值,将更新后的实例请求作为当前实例请求;
第五单元725,用于如果匹配关系是不匹配,则根据当前测试信息以及预设机制,进行实例化,得到当前实例请求。
测试信息包括:接口名、方法名、入参类型以及指定K-V。例如,测试信息表示为:接口名.方法名.入参类型1,入参类型2,…,入参类型n+指定K-V。
例如,如上所示,资源池中记录的类型仓储的结构是:
Map<接口名,Map<方法名,List<入参类型>>>
通过该结构,可以找到与用户录入的接口名和方法名对应的入参类型,并由录入的接口名、方法名和对应的入参类型组成上述的接口名.方法名.入参类型1,入参类型2,…,入参类型n。另一方面,用户录入时可以输入指定K-V(如图3中的s=”test”),从而可以得到当前测试信息。
如上所示,请求池中存储有实例请求。具体的,每个实例请求可以与测试信息对应存储,例如,测试信息_1对应实例请求_1。每个测试信息的形式可以如上所示。
通过将当前测试信息与请求池中的每个测试信息进行比较,可以确定匹配关系。
匹配关系包括:完全匹配、不完全匹配和不匹配。
其中,完全匹配是指请求池中存在与当前测试信息中的接口名、方法名和入参类型以及指定K-V均一致的测试信息,不完全匹配是指请求池中存在与当前测试信息中的接口名、方法名和入参类型一致、但指定K-V不一致(关键字K不同或值V不同)的测试信息,不匹配是指请求池中不存在与当前测试信息中的接口名、方法名和入参类型一致的测试信息。
例如,请求池中一个实例请求A对应的测试信息与当前测试信息完全匹配,则将实例请求A确定为当前实例请求。
例如,请求池中一个实例请求A对应的测试信息与当前测试信息不完全匹配,则获取实例请求A,假设实例请求A中的一个入参数据是s=”request”,同时页面数据中的指定K-V是s=”test”,则用s=”test”替换s=”request”,假设更新后得到实例请求A’,则将实例请求A’确定为当前实例请求。
预设机制例如是java反射机制。
例如,对一个从未测试过的接口发起测试,请求池中不存在匹配的测试信息,则可以根据当前测试信息,采用java反射机制进行实例化。
例如,页面数据中的接口名和方法名分别是“com.alipay.test.TestInterface”和“Sting queryInfo(String s,Stringd)”,通过在资源池中查找确定入参数据是String类型的s和String类型的d,则可以通过java反射机制,得到一个String类型的实例s和一个String类型的d,另外,如果页面数据中还包括指定K-V是s=”test”,则将实例s的值更新为”test”。
通过上述流程可以生成当前实例请求。
一些实施例中,实例化请求组件生成当前实例请求后,还用于通过测试管理界面将生成的当前实例请求展示给用户,以供用户确认或修改。
用户可以通过测试管理界面确认或修改当前实例请求。
另外,用户在确认或修改当前实例请求后,可以将确认或修改后的当前实例请求保存在请求池中,以供后续使用。
测试执行模块73,用于根据所述当前实例请求进行测试。
如果用户对展示的当前实例请求进行了修改,则测试时采用的具体是指修改后的当前实例请求。
结果校验组件74,用于将测试得到的当前结果与历史结果进行比较,得到校验结果,并通过所述测试管理界面展示给用户。
例如,结果校验组件可以从测试执行模块获取到当前结果。另外,系统中还包括结果池,结果池内保存历史结果,结果校验模块可以从结果池中获取历史结果,进而实现当前结果与历史结果的比较。
在得到比较结果后,可以通过测试管理界面展示给用户。例如,参见图3,可以展示比较结果34。
具体的,可以根据用户的触发或者在存在历史结果是自动触发结果校验组件进行比较,得到校验结果。
结果校验组件在比较时,可以基于反射机制获取当前结果的所有属性值,并与历史结果中的属性值一一比较,并反馈给用户,还可以给出总体的结果。
另外,在展示校验结果的页面上还可以提高按钮用于变更用例结果(历史结果)数据,如用例结果数据发生变更,同步到结果池,若不做选择,保留原用例。
一些实施例中,测试管理组件还用于:根据用户的选择,根据当前实例请求及当前结果生成用例。
例如,参见图3,可以在页面上提供用于生成用例的按钮,从而实现用例的自动化生成。
一些实施例中,测试管理组件还用于:对生成的用例进行持久化。
在生成用例后,可以用新生成的用例更新请求池和结果池。例如,可以对用例进行持久化,在服务器启动时将数据加载至请求池和结果池。
一些实施例中,测试管理组件还用于:对持久化的用例进行用例管理。
用例管理例如包括:删除、修改、查看、分类、定时回放、作为发送校验请求功能的入口等。
定时回放是指配置回放周期,测试系统根据该回放周期定期生成实例请求和得到测试结果,并可以根据实例请求和测试结果生成离线报告并存储在数据库内,以供用户随时检查。
本实施例中,通过根据页面数据和资源池以及请求池生成当前实例请求,可以实现实例请求的自动生成,避免人工方式存在的问题,提高测试效率。另外,通过将当前结果与历史结果进行比较,可以更好的发现问题,从而提高测试效果。
需要说明的是,在本申请的描述中,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。此外,在本申请的描述中,除非另有说明,“多个”的含义是指至少两个。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。
应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本申请各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。