一种变异测试方法、装置、设备及存储介质与流程

文档序号:24527673发布日期:2021-04-02 10:05阅读:74来源:国知局
一种变异测试方法、装置、设备及存储介质与流程
本发明涉及测试管理
技术领域
,尤其涉及一种变异测试方法、装置、设备及存储介质。
背景技术
:软件测试的一个根本问题是如何通过较少的测试用例尽可能地检测出软件中潜藏的各种故障。软件测试的实践表明,要想找到程序中潜藏的所有故障几乎是不可能的。较为可行的方法是尽可能的缩小故障的搜索范围,以便于专门测试某类故障是否存在,为此提出了基于故障的软件测试。变异测试是一种基于故障的软件测试技术,变异测试的基本思想是通过变异算子对待测试程序进行各种微小的变异,形成变异体,用来模仿某种故障。如果执行某个测试用例导致一个变异体与待测试程序产生相同的结果,那么称该变异体被杀死,即与该变异体相关的故障是能够被检测出来的。当待测程序越复杂,则意味着生成的变异体的数量越多,且待测程序的测试用例势必也会相应增多,这样针对每一处变异需要运行所有的测试用例,然后将所有的测试用例执行结果同源程序的执行结果比对,这一过程对性能耗费很大,申请人意识到,变异测试工具多数情况是用于单元测试用例的度量,难以用于集成测试和功能测试用例中,即使应用在集成测试和功能测试,也会造成极大的性能耗费。技术实现要素:为解决以上问题,本发明提供一种变异测试方法,包括:在待测程序的各个代码模块处分别进行插桩;对插桩后的待测程序依次执行所有的测试用例,获取测试用例执行过程中对应运行的代码模块的代号,将所述代号与所述测试用例的注解编号相关联,形成所述各个代码模块的代号与所述测试用例的注解编号间的关联表单;将所述待测程序、测试用例、代码模块的代号、测试用例的注解编号和关联表单分配给各客户端,向各客户端发送变异测试的指令,所述指令包括需要进行变异测试的代码模块的代号;各客户端根据接收到的所述代号以及所述关联表单,对所述代号所表示的代码模块依次执行与其关联的测试用例,并对所述代号所表示的代码模块的变异体依次执行与其关联的测试用例;接收各客户端的测试结果。可选地,在所述接收各客户端的测试结果后,还包括:将所述代码模块及其变异体执行所述测试用例的测试结果进行比对,确定各测试用例是否可消灭对应的变异体。可选地,在将所述待测程序、测试用例、代码模块的代号、测试用例的注解编号和关联表单分配给各客户端之前,与各客户端通过tcp通信协议建立连接。可选地,所述与各客户端通过tcp通信协议建立连接是指与各客户端达到三次握手成功。可选地,所述与各客户端通过tcp通信协议建立连接,包括:将各客户端的套接字加入到监听队列,各客户端的所述套接字绑定有客户端的本地地址和端口;接收各客户端的连接请求,与各客户端建立连接。可选地,将所述待测程序、测试用例、代码模块的代号、测试用例的注解编号和关联表单分配给各客户端,包括:在与客户端建立连接后,通过套接字向各客户端发送所述待测程序、测试用例、代码模块的代号、测试用例和关联表单。可选地,所述变异体包括语句变异体,判定变异体、变量/常量值的变异体。本发明还提供一种变异测试装置,所述装置包括:插桩模块,在待测程序的各个代码模块处分别进行插桩;关联建立模块,对插桩后的待测程序依次执行所有的测试用例,通过插桩获取测试用例执行过程中对应运行的代码模块的代号,将所述代号与所述测试用例的注解编号相关联;测试执行模块,将待测程序、测试用例、代码模块的代号、测试用例的注解编号和关联表单分配给各客户端,向各客户端发送变异测试的指令,接收各客户端的测试结果。本发明还公开一种电子设备,所述电子设备包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如上所述的变异测试方法。本发明还公开一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的变异测试方法。本发明通过在待测程序的各代码模块中分别插桩,通过插桩获取测试用例运行过程中对应运行的代码模块的代号,将所述代号与测试用例的注解编号对应形成关联表单,从而可以通过调用代码模块的代号以及对应的测试用例的注解编号,来对各代码模块执行对应的测试用例的变异体,分别得出各测试用例是否可消灭对应的变异体结论。由于各代码模块仅在与其相关联的测试用例下运行,从而减少了测试用例的总使用次数,从源头上降低了整个变异测试的工作量。并且,还通过分布式部署,可以通过向多个客户端分别发送测试用例的注解编号以及代码模块的代号,同时在多个客户端进行测试,进一步提高了测试效率,减少了对单台设备的性能耗费。附图说明通过结合下面附图对其实施例进行描述,本发明的上述特征和技术优点将会变得更加清楚和容易理解。图1为本发明提供的变异测试方法一实施例的流程示意图;图2为本发明提供的变异测试方法一实施例的模块示意图;图3为本发明提供的实现变异测试方法的电子设备一实施例的结构示意图;图4是本发明提供的待测程序与代码模块的关系示意图。具体实施方式应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。本发明提供一种变异测试方法,用于对待测程序的变异体进行快速测试,以提高测试效率。参照图1所示,为本发明一实施例提供的变异测试方法的流程示意图。该方法可以由一个装置执行,该装置可以由软件和/或硬件实现。在本实施例中,变异测试方法包括:步骤s1、在待测程序的各个代码模块处分别进行插桩。插桩是指在保证待测程序原有逻辑完整性的基础上在程序中插入一些探针,所述探针就是一种收集方法,是进行信息采集的代码段,可以是赋值语句或采集覆盖信息的函数调用。通过探针的执行并抛出程序运行的特征数据,从而可以获取到程序运行的特征数据。对待测程序进行插桩可以是在源代码中插桩,也可以是在编译后的可执行文件中插桩。下面以待测程序是java代码为例进行说明,java代码中每个类编译后都有单独的.class字节码文件,所述字节码文件是一种包含执行程序,由一序列op代码/数据对组成的二进制文件。所述字节码文件里包含了类、属性以及方法和指令等数据。优选地,可以使用用于字节码插桩的asm框架(asm框架可以用来操作.class字节码文件)来实现向类的程序代码中添加插桩代码,具体地,可以在asm框架中添加收集方法,所述收集方法是进行信息采集的代码段。在jvm(虚拟机)参数里指定javaagent参数来实现插桩代码的加载运行。jvm在执行一个类的代码后会通过javaagent参数自动回调asm框架中的收集方法,并将收集的数据输出到文件a中。步骤s2、对插桩后的待测程序依次执行所有的测试用例,通过插桩获取测试用例执行过程中对应运行的代码模块的代号,将所述代号与所述测试用例的注解编号相关联,并且可以获得关联表单。所述测试用例为测试代码,可以是单元测试代码,也可以是集成测试代码。测试代码里可以通过注解来标记测试用例的编号。例如一段测试代码可以用注解tc001来标记,并通过调用该注解tc001来执行该测试用例。具体说,测试用例所对应的代码模块是指某个测试用例在执行时,整个待测程序的代码中运行的那部分代码。通过解析上述的文件a,可以获取类对应的包名,然后将包名(也就是代码模块代号)和测试代码的注解编号对应的输出到文件b中。通过插桩可以确定出待测程序的代码中各个代码模块所关联的测试用例。所述关联的测试用例是指,在执行变异测试时,只有与该代码模块关联的测试用例才会在该代码模块中运行,其它无关联的测试用例即使在该代码模块中进行测试,也不会在该代码模块中运行,也即无需对无关联的测试用例进行变异测试。输出的所述关联表单如下:表1:代码模块代号注解编号atc001,tc003,tc004btc001,tc002,tc005ctc003,tc005,tc006步骤s3、采用分布式部署的方式,将待测程序、所有测试用例、待测程序中各个代码模块的代号、测试用例的注解编号和上述关联表单分配给各客户端,向各客户端发送变异测试的指令,所述指令包括需要进行变异测试的代码模块的代号。步骤s4、各客户端根据接收到的所述代号以及所述关联表单,对所述代号所表示的代码模块依次执行与其关联的测试用例,并对所述代号所表示的代码模块的变异体依次执行与其关联的测试用例。具体说,各客户端在接收到代码模块的代号后,首先在上述关联表单中找到该代码模块所对应的测试用例,然后将对应的测试用例在该代码模块上执行,并记录测试结果;之后客户端使用变异算子对所述待测程序生成变异体,针对变异后的各个代码模块分别执行对应的测试用例,并记录测试结果。变异后的各个代码模块与测试用例之间的关联关系与变异之前相同。上述变异包括语句变异体,判定变异体、变量/常量值的变异,分别生成语句变异体,判定变异体、变量/常量值的变异体。结合步骤s3和步骤s4,也就是说,服务器端可以连接多个客户端,从而可以在多个客户端同时执行多个测试用例。例如,在一个客户端执行代码模块a的tc001、tc003、tc004三个测试用例,在另一个客户端执行代码模块b的tc001、tc002、tc005三个测试用例。从而可以实现在多个客户端同时执行多个代码模块对应的测试用例,提高测试效率。步骤s5、接收各客户端的测试结果。如图2、图4、表1所示,待测程序共有a、b、c三个代码模块,共同构成了一个待测程序200。针对其进行变异测试的测试用例共有6例,分别是tc001、tc002、tc003、tc004、tc005、tc006。在通常的测试中,是对于整个待测程序的所有代码模块都执行tc001至tc006的所有测试用例。而在执行过程中,实际上,代码模块a对于测试用例tc002、tc005、tc006并不会运行,同样的,代码模块b和代码模块c也是对于一些测试用例不会运行的,这显然是耗费了时间和性能。而通过获得的代码模块与测试用例的关联表单,则可以对代码模块a/b/c分别进行变异测试,且仅需执行与其相关联的测试用例即可,例如对代码模块a进行变异测试,仅需执行测试用例tc001,tc003,tc004,降低变异测试的工作量。并且,同时还可以对模块b、模块c进行变异测试。需要注意的是,变异体是仅针对代码句法层面引入小改动,不会改变测试用例与代码之间的关联关系。测试用例与代码的关联最小颗粒度是函数或方法层面,而变异体仅是某行代码的句法小改动,所以无影响。进一步地,在接收各客户端的测试结果后,将所述代码模块及其变异体执行所述测试用例的测试结果进行比对,确定各测试用例是否可消灭对应的变异体。如果执行某个测试用例时,一个待测程序的变异体与该待测试程序产生相同的结果,那么称该变异体被杀死,即该测试用例可消灭对应的变异体。例如,一个客户端agent1接收到命令对代码模块a进行变异测试,需要执行表1中的三个测试用例tc001、tc003、tc004。首先对代码模块a的源代码执行该三个测试用例,记录测试结果,形成变异前的测试结果文件file1。然后对代码模块a的代码利用变异算子进行语句变异,生成变异体,例如java程序代码一般以类作为模块单位,则上述的模块代号就可以是类的包名,发送包名以及与其对应的测试用例的注解编号,客户端即可仅针对对应的包名生成变异体,并执行该三个测试用例,得到变异后的测试结果file2。然后比对相同测试用例的测试结果是否相同(测试用例测试结果只有通过或失败两种),变异后的测试和变异前的测试结果相同的则标记消灭,即表示该变异体为可消灭变异体。不相同的标记存活,即表示该变异体为可存活变异体。同样地,客户端agent2接收到执行命令对代码模块b进行测试,其也得到代码模块b的代码变异前和变异后的测试结果并回传服务器端。同样地,客户端agent3接收到执行命令对代码模块c进行测试,其也得到代码模块b的代码变异前和变异后的测试结果并回传服务器端。在完成所有的变异体测试后,通过汇总比对生成测试报告。在该举例中测试结果的既可以是由客户端完成,也可以是将测试结果发送至服务器端,由服务器端完成比对。进一步地,在将所述待测程序、测试用例、代码模块的代号、测试用例的注解编号和关联表单分配给各客户端之前,与各客户端通过tcp通信协议建立连接。在与客户端建立连接后,通过套接字向各客户端发送所述代号和所述注解编号。所述与各客户端通过tcp通信协议建立连接是指与各客户端达到三次握手成功。三次握手成功后方可发送数据,如果发现tcp连接失败则无法发送数据,即为发送异常,如果发送异常可重新发送,三次发送失败则可以更换客户端继续进行。所述与各客户端通过tcp通信协议建立连接,包括:服务器端和客户端均创建有套接字,服务器端可以通过套接字分发指令给客户端,将各客户端的套接字加入到监听队列,等待接收客户端数据,各客户端的套接字绑定有客户端的本地地址和端口;接收各客户端的连接请求,与各客户端建立连接。更具体地,是接收客户端的请求,并回复确认指令给客户端,客户端再向服务器端进行确认,从而完成三次握手,即可建立连接。上述的更换客户端是指:发送异常后,服务器端更换客户端套接字,换一个客户端继续通过套接字发送该指令。此处所述的指令包含待测程序源代码中的某一代码模块的代号以及对应的测试用例的注解编号。而上述待测程序和所有测试用例,可以通过上述服务端发送给各客户端,也可以直接在各客户端上进行部署。通过以上操作,可以在集成以及功能测试时,通过调用代码模块的代号以及对应的测试用例的注解编号,使得各代码模块分别在对应的测试用例下运行,在对应记录其运行结果后,比较代码变异前后的运行结果,可以分别得出集成和功能测试时,其中各测试用例是否可消灭对应的变异体。如图4所示,待测程序200中包括代码模块a、b、c,在服务器端执行集成测试时,通过服务器端将代码模块的代号和对应的测试用例的注解编号发送给多个客户端,可以使得各客户端分别执行对应的测试用例来对对应的代码模块进行测试,从而可以大大的减轻性能消耗。如图2所示,是本发明变异测试装置一实施例的功能模块示意图。本发明的变异测试装置100可以安装于电子设备中。根据实现的功能,所述变异测试装置100可以包括插桩模块101、关联建立模块102、测试执行模块103。本发明所述模块是指一种能够被电子设备处理器所执行,并且能够完成固定功能的一系列计算机程序段,其存储在电子设备的存储器中。在本实施例中,关于各模块的功能如下:其中,插桩模块101,用于在待测程序的各个代码模块处分别进行插桩。插桩是在保证待测程序原有逻辑完整性的基础上在程序中插入一些探针,所述探针就是一种收集方法,是进行信息采集的代码段,可以是赋值语句或采集覆盖信息的函数调用。通过探针的执行并抛出程序运行的特征数据,从而可以获取到程序运行的特征数据。对待测程序进行插桩可以是在源代码中插桩,也可以是在编译后的可执行文件中插桩。下面以待测程序是java代码为例进行说明,java代码中每个类编译后都有单独的.class字节码文件,所述字节码文件是一种包含执行程序,由一序列op代码/数据对组成的二进制文件。所述字节码文件里包含了类、属性以及方法和指令等数据。优选地,可以使用用于字节码插桩的asm框架(asm框架可以用来操作.class字节码文件)来实现向类的程序代码中添加插桩代码,具体地,可以在asm框架中添加收集方法,在jvm(虚拟机)参数里指定javaagent参数来实现插桩代码的加载运行。jvm在执行一个类的代码后会通过javaagent参数自动回调asm框架中的收集方法,并将收集的数据输出到文件a中。关联建立模块102,用于用于对插桩后的待测程序依次执行所有的测试用例,通过插桩获取测试用例执行过程中对应运行的代码模块的代号,将所述代号与所述测试用例的注解编号相关联。所述测试用例为测试代码,可以是单元测试代码,也可以是集成测试代码。测试代码里可以通过注解来标记测试用例的编号。例如一段测试代码可以用注解tc001来标记,并通过调用该注解tc001来执行该测试用例。具体说,测试用例所对应的代码模块是指某个测试用例在执行时,整个待测程序的代码中运行的那部分代码。通过解析上述的文件a,可以获取类对应的包名,然后将包名(也就是代码模块代号)和测试代码的注解编号对应的输出到文件b中。通过插桩可以确定出待测程序的代码中各个代码模块所关联的测试用例。所述关联的测试用例是指,在执行变异测试时,只有与该代码模块关联的测试用例才会在该代码模块中运行,其它无关联的测试用例即使在该代码模块中进行测试,也不会在该代码模块中运行,也即无需对无关联的测试用例进行变异测试。输出的所述关联表单如表1所示。测试执行模块103,用于将待测程序、测试用例、代码模块的代号、测试用例的注解编号和关联表单分配给各客户端,向各客户端发送变异测试的指令,接收各客户端的测试结果。也就是说,服务器端可以连接多个客户端,从而可以在多个客户端同时执行多个测试用例。例如,在一个客户端执行代码模块a的tc001,tc003,tc004测试用例,在另一个客户端执行代码模块b的tc001,tc002,tc005。从而可以在多个客户端同时执行多个代码模块对应的测试用例,提高测试效率。客户端根据所获得的注解编号以及代号对相应的代码模块执行对应的测试用例,并记录测试结果。客户端使用变异算子对所述待测程序生成变异体,针对变异后的各个代码模块分别执行对应的测试用例,并记录测试结果。如图2、表1所示,待测程序共有a、b、c三个代码模块,共同构成了一个待测程序200。针对其进行变异测试的测试用例共有6例,分别是tc001,tc002,tc003,tc004,tc005,tc006。在通常的测试中,是对于整个待测程序的所有代码模块都执行tc001至tc006的所有测试用例。而在执行过程中,实际上,代码模块a对于测试用例tc002、tc005、tc006并不会运行,同样的,代码模块b和代码模块c也是对于一些测试用例不会运行的,这显然是耗费了时间和性能。而通过获得的代码模块与测试用例的关联表单,则可以对代码模块a/b/c分别进行变异测试,且仅需执行与其相关联的测试用例即可,例如对代码模块a进行变异测试,仅需执行测试用例tc001,tc003,tc004,降低变异测试的工作量。并且,同时还可以对模块b、模块c进行变异测试。如图3所示,是本发明实现变异测试方法的电子设备一实施例的结构示意图。所述电子设备1可以包括处理器10、存储器11和总线,还可以包括存储在所述存储器11中并可在所述处理器10上运行的计算机程序,如变异测试程序12。其中,所述存储器11至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、移动硬盘、多媒体卡、卡型存储器(例如:sd或dx存储器等)、磁性存储器、磁盘、光盘等。所述存储器11在一些实施例中可以是电子设备1的内部存储单元,例如该电子设备1的移动硬盘。所述存储器11在另一些实施例中也可以是电子设备1的外部存储设备,例如电子设备1上配备的插接式移动硬盘、智能存储卡(smartmediacard,smc)、安全数字(securedigital,sd)卡、闪存卡(flashcard)等。进一步地,所述存储器11还可以既包括电子设备1的内部存储单元也包括外部存储设备。所述存储器11不仅可以用于存储安装于电子设备1的应用软件及各类数据,例如变异测试程序的代码等,还可以用于暂时地存储已经输出或者将要输出的数据。所述处理器10在一些实施例中可以由集成电路组成,例如可以由单个封装的集成电路所组成,也可以是由多个相同功能或不同功能封装的集成电路所组成,包括一个或者多个中央处理器(centralprocessingunit,cpu)、微处理器、数字处理芯片、图形处理器及各种控制芯片的组合等。所述处理器10是所述电子设备的控制核心(controlunit),利用各种接口和线路连接整个电子设备的各个部件,通过运行或执行存储在所述存储器11内的程序或者模块(例如变异测试程序等),以及调用存储在所述存储器11内的数据,以执行电子设备1的各种功能和处理数据。所述总线可以是外设部件互连标准(peripheralcomponentinterconnect,简称pci)总线或扩展工业标准结构(extendedindustrystandardarchitecture,简称eisa)总线等。该总线可以分为地址总线、数据总线、控制总线等。所述总线被设置为实现所述存储器11以及至少一个处理器10等之间的连接通信。图3仅示出了具有部件的电子设备,本领域技术人员可以理解的是,图3示出的结构并不构成对所述电子设备1的限定,可以包括比图示更少或者更多的部件,或者组合某些部件,或者不同的部件布置。例如,尽管未示出,所述电子设备1还可以包括给各个部件供电的电源(比如电池),可选的,电源可以通过电源管理装置与所述至少一个处理器10逻辑相连,从而通过电源管理装置实现充电管理、放电管理、以及功耗管理等功能。电源还可以包括一个或一个以上的直流或交流电源、再充电装置、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。所述电子设备1还可以包括多种传感器、蓝牙模块、wi-fi模块等,在此不再赘述。进一步地,所述电子设备1还可以包括网络接口,可选地,所述网络接口可以包括有线接口和/或无线接口(如wi-fi接口、蓝牙接口等),通常用于在该电子设备1与其他电子设备之间建立通信连接。可选地,该电子设备1还可以包括用户接口,用户接口可以是显示器(display)、输入单元(比如键盘(keyboard)),可选地,用户接口还可以是标准的有线接口、无线接口。可选地,在一些实施例中,显示器可以是led显示器、液晶显示器、触控式液晶显示器以及oled(organiclight-emittingdiode,有机发光二极管)触摸器等。其中,显示器也可以适当的称为显示屏或显示单元,用于显示在电子设备1中处理的信息以及用于显示可视化的用户界面。应该了解,所述实施例仅为说明之用,在专利申请范围上并不受此结构的限制。所述电子设备1中的所述存储器11存储的变异测试程序12是多个指令的组合,在所述处理器10中运行时,可以实现:s1、在待测程序的各个代码模块处分别进行插桩;s2、对插桩后的待测程序依次执行所有的测试用例,获取测试用例执行过程中对应运行的代码模块的代号,将所述代号与所述测试用例的注解编号相关联,形成所述各个代码模块的代号与所述测试用例的注解编号间的关联表单;s3、将所述待测程序、测试用例、代码模块的代号、测试用例的注解编号和关联表单分配给各客户端,向各客户端发送变异测试的指令,所述指令包括需要进行变异测试的代码模块的代号;s4、各客户端根据接收到的所述代号以及所述关联表单,对所述代号所表示的代码模块依次执行与其关联的测试用例,然后对所述代号所表示的代码模块的变异体依次执行与其关联的测试用例;s5、接收各客户端的测试结果。具体的运行流程如图1所示的变异测试方法流程类型,具体可参见图1的变异测试方法的描述,此处不再赘述。进一步地,所述电子设备1集成的模块如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)。在本发明所提供的几个实施例中,应该理解到,所揭露的设备、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,在本发明各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能模块的形式实现。对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附关联图标记视为限制所涉及的权利要求。最后应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1