测试案例生成方法及装置
文献发布时间:2023-06-19 11:57:35
技术领域
本发明涉及测试案例技术领域,尤指一种测试案例生成方法及装置。
背景技术
传统的测试案例主要由输入、函数调用、输出与预期值比较三个部分构成,是对于程序的真实调用。而对于使用Mockito框架的项目,通常会Mock外应用服务,并通过记录、重放来排除服务间的依赖,是服务函数的模拟调用。
目前两种测试案例各有利弊。传统测试案例优势在于代码简单且为真实调用,而缺点是比较依赖外部环境,难以维护,且不灵活,不符合单元测试的思想。而使用Mockito的测试案例,虽然不依赖环境,比较容易维护,但是在编写阶段需要模拟各函数调用的输入输出,同样需要花费大量的时间成本。
而随着科技产品的不断更新,项目的研发周期不断缩短,缺陷密度也随之增大,高质量的测试脚本必不可少。但是,编写、维护测试案例也会必然会提升开发人员、测试人员的工作量,影响开发效率,而且由于编写代码人员水平参差不齐,测试案例的质量可能达不到要求,没有真正起到守护核心代码的作用。
发明内容
针对现有技术中存在的问题,本发明实施例的主要目的在于提供一种测试案例生成方法及装置,实现生成高质量的测试案例,解决人为手工编写测试案例的高成本、低效率,难以维护的问题。
为了实现上述目的,本发明实施例提供一种测试案例生成方法,所述方法包括:
根据待生成测试案例的程序,获取所述程序的调用链路中多个程序函数,并在所述程序函数中放入预设的出入口函数;
利用加入出入口函数的各程序函数,运行预设测试数据,并通过所述出入口函数采集各程序函数的调用信息;
根据各程序函数的调用信息,生成所述程序的测试案例。
可选的,在本发明一实施例中,所述根据待生成测试案例的程序,获取所述程序的调用链路中多个程序函数包括:
对待生成测试案例的程序进行测试类扫描,并利用反射机制,获取测试类对应的字节码对象;
根据反射机制,获取所述字节码对象对应的多个程序函数,并对所述程序函数进行加标签处理。
可选的,在本发明一实施例中,所述方法还包括:
对所述出入口函数采集到的各程序函数的调用信息进行反编译,得到字节码信息;
根据所述字节码信息,得到各程序函数对应的输入信息及输出信息。
可选的,在本发明一实施例中,所述根据各程序函数的调用信息,生成所述程序的测试案例包括:根据各程序函数对应的输入信息及输出信息,生成所述程序的测试案例。
本发明实施例还提供一种测试案例生成装置,所述装置包括:
出入口函数模块,用于根据待生成测试案例的程序,获取所述程序的调用链路中多个程序函数,并在所述程序函数中放入预设的出入口函数;
调用信息模块,用于利用加入出入口函数的各程序函数,运行预设测试数据,并通过所述出入口函数采集各程序函数的调用信息;
测试案例模块,用于根据各程序函数的调用信息,生成所述程序的测试案例。
可选的,在本发明一实施例中,所述出入口函数模块包括:
字节码对象单元,用于对待生成测试案例的程序进行测试类扫描,并利用反射机制,获取测试类对应的字节码对象;
程序函数单元,用于根据反射机制,获取所述字节码对象对应的多个程序函数,并对所述程序函数进行加标签处理。
可选的,在本发明一实施例中,所述装置还包括:
字节码信息模块,用于对所述出入口函数采集到的各程序函数的调用信息进行反编译,得到字节码信息;
输入输出信息模块,用于根据所述字节码信息,得到各程序函数对应的输入信息及输出信息。
可选的,在本发明一实施例中,所述测试案例模块还用于根据各程序函数对应的输入信息及输出信息,生成所述程序的测试案例。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法。
本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述方法的计算机程序。
本发明通过对程序调用链设置出入口函数,录制调用信息,从而生成高质量的测试案例,解决了人为手工编写测试案例的高成本、低效率,难以维护的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例一种测试案例生成方法的流程图;
图2为本发明实施例中获取程序函数的流程图;
图3为本发明实施例中插入出入口函数的示意图;
图4为本发明一具体实施例中测试案例生成方法的流程图;
图5为本发明实施例中出入口函数的结构示意图;
图6为本发明实施例一种测试案例生成装置的结构示意图;
图7为本发明实施例中出入口函数模块的结构示意图;
图8为本发明一具体实施例中测试案例生成装置的结构示意图;
图9为本发明一实施例所提供的电子设备的结构示意图。
具体实施方式
本发明实施例提供一种测试案例生成方法及装置,可用于金融领域或其他领域,需要说明的是,本发明的测试案例生成方法及装置可用于金融领域,也可用于除金融领域之外的任意领域,本发明的测试案例生成方法及装置应用领域不做限定。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示为本发明实施例一种测试案例生成方法的流程图,本发明实施例提供的测试案例生成方法的执行主体包括但不限于计算机。图中所示方法包括:
步骤S1,根据待生成测试案例的程序,获取所述程序的调用链路中多个程序函数,并在所述程序函数中放入预设的出入口函数。
其中,扫描待生成测试案例的程序,获取该程序调用链路的所有程序函数。具体的,对待生成测试案例的程序进行测试类扫描,并利用反射机制,获取测试类对应的字节码对象。具体的,从spring容器中获取所有注入的Java bean对象。其中,Java bean是一种Java语言的可重用组件,具有各自属性和函数。而Spring容器则是一个Java bean工厂,负责bean类的实例化、获取与销毁,是Spring框架的核心。
进一步的,根据Java反射机制,获取字节码对象对应的多个程序函数,并对程序函数进行加标签处理。具体的,通过Java反射机制获取该测试类的所有字节码对象,并检查判断对象是否在spring容器中。如果是,则通过反射机制去获取该字节码对象的所有程序函数,并加上标签。
进一步的,对于加上标签的程序,可以看作一个切面,将预设的出入口函数,也(即探针)放入切面中。
步骤S2,利用加入出入口函数的各程序函数,运行预设测试数据,并通过所述出入口函数采集各程序函数的调用信息。
其中,利用加入出入口函数的各程序函数,运行预设的测试数据,通过探针,即出入口函数采集程序函数的调用信息。
进一步的,探针为无侵入的采集器(埋点),用于通过在程序函数调用前后加入探针,获取函数实际调用的输入输出等信息。
进一步的,出入口函数还用于以数组的方式存储调用信息,程序函数调用结束后,将调用信息存储至数据库。对调用信息进行反编译,得到字节码信息,从字节码信息中提取出输入信息及输出信息,并将输出信息及输入信息转换为JSON格式。
步骤S3,根据各程序函数的调用信息,生成所述程序的测试案例。
其中,将通过出入口函数获取到的输入信息及输出信息,转换为测试案例,具体的,测试案例为Mockito测试案例。具体的,样例如表1所示。
表1
进一步的,Mockito是一个基于bytebuddy(即Java应用程序运行时创建和修改Java类),生成代理类的框架,主要通过Stub打桩,通过函数名加参数来准确的定位测试桩然后返回预期的值。
进一步的,Mockito测试案例即所有函数都会Mock掉,并记录每个函数调用前后的输入输出值,相当于一次程序运行的完整重放,优势主要在于测试案例不依赖外部数据、环境条件的再现性。
作为本发明的一个实施例,如图2所示,根据待生成测试案例的程序,获取所述程序的调用链路中多个程序函数包括:
步骤S21,对待生成测试案例的程序进行测试类扫描,并利用反射机制,获取测试类对应的字节码对象;
步骤S22,根据反射机制,获取所述字节码对象对应的多个程序函数,并对所述程序函数进行加标签处理。
其中,扫描待生成测试案例的程序,获取该程序调用链路的所有程序函数。具体的,对待生成测试案例的程序进行测试类扫描,并利用反射机制,获取测试类对应的字节码对象。具体的,从spring容器中获取所有注入的Java bean对象。其中,Java bean是一种Java语言的可重用组件,具有各自属性和函数。而Spring容器则是一个Java bean工厂,负责bean类的实例化、获取与销毁,是Spring框架的核心。
进一步的,根据Java反射机制,获取字节码对象对应的多个程序函数,并对程序函数进行加标签处理。具体的,通过Java反射机制获取该测试类的所有字节码对象,并检查判断对象是否在spring容器中。如果是,则通过反射机制去获取该字节码对象的所有程序函数,并加上标签。
进一步的,对于加上标签的程序,可以看作一个切面,将预设的出入口函数,也(即探针)放入切面中。
在本实施例中,对于加上标签的函数,可以看作一个切面,将预设的出入口函数,也即是探针,放入切面中,如图3所示。并且,在测试案例启动时使用javaagent,就可以将在类加载时,对字节码进行替换,完成埋点的植入。
其中,图3中,traceID为服务调用时产生全局唯一的链路id。通过traceID可以将一个请求在各个服务器上的调用日志串联起来。spanID为本次调用在整个调用链树中的位置。onMethodEnter()为函数进入时调用,主要获取函数的传入参数。Bytebuddy提供一系列注解,带有@Advice.OnMethodExit的静态函数,可以被植入函数开始的节点。OnMethodExit()为函数结束时调用,原理类似onMethodEnter,可以获取函数的返回值。
其中,javaagent也称Java代理,是运行在主函数之前的拦截器。利用其支持入口函数参数输出的功能,跟踪获取入参以及出参信息。
作为本发明的一个实施例,如图4所示,所述方法还包括:
步骤S41,对所述出入口函数采集到的各程序函数的调用信息进行反编译,得到字节码信息;
步骤S42,根据所述字节码信息,得到各程序函数对应的输入信息及输出信息。
其中,利用加入出入口函数的各程序函数,运行预设的测试数据,通过探针,即出入口函数采集程序函数的调用信息。
进一步的,探针为无侵入的采集器(埋点),用于通过在程序函数调用前后加入探针,获取函数实际调用的输入输出等信息。
进一步的,出入口函数还用于以数组的方式存储调用信息,程序函数调用结束后,将调用信息存储至数据库。对调用信息进行反编译,得到字节码信息,从字节码信息中提取出输入信息及输出信息,并将输出信息及输入信息转换为JSON格式。
具体的,预运行预设的测试数据,通过探针采集函数调用信息,探针主要分为采集器(Instrument)、发送器(TransPort)、收集器(Collector)、转换器(Translator)四个部分,相互关系如图5所示,其中,Zipkin为一种开源的分布式实时数据追踪系统,主要功能是聚集来自各个异构系统的实时监控数据。
采集器:即Mock函数(切面)前后注入的onMethodEnter()与OnMethodExit()函数,主要作用是获取调用链中各函数的调用信息,并整合到JavaAgent中。
发送器:以数组的方式存储调用信息,函数调用结束后,将数据发送到收集器进行后续的处理
收集器:对接收的数据库进行处理,反编译字节码信息,提取出输入、输出信息。
转换器:将获取的出入参信息转换为JSON格式。
在本实施例中,根据各程序函数的调用信息,生成所述程序的测试案例包括:根据各程序函数对应的输入信息及输出信息,生成所述程序的测试案例。
其中,将通过出入口函数获取到的输入信息及输出信息,转换为测试案例,具体的,测试案例为Mockito测试案例。
本发明基于探针技术,拦截函数的输入输出信息,从而转换为Mockito测试案例,使测试代码库编码质量、效率均能大大提高。本发明通过扫描编译后的测试类字节码文件,获取bean类的函数,然后链式执行预设的埋点逻辑,进而加载修改后的测试类。预运行测试数据,通过javaagent获取调用链中各个程序函数的输入与输出。对获取到的数据进行格式化转换,生成Mockito测试案例。
本发明通过对程序调用链设置出入口函数,录制调用信息,从而生成高质量的测试案例,解决了人为手工编写测试案例的高成本、低效率,难以维护的问题。
如图6所示为本发明实施例一种测试案例生成装置的结构示意图,图中所示装置包括:
出入口函数模块10,用于根据待生成测试案例的程序,获取所述程序的调用链路中多个程序函数,并在所述程序函数中放入预设的出入口函数。
其中,扫描待生成测试案例的程序,获取该程序调用链路的所有程序函数。具体的,对待生成测试案例的程序进行测试类扫描,并利用反射机制,获取测试类对应的字节码对象。具体的,从spring容器中获取所有注入的Java bean对象。其中,Java bean是一种Java语言的可重用组件,具有各自属性和函数。而Spring容器则是一个Java bean工厂,负责bean类的实例化、获取与销毁,是Spring框架的核心。
进一步的,根据Java反射机制,获取字节码对象对应的多个程序函数,并对程序函数进行加标签处理。具体的,通过Java反射机制获取该测试类的所有字节码对象,并检查判断对象是否在spring容器中。如果是,则通过反射机制去获取该字节码对象的所有程序函数,并加上标签。
进一步的,对于加上标签的程序,可以看作一个切面,将预设的出入口函数,也(即探针)放入切面中。
调用信息模块20,用于利用加入出入口函数的各程序函数,运行预设测试数据,并通过所述出入口函数采集各程序函数的调用信息。
其中,利用加入出入口函数的各程序函数,运行预设的测试数据,通过探针,即出入口函数采集程序函数的调用信息。
进一步的,探针为无侵入的采集器(埋点),用于通过在程序函数调用前后加入探针,获取函数实际调用的输入输出等信息。
进一步的,出入口函数还用于以数组的方式存储调用信息,程序函数调用结束后,将调用信息存储至数据库。对调用信息进行反编译,得到字节码信息,从字节码信息中提取出输入信息及输出信息,并将输出信息及输入信息转换为JSON格式。
测试案例模块30,用于根据各程序函数的调用信息,生成所述程序的测试案例。
其中,将通过出入口函数获取到的输入信息及输出信息,转换为测试案例,具体的,测试案例为Mockito测试案例。
进一步的,Mockito是一个基于bytebuddy(即Java应用程序运行时创建和修改Java类),生成代理类的框架,主要通过Stub打桩,通过函数名加参数来准确的定位测试桩然后返回预期的值。
进一步的,Mockito测试案例即所有函数都会Mock掉,并记录每个函数调用前后的输入输出值,相当于一次程序运行的完整重放,优势主要在于测试案例不依赖外部数据、环境条件的再现性。
作为本发明的一个实施例,如图7所示,所述出入口函数模块10包括:
字节码对象单元11,用于对待生成测试案例的程序进行测试类扫描,并利用反射机制,获取测试类对应的字节码对象;
程序函数单元12,用于根据反射机制,获取所述字节码对象对应的多个程序函数,并对所述程序函数进行加标签处理。
作为本发明的一个实施例,如图8所示,所述装置还包括:
字节码信息模块40,用于对所述出入口函数采集到的各程序函数的调用信息进行反编译,得到字节码信息;
输入输出信息模块50,用于根据所述字节码信息,得到各程序函数对应的输入信息及输出信息。
在本实施例中,所述测试案例模块还用于根据各程序函数对应的输入信息及输出信息,生成所述程序的测试案例。
基于与上述一种测试案例生成方法相同的申请构思,本发明还提供了上述一种测试案例生成装置。由于该一种测试案例生成装置解决问题的原理与一种测试案例生成方法相似,因此该一种测试案例生成装置的实施可以参见一种测试案例生成方法的实施,重复之处不再赘述。
本发明通过对程序调用链设置出入口函数,录制调用信息,从而生成高质量的测试案例,解决了人为手工编写测试案例的高成本、低效率,难以维护的问题。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法。
本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述方法的计算机程序。
如图9所示,该电子设备600还可以包括:通信模块110、输入单元120、音频处理单元130、显示器160、电源170。值得注意的是,电子设备600也并不是必须要包括图9中所示的所有部件;此外,电子设备600还可以包括图9中没有示出的部件,可以参考现有技术。
如图9所示,中央处理器100有时也称为控制器或操作控件,可以包括微处理器或其他处理器装置和/或逻辑装置,该中央处理器100接收输入并控制电子设备600的各个部件的操作。
其中,存储器140,例如可以是缓存器、闪存、硬驱、可移动介质、易失性存储器、非易失性存储器或其它合适装置中的一种或更多种。可储存上述与失败有关的信息,此外还可存储执行有关信息的程序。并且中央处理器100可执行该存储器140存储的该程序,以实现信息存储或处理等。
输入单元120向中央处理器100提供输入。该输入单元120例如为按键或触摸输入装置。电源170用于向电子设备600提供电力。显示器160用于进行图像和文字等显示对象的显示。该显示器例如可为LCD显示器,但并不限于此。
该存储器140可以是固态存储器,例如,只读存储器(ROM)、随机存取存储器(RAM)、SIM卡等。还可以是这样的存储器,其即使在断电时也保存信息,可被选择性地擦除且设有更多数据,该存储器的示例有时被称为EPROM等。存储器140还可以是某种其它类型的装置。存储器140包括缓冲存储器141(有时被称为缓冲器)。存储器140可以包括应用/功能存储部142,该应用/功能存储部142用于存储应用程序和功能程序或用于通过中央处理器100执行电子设备600的操作的流程。
存储器140还可以包括数据存储部143,该数据存储部143用于存储数据,例如联系人、数字数据、图片、声音和/或任何其他由电子设备使用的数据。存储器140的驱动程序存储部144可以包括电子设备的用于通信功能和/或用于执行电子设备的其他功能(如消息传送应用、通讯录应用等)的各种驱动程序。
通信模块110即为经由天线111发送和接收信号的发送机/接收机110。通信模块(发送机/接收机)110耦合到中央处理器100,以提供输入信号和接收输出信号,这可以和常规移动通信终端的情况相同。
基于不同的通信技术,在同一电子设备中,可以设置有多个通信模块110,如蜂窝网络模块、蓝牙模块和/或无线局域网模块等。通信模块(发送机/接收机)110还经由音频处理器130耦合到扬声器131和麦克风132,以经由扬声器131提供音频输出,并接收来自麦克风132的音频输入,从而实现通常的电信功能。音频处理器130可以包括任何合适的缓冲器、解码器、放大器等。另外,音频处理器130还耦合到中央处理器100,从而使得可以通过麦克风132能够在本机上录音,且使得可以通过扬声器131来播放本机上存储的声音。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
本发明中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
- 测试案例生成方法、数据生成方法、装置、设备及介质
- 测试案例生成方法及装置