一种程序测试方法和装置
文献发布时间:2023-06-19 11:44:10
技术领域
本发明涉及计算机技术领域,特别涉及一种程序测试方法和装置。
背景技术
在需求开发过程中,经常会出现频繁的迭代需求,代码经常会修改,然后就需要测试人员对修改后的代码进行回归测试,来避免修改的代码会产生新的问题。
针对只进行功能优化或功能错误修改的场景,现有技术直接使用与修改程序之前相同的测试用例集进行回归测试。
在实现本申请的过程中,发明人发现每次修改程序后,使用所有测试用例进行回归测试,测试时间较长,导致测试效率低下。
发明内容
有鉴于此,本申请提供一种程序测试方法和装置,能够减少测试时间,提高测试效率。
为解决上述技术问题,本申请的技术方案是这样实现的:
在一个实施例中,提供了一种程序测试方法,所述方法包括:
获取第N次修改后的程序对应的漏测概率测试用例集M
根据第N+1次对程序修改的语句的类型,以及M
获取M
使用所述回归测试用例集对第N+1次修改后的程序进行测试。
在另一个实施例中,提供了一种程序测试装置,所述装置包括:第一获取单元、确定单元、第二获取单元和测试单元;
所述第一获取单元,用于获取第N次修改后的程序对应的漏测概率测试用例集M
所述确定单元,用于根据第N+1次对程序修改的语句的类型,以及所述第一获取单元获取的M
所述第二获取单元,用于获取所述确定单元确定的M
所述测试单元,用于使用所述第二获取单元获取的回归测试用例集对第N+1次修改后的程序进行测试。
在另一个实施例中,提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述程序测试方法的步骤。
在另一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现所述程序测试方法的步骤。
由上面的技术方案可见,上述实施例中获取修改后的程序的漏测概率测试用例集,获取其中漏测概率大于预设概率的测试用例组成回归测试用例集,并使用所述回归测试用例集测试修改后的程序。该方案能够减少测试时间,提高测试效率。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例中对测试用例集中的每个测试用例确定漏测概率的流程示意图;
图2为本申请实施例中程序测试流程示意图;
图3为本申请实施例中确定修改后的程序对应的漏测概率测试用例集的流程示意图;
图4为本申请实施例中程序测试装置结构示意图;
图5为本发明实施例提供的电子设备的实体结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其他步骤或单元。
下面以具体实施例对本发明的技术方案进行详细说明。下面几个具体实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
本申请实施例中提供一种程序测试方法,应用于对程序的功能优化或功能错误修改后进行回归测试的场景中,获取修改后的程序的漏测概率测试用例集,获取其中漏测概率大于预设概率的测试用例组成回归测试用例集,并使用所述回归测试用例集测试修改后的程序。该方案能够减少测试时间,提高测试效率。
本申请实施例中针对原始的,即未修改过的程序进行测试时,与现有实现一致,直接采用编写的测试用例集进行测试即可。
本申请实施例中新增加的内容是需要在进行对未修改过的程序进行测试,线上运行之后,需要修改程序,并对修改后的程序进行测试之前,生成未修改程序对应的漏测概率测试用例集M
获取针对未修改程序进行测试的测试用例集,对所述测试用例集中的每个测试用例估算出漏测概率,并组成未修改程序对应的漏测概率测试用例集M
测试用例的漏测概率,指执行这条测试用例后,没有发现缺陷,但是线上运行后,出现了缺陷的概率;针对每个测试用例如何获取其漏测概率的具体实现如下:
参见图1,图1为本申请实施例中对测试用例集中的每个测试用例确定漏测概率的流程示意图。具体步骤为:
步骤101,获取针对未修改程序进行测试的测试用例集。
步骤102,获取所述测试用例集中的每个测试用例对应的覆盖错误的语句的概率、错误的中间态发生的概率和输出错误结果的概率。
其中,所述覆盖错误的语句的概率为执行所述测试用例测试时,覆盖到对应的错误语句的概率。
本申请实施例中,获取所述覆盖错误的语句的概率,包括:
对程序进行静态扫描,获取错误的语句;
在执行每条测试用例过程中,采用插桩的方式记录执行到的语句和未执行到的语句;
确定所述测试用例执行到对应错误的语句的概率为所述测试用例覆盖错误的语句的概率。
其中,对程序进行静态扫描可以使用sonarQube对程序(代码)进行静态扫描;使用查看扫描出的错误程序,是否被执行到,如果覆盖了错误程序,确定执行对应错误语句在此次执行中被覆盖的概率为1,即所述测试用例的覆盖错误的语句的概率为1。
所述错误的中间态发生的概率为错误的语句在被执行后,产生错误的中间状态的概率。
本申请实施例中,获取所述错误的中间态发生的概率,包括:
获取针对所述测试用例设置的错误的中间态发生的概率。
执行一条测试用例,错误的语句被执行了,但是不一定会产生一个错误的中间态,即可能会产生一个错误的中间态,也可能不会产生,这个产生错误的中间态的概率可以根据统计实验数据得到,在一次系统上线后,反查运行的这条用例,从代码中查看是否产生了错误的中间态,来得到这个产生错误的中间态概率。或者对某些特定的场景采用经验估算,假设测试人员走读过开发的某一块代码的逻辑,在编写一条测试用例验证的时候,通过经验估算产生错误的中间态的概率是多少。
无论何种方式获得的该测试用例的错误的中间态发生的概率都会进行设置存储,在使用时直接获取设置的值即可。
所述输出错误结果的概率为错误语句被执行后产生错误的中间态,且所述错误的中间态被执行后输出结果是错误的概率。
本申请实施例中,获取所述输出错误结果的概率,包括:
当错误的中间态结果,作为计算性来使用时,将中间态结果的错误概率作为输出错误结果的概率;
如果中间态的结果变量出错,正好这个变量作为另外一个方法的入参,那么这个方法返回的结果一定是错误的。也就是说中间态错误的概率,与输出结果的概率密切相关,所以可以根据中间态结果的错误概率来近似约等于输出错误结果的概率,本申请实施例实现的时候将中间态结果的错误概率作为输出错误结果的概率。
当错误的中间态结果,作为控制流的一个控制分支使用时,使用所有分支表达式是否错误的概率的乘积,作为输出错误结果的概率。
控制流使用,是指中间态的结果,作为控制流的一个使用。
当错误的中间态结果的值,被用在分支语句条件表达式时,会导致程序执行路径错误。因此影响执行结果的因素是分支语句的表达式执行是否错误,所以可以用所有分支表达式是否错误的概率的乘积,作为出输出结果的错误性概率。
分支表达式是否错误的概率计算方式,先找到执行的所有的分支表达式,当系统上线后,反查某一条用例,来看这条用例执行了错误程序,并且是产生了错误的中间态,然后错误中间态的值,是否被分支语句表达式执行,估算出这个概率。
步骤103,确定所述测试用例的漏测概率为所述覆盖错误的语句的概率、错误的中间态发生的概率和输出错误结果的概率的乘积。
至此获得第0此修改后的程序,即未修改的程序对应的漏测概率测试用例集。
下面结合附图,详细说明对修改后的程序进行测试的过程。
参见图2,图2为本申请实施例中程序测试流程示意图。具体步骤:
步骤201,获取第N次修改后的程序对应的漏测概率测试用例集M
获取时可以在需要的时候进行确定直接使用,也可以预先估算好存储,在使用时直接获取存储的漏测概率测试用例集。
本实施例中的N为不小于0的整数,当N为0时,指第0次修改后的程序,即原始程序对应的漏测概率测试用例集。
当N为0时,获取针对未修改程序进行测试的测试用例集,对所述测试用例集中的每个测试用例估算出漏测概率,并组成未修改程序对应的漏测概率测试用例集;
当N为1时,根据第1次对程序修改的语句的类型,以及未修改程序对应的漏测概率测试用例集获取第1次修改后的程序对应的漏测概率测试用例集M
当N为大于1的整数时,根据第N-1次对程序修改的语句的类型,以及第N-1次修改后的程序对应的漏测概率测试用例集M
步骤202,根据第N+1次对程序修改的语句的类型,以及M
下面结合附图,详细说明根据修改前的程序对应的漏测概率测试用例集确定修改后的程序对应的漏测概率测试用例集。
语句类型包括:运算语句和流程控制语句;
其中,运算语句指java中,含有运算符号的语句,例如,算数运算符、赋值运算符、自增自减云算符、逻辑运算符、三元运算符。
流程控制语句,包含顺序结构、分支结构(if,switch)、循环结构(for,while,do…while)。
内存是否一致,若分别存储在栈内存和堆内存中,则确定存储在不同内存;如果都存储在栈内存,或都存储在堆内存中,则确定内存相同。
java虚拟机内存包括堆内存、栈内存,程序计数器,局部变量都存在栈内存中,new的对象存在堆内存中,程序计数器存放记录程序的字节码指令。
参见图3,图3为本申请实施例中确定修改后的程序对应的漏测概率测试用例集的流程示意图。具体步骤为:
步骤301,确定修改的语句的类型,以及中间结果的存储位置。
步骤302,当修改的语句为运算语句,且中间结果在同一内存中时,将M
修改的语句为运算语句,并且修改前和修改后,执行这个语句的中间结果在同一个内存中。这样就可以把修改前的程序对应的漏测用例集中的漏测概率近似等于修改后的测试用例对应的漏测概率。
举例如下:
修改的语句为x,它是一个运算语句,例如x=a+b,并且修改前后的程序在执行这个语句产生的中间结果,都存在同一个栈内存中,将M
步骤303,当修改的语句为运算语句,且中间结果不在同一内存中时,M
修改的语句为运算语句,并且修改前和修改后,执行这个语句的中间结果存储在不同内存中。这样就可以把1与修改前的程序对应的漏测用例集中的漏测概率的差值,作为修改后的测试用例对应的漏测概率。
具体如下:修改前的语句为运算语句x=a+b,把a+b的值存放到x中,修改后程序运算语句改为y=a×b,这个修改后的语句没有对x进行赋值,对y进行了赋值,执行到运算语句时变量x和y中存放的值都发生了变化。修改后的程序对应的每个测试用例的漏测概率为:1-修改前对应的漏测概率。
步骤304,当修改的语句的类型为流程控制语句时,将M
修改的语句为流程控制语句时,在修改前和修改后执行的路径可能会发生变化,但是一定程度上可以反应每条测试用例对修改后语句的具有测试有效性,直接将M
本步骤中,在确定M
步骤203,获取M
预设阈值的设置可以根据实际需要,或经验设置,如设置60%,本申请实施例中对此不进行限制。
将漏测概率不大于预设阈值的测试用例过滤掉,这样能减少部分测试用例。
步骤204,使用所述回归测试用例集对第N+1次修改后的程序进行测试。
本申请实施例中,通过评估每一条用例上线后出现漏测的概率,生成测试用例的漏测概率用例集。以及漏测概率测试用例集作为依据,来评估修改后的程序,执行每一条测试用例发生漏测的概率。通过以上两个关键点,选择出其中发生漏测率高的测试用例,生成新的回归用例集,从而缩减了回归测试用例集中测试用例的数量,使用本申请获取的回归用例集对修改后的程序进行测试,能够减少测试时间,提高测试效率。
基于同样的发明构思,本申请实施例中还提供一种程序测试装置。参见图4,图4为本申请实施例中程序测试装置结构示意图。所述装置包括:第一获取单元401、确定单元402、第二获取单元403和测试单元404;
第一获取单元401,用于获取第N次修改后的程序对应的漏测概率测试用例集M
确定单元402,用于根据第N+1次对程序修改的语句的类型,以及第一获取单元401获取的M
第二获取单元403,用于获取确定单元402确定的M
测试单元404,用于使用第二获取单元403获取的回归测试用例集对第N+1次修改后的程序进行测试。
优选地,所述装置进一步包括:存储单元;
所述存储单元,用于将确定单元402确定的第N+1次修改后的程序对应的漏测概率测试用例集M
优选地,
第一获取单元401,具体用于获取第N次修改后的程序对应的漏测概率测试用例集时,包括:当N为0时,获取针对未修改程序进行测试的测试用例集,对所述测试用例集中的每个测试用例估算出漏测概率,并组成未修改程序对应的漏测概率测试用例集;当N为1时,根据第1次对程序修改的语句的类型,以及未修改程序对应的漏测概率测试用例集获取第1次修改后的程序对应的漏测概率测试用例集M
优选地,
第一获取单元401,具体用于获取针对未修改程序进行测试的测试用例集,对所述测试用例集中的每个测试用例估算出漏测概率时,包括:获取针对未修改程序进行测试的测试用例集;获取所述测试用例集中的每个测试用例对应的覆盖错误的语句的概率、错误的中间态发生的概率和输出错误结果的概率;确定所述测试用例的漏测概率为所述覆盖错误的语句的概率、错误的中间态发生的概率和输出错误结果的概率的乘积。
优选地,
第一获取单元401,具体用于对程序进行静态扫描,获取错误的语句;在执行每条测试用例过程中,采用插桩的方式记录执行到的语句和未执行到的语句;确定所述测试用例执行到对应错误的语句的概率为所述测试用例覆盖错误的语句的概率;获取针对所述测试用例设置的错误的中间态发生的概率;当错误的中间态结果,作为计算性来使用时,将中间态结果的错误概率作为输出错误结果的概率;当错误的中间态结果,作为控制流的一个控制分支使用时,使用所有分支表达式是否错误的概率的乘积,作为输出错误结果的概率。
优选地,
确定单元402,具体用于根据第N+1次对程序修改的语句的类型,以及M
上述实施例的单元可以集成于一体,也可以分离部署;可以合并为一个单元,也可以进一步拆分成多个子单元。
在另一个实施例中,还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述程序测试方法的步骤。
在另一个实施例中,还提供一种计算机可读存储介质,其上存储有计算机指令,所述指令被处理器执行时可实现所述程序测试方法中的步骤。
图5为本发明实施例提供的电子设备的实体结构示意图。如图5所示,该电子设备可以包括:处理器(Processor)510、通信接口(Communications Interface)520、存储器(Memory)530和通信总线540,其中,处理器510,通信接口520,存储器530通过通信总线540完成相互间的通信。处理器510可以调用存储器530中的逻辑指令,以执行如下方法:
获取第N次修改后的程序对应的漏测概率测试用例集M
根据第N+1次对程序修改的语句的类型,以及M
获取M
使用所述回归测试用例集对第N+1次修改后的程序进行测试;
其中,漏测概率测试用例集包括测试用例,以及测试用例对应的漏测概率。
此外,上述的存储器530中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
- 一种程序测试方法、程序测试装置、电子设备及存储介质
- 车机小程序测试方法、装置、设备、存储介质及程序产品