掌桥专利:专业的专利平台
掌桥专利
首页

测试用例的生成方法及装置

文献发布时间:2023-06-19 19:30:30


测试用例的生成方法及装置

技术领域

本说明书一个或多个实施例涉及测试技术领域,尤其涉及一种测试用例的生成方法及装置。

背景技术

为了确保业务代码的正确性和可靠性,需要编写测试用例对其测试。

在业务代码中,通常包含大量空值(Nu l l)判断逻辑,如果要针对该类逻辑进行测试,需要将该类逻辑涉及的判断对象赋为空值。

传统技术中,为了能够对空值判断逻辑进行测试,在编写测试用例时,针对每个创建的对象均以一定概率赋为空值,之后通过不断迭代来决定是否保留该空值。然而,该种随机赋空值的方法,会存在将对应取值不包括空值的对象赋为空值,由此会增加一些无效的测试,进而降低了测试效率。

发明内容

本说明书一个或多个实施例描述了一种测试用例的生成方法及装置,可以大大提升测试用例的准确性。

第一方面,提供了一种测试用例的生成方法,包括:

在针对被测试的业务代码编写测试用例的过程中,对于针对所述业务代码中的第一赋值对象创建的第一实例,获取所述第一实例在所述测试用例中的当前上下文信息;

基于所述当前上下文信息查询对象信息集;其中,所述对象信息集中存储有所述业务代码中对应取值包括空值的各赋值对象各自的上下文信息;

根据查询结果,判断所述第一实例的取值是否包括空值;

至少根据判断结果和所述第一实例,生成用于测试所述业务代码的测试用例。

第二方面,提供了一种测试用例的生成装置,包括:

获取单元,用于在针对被测试的业务代码编写测试用例的过程中,对于针对所述业务代码中的第一赋值对象创建的第一实例,获取所述第一实例在所述测试用例中的当前上下文信息;

查询单元,用于基于所述当前上下文信息查询对象信息集;其中,所述对象信息集中存储有所述业务代码中对应取值包括空值的各赋值对象各自的上下文信息;

判断单元,用于根据查询结果,判断所述第一实例的取值是否包括空值;

生成单元,用于至少根据判断结果和所述第一实例,生成用于测试所述业务代码的测试用例。

第三方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面的方法。

第四方面,提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,该处理器执行所述可执行代码时,实现第一方面的方法。

本说明书一个或多个实施例提供的测试用例的生成方法及装置,在编写测试用例的过程中,对于新创建的实例,可以将该实例的上下文信息与预先存储的可赋为空值的赋值对象的上下文信息进行匹配,并且根据匹配结果,来判断是否可以将该实例赋为空值,进而根据判断结果来编写测试用例,由此可以大大提升测试用例的准确性。

附图说明

为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。

图1示出在一个例子中的状态机示意图;

图2示出根据一个实施例的赋值对象识别方法流程图;

图3示出利用图1示出的状态机识别赋值对象的方法示意图;

图4示出根据一个实施例的测试用例的生成方法流程图;

图5示出在一个例子中测试用例的生成方法示意图;

图6示出根据一个实施例的测试用例生成装置示意图。

具体实施方式

下面结合附图,对本说明书提供的方案进行描述。

如前所述,传统方法中,通常采用随机赋值的方法,对测试用例中新创建的对象进行赋值,这会影响测试效率。

本申请的发明人经研究发现,对应于空值判断逻辑的字节码指令序列中,各条指令的转移具有规律性,从而可以基于该规律性,来从业务代码中识别出为可赋为空值的各赋值对象,并存储识别出的各赋值对象。之后,在编写测试用例的过程中,对于新创建的实例,可以通过将该实例与存储的各赋值对象进行匹配,来判断是否可以将该实例赋为空值,进而生成业务代码对应的测试用例。

以下对上文提及的各条指令的转移规律性进行说明。

首先,假设存在如下的被测类:

在上述被测类中,ObjectA和ObjectB为两个类,objectA为类ObjectA的对象,该对象还是类Nu l l Test的成员变量。objectB为类ObjectB的对象,该对象还是函数testNu ll()的输入参数(简称函数入参或参数变量)。

针对如上的被测类,可能存在如下五种类型的用于实现空值判断逻辑的语句代码:

第一种:

if(objectB==nu l l){}

其中,该语句代码用于判断参数变量是否为空。

对应于该语句代码的字节码指令序列如下:Var l asn->Jump l nsn。其中,Var lnsn指令为变量调用指令,Jump l nsn指令为跳转指令。

此外,在对该语句代码识别后,得到的赋值对象为函数入参或参数变量。

第二种:

if(objectB.getbIdent ity()==nu l l){}

其中,getbIdent ity()为参数变量objectB调用的函数。该语句代码用于判断函数返回值是否为空。

对应于该语句代码的字节码指令序列如下:Var l asn->Method l nsn->Jump lnsn,其中,Var l nsn指令和Jump l nsn指令的定义参见上文所述,Method l nsn指令为函数调用指令。

此外,在对该语句代码识别后,得到的赋值对象为函数返回值。

第三种:

if(objectA==nu l l){}

其中,该语句代码用于判断成员变量是否为空。

对应于该语句代码的字节码指令序列如下:Var l nsn->Fie ld l nsn->Jump lnsn。其中,Var l nsn指令和Jump l nsn指令的定义参见上文所述,Fie ld l nsn指令为成员变量调用指令。

此外,在对该语句代码识别后,得到的赋值对象为成员变量。

第四种:

if(objectA.getaId()==nu l l){}

其中,getaId()为成员变量objectA调用的函数。该语句代码用于判断函数返回值是否为空。

对应于该语句代码的字节码指令序列如下:Var l asn->Fie ld l nsn->Methodl nsn->Jump l nsn。其中的各条指令的定义参见上文所述。

此外,在对该语句代码识别后,得到的赋值对象为函数返回值。

第五种:

if(objectA.getObjectC().getcTrans Id()==nu l l){}

其中,getObjectC()和getcTrans Id()为成员变量objectA连续调用的两个函数。该语句代码用于判断函数返回值是否为空。

对应于该语句代码的字节码指令序列如下:Var l asn->Fie ld l nsn->Methodl nsn->Method l nsn->Jump l nsn。其中的各条指令的定义参见上文所述。

此外,在对该语句代码识别后,得到的赋值对象为函数返回值。

基于上述例子,可以得出,用于实现空值判断逻辑的语句代码所对应的字节码指令序列中的各条指令的转移规律性如下:

1)所有的字节码指令序列从相同的指令(即Var l asn指令)开始,并以相同的指令(即Jump l nsn指令)结束。

2)Method l nsn指令后续可以为Method l nsn指令或者Jump l nsn指令。

3)Fie ld l nsn指令后续可以Method l nsn指令或者Jump l nsn指令。

基于上述的规律性,本申请的发明人可以构建得到如图1所示的状态机。图1中,该状态机包括四种状态:Var l asn指令对应的状态、Fie ld l nsn指令对应的状态、Methodl nsn指令对应的状态和Jump l nsn指令对应的状态。当然,图1只是一种示例性说明,在实际应用中,Var l asn指令对应的状态的下一状态也可以不是Method l nsn指令对应的状态。

图1中,存在如下的不变规律:Jump l nsn指令对应的状态的在前状态一定是如下三种状态:Method l nsn指令对应的状态、Var l asn指令对应的状态和Fie ld l nsn指令对应的状态。其中,结合上述的字节码指令序列,可以得出,在在前状态为Method l nsn指令对应的状态时,在对对应语句代码识别后可以得到赋值对象:函数返回值;在在前状态为Var l asn指令对应的状态时,在对对应语句代码识别后,可以得到赋值对象:函数入参;在在前状态为Fie ld l nsn指令对应的状态时,可以得到赋值对象:成员变量。

由于在对状态机进行回溯所得到的各个状态是确定的,且对应于各个状态的赋值对象也是确定的,因此,可以通过对状态机的状态进行回溯,来识别出可赋为空值的各赋值对象(后续说明)。

在识别出上述各赋值对象之后,为了方便于将在编写测试用例的过程中所创建的实例与其进行匹配,还可以针对各赋值对象记录如下的上下文信息:

其中,Nu l l Cond it ionObject为针对上述上下文信息定义的类结构。

需要说明,对于任一赋值对象,与其对应的上下文信息可以包含上述类结构中的部分项或全部项。比如,对于函数返回值,对应的上下文信息可以包括如下几项:对象所属类、对象所属函数、对象调用函数和对象类型。

以下对利用状态机,对各赋值对象的识别过程以及上下文信息的获取过程进行说明。当然,在实际应用中,也可以利用与状态机具有同等功能的二维表格等识别上述各赋值对象,本说明书对此不作限定。

图2示出根据一个实施例的赋值对象识别方法流程图。该方法可以通过任何具有计算、处理能力的装置、设备、平台、设备集群来执行。如图2所示,该方法可以包括如下步骤:

步骤S202,获取对应于被测试的业务代码的字节码指令序列集。

本方案中,用于识别各赋值对象的字节码指令序列均包括Jump l nsn指令。因此,可以基于该Jump l nsn指令,对字节码指令序列集进行筛选,即从中筛选出包含Jump lnsn指令的各候选指令序列,从而形成候选指令序列集,由此可以对被测类或被测函数及进行过滤。

当然,在实际应用中,也可以不执行该筛选操作,本说明书实施例对此不作限定。

步骤S204,利用状态机,对原始的字节码指令序列集或候选指令序列集进行分析,识别出各赋值对象。

具体地,对于任意的第一指令序列,首先可以对其中的各条指令进行倒序排列。之后,可以根据倒序排列的各条指令,对状态机的状态从第一预定状态开始向前回溯。这里的向前回溯具体可以包括,将当前指令与当前状态进行匹配,若匹配,则向前回溯到前一状态,并将当前指令更新为下一指令,直至达到回溯结束条件。这里的回溯结束条件可以包括,当前状态为第二预定状态;或者,当前状态为状态机的终态。

步骤S206,在达到回溯结束条件之后,根据回溯过程中所得到的各个状态中的至少部分状态,确定对应的赋值对象。

在回溯过程中,如果当前指令与当前状态不匹配,则提前结束。应理解,此时的回溯结束条件未满足。此外,在回溯过程中,如果当前状态的在前状态为多个,那么将该多个在前状态中与下一指令相匹配的状态作为向前回溯的前一状态。

如前所述,Jump l nsn指令对应的状态的在前状态是三种确定状态,且基于该三种状态可以唯一地确定出对应的赋值对象,从而本方案通过对状态机进行回溯来识别各赋值对象,可以大大提升识别效率。

当然,在实际应用中,也可以基于指令序列中各条指令的原始排序,按照状态机的转移方向进行状态转移,来识别出各赋值对象,本说明书对此不作限定。

图3示出利用图1示出的状态机识别赋值对象的方法示意图。图3中,对于基于Jumpl nsn指令筛选得到的候选指令序列集,从状态机中的Jump l nsn指令对应的状态开始向前回溯。之后,在到达Var l asn指令对应的状态、Fie ld l nsn指令对应的状态或Methodl nsn指令对应的状态时结束回溯过程。

图3中,在回溯过程结束后,如果当前状态为Var l asn指令对应的状态,那么可以确定对应的赋值对象为:函数入参,从而获取对应的上下文信息:对象类型和对象所属函数等。在一个例子中,Var l asn指令的变量var指定了loca lVar iab leS lot,之后可以先从methodNode中的loca lVar iab le变量中获取到具体的变量名和变量描述信息。接着利用ASM接口从变量描述信息中提取出变量类型。

如果当前状态为Method l nsn指令对应的状态,那么可以确定对应的赋值对象为:函数返回值,从而获取对应的上下文信息:对象所属类、对象所属函数、对象调用函数和对象类型等。

如果当前状态为Fie ld l nsn指令对应的状态,那么可以确定对应的状态为成员变量,从而获取对应的上下文信息:对象类型、对象调用函数和成员变量指示等。

需要说明,本方案中,针对原始的字节码指令序列集或候选指令序列集中的各条指令序列的识别方法相类似,因此,与上述识别方法类似地,还可以针对指令序列集中的其它各条指令进行识别,从而得到业务代码中对应取值包括空值的各赋值对象及其对应的各上下文信息。之后,基于各赋值对象各自的上下文信息形成对象信息集。

图4示出根据一个实施例的测试用例的生成方法流程图。该方法可以通过任何具有计算、处理能力的装置、设备、平台、设备集群来执行。如图4所示,该方法可以包括如下步骤:

步骤S402,在针对被测试的业务代码编写测试用例的过程中,对于针对业务代码中的第一赋值对象创建的第一实例,获取第一实例在测试用例中的当前上下文信息。

这里的业务代码可以为对应于目标类的目标函数的代码,且上述测试用例用于对目标函数进行单元测试。

上述第一赋值对象可以包括以下中的任一项:成员变量、函数入参以及函数返回值等。

以上述第一赋值对象为成员变量为例来说,上述当前上下文信息可以包括:对象类型、对象调用函数和成员变量指示等。再以第一赋值对象为函数入参为例来说,上述当前上下文信息可以包括:对象类型和对象所属函数等。最后以第一赋值对象为函数返回值为例来说,上述当前上下文信息可以包括:对象所属类、对象所属函数、对象调用函数和对象类型等。

步骤S404,基于当前上下文信息查询对象信息集。

这里的对象信息集可以参见上文所述,即其中存储有业务代码中对应取值包括空值的各赋值对象各自的上下文信息。

应理解,上述查询对象信息集具体包括:将当前上下文信息与对象信息集中的各上下文信息进行匹配,以得到对象信息集中是否存在与当前上下文信息相匹配的目标上下文信息的查询结果。

步骤S406,根据查询结果,判断第一实例的取值是否包括空值。

具体地,若查询结果指示,对象信息集中存在与当前上下文信息相匹配的目标上下文信息,则判断第一实例的取值包括空值。

若查询结果指示,对象信息集中不存在与当前上下文信息相匹配的目标上下文信息,则判断第一实例的取值不包括空值。

因为对象信息集中存储的是业务代码中对应取值包括空值的各赋值对象各自的上下文信息,因此,如若查询不到上述目标上下文信息,则说明第一实例的取值不包括空值,否则包括空值。

步骤S408,至少根据判断结果和第一实例,生成用于测试业务代码的测试用例。

具体地,若判断结果指示,第一实例的取值包括空值,则按照预定概率将第一实例的取值赋为空值。至少基于赋值后的第一实例,生成用于测试业务代码的测试用例。

这里按照预定概率将第一实例的取值赋为空值,是为了对第一实例的取值为非空值的分支进行测试。

若判断结果指示,第一实例的取值不包括空值,则按照正常流程针对所述第一实例进行赋值,比如,将第一实例的取值赋为预定值。至少基于赋值后的所述第一实例,生成用于测试业务代码的测试用例。

应理解,在针对业务代码中的多个赋值对象对应创建多个实例时,迭代执行上述步骤S402-步骤S408,以实现针对每个实例的取值是否包括空值的判断。

图5示出在一个例子中测试用例的生成方法示意图。图5中,在当前生成的实例为成员变量时,可以获取如下三类信息:对象类型、对象调用函数和成员变量指示,并将其与对象信息集中每个赋值对象的该三类信息进行匹配。此外,在当前生成的实例为函数入参时,可以获取如下的两类信息:对象类型和对象所属函数,并将其与对象信息集中每个赋值对象的该两类信息进行匹配。以及,在当前生成的实例为函数返回值时,可以获取如下的四类信息:对象所属类、对象所属函数、对象调用函数和对象类型,并将其与对象信息集中每个赋值对象的该四类信息进行匹配。

如若匹配成功,则说明当前生成的实例的取值包括空值,从而可以设定生成该空值的概率。之后,可以基于该预定概率来为该实例赋空值。比如,在为该实例赋值时,可以生成一个随机概率,如果该随机概率不大于预定概率,则将实例的取值赋为空值;而如果该随机概率大于预定概率,则按照正常流程为该实例赋值。

综上,本说明书实施例提供的测试用例的生成方法,可以预先对待测试的业务代码进行分析,识别得到可赋为空值的各赋值对象各自的上下文信息,并基于其形成对象信息集。之后,在编写测试用例的过程中,对于当前生成的实例,可以将该实例的上下文信息与对象信息集中的上下文信息进行匹配,并且根据匹配结果,来判断是否该可以将该实例赋为空值,进而根据判断结果来编写测试用例,由此可以提升测试用例的准确性。此外,在基于该测试用例对业务代码进行测试时,可以大大提升对业务代码的分支覆盖率。

与上述测试用例的生成方法对应地,本说明书一个实施例还提供的一种测试用例的生成装置,如图6所示,该装置可以包括:

获取单元602,用于在针对被测试的业务代码编写测试用例的过程中,对于针对业务代码中的第一赋值对象创建的第一实例,获取第一实例在测试用例中的当前上下文信息。

其中,第一赋值对象包括以下中的任一项:成员变量、函数入参以及函数返回值。

查询单元604,用于基于当前上下文信息查询对象信息集。其中,该对象信息集中存储有业务代码中对应取值包括空值的各赋值对象各自的上下文信息。

其中,各赋值对象各自的上下文信息包括以下中的至少一项:对象类型、对象所属函数、对象调用函数、对象所属类和成员变量指示。

判断单元606,用于根据查询结果,判断第一实例的取值是否包括空值。

生成单元608,用于至少根据判断结果和第一实例,生成用于测试业务代码的测试用例。

在一些实施例中,该装置还包括:分析单元610和形成单元612;

获取单元602,还用于获取业务代码;

分析单元610,用于利用状态机,对业务代码对应的字节码指令序列集进行分析,识别出各赋值对象;

形成单元612,用于获取各赋值对象各自的上下文信息,并基于各赋值对象各自的上下文信息形成对象信息集。

在一些实施例中,分析单元610包括:

排序子模块6102,用于对于任意的第一指令序列,对其中的各条指令进行倒序排列;

回溯子模块6104,用于根据倒序排列的各条指令,对状态机的状态从第一预定状态开始向前回溯;其中包括,将当前指令与当前状态进行匹配,若匹配,则向前回溯到前一状态,并将当前指令更新为下一指令,直至达到回溯结束条件;

确定子模块6106,用于根据回溯过程中所得到的各个状态中的至少部分状态,确定对应的赋值对象。

其中,上述回溯结束条件包括,当前状态为第二预定状态。

在一些实施例中,上述字节码指令序列集中的各条指令包括以下中的至少一项:变量调用指令、成员变量调用指令、函数调用指令和跳转指令;

上述第一预定状态为跳转指令对应的状态;上述第二预定状态包括以下中的任一项:变量调用指令对应的状态、成员变量调用指令对应的状态和函数调用指令对应的状态。

在一些实施例中,上述状态机至少包括跳转指令对应的状态;

分析单元610具体用于:

从字节码指令序列集中筛选出包含跳转指令的各候选指令序列,得到候选指令序列集;

对候选指令序列集进行分析。

在一些实施例中,判断单元606具体用于:

若查询结果指示,对象信息集中存在与当前上下文信息相匹配的目标上下文信息,则判断第一实例的取值包括空值;

若查询结果指示,对象信息集中不存在与当前上下文信息相匹配的目标上下文信息,则判断第一实例的取值不包括空值。

在一些实施例中,生成单元608具体用于:

若判断结果指示,第一实例的取值包括空值,则按照预定概率将第一实例的取值赋为空值;至少基于赋值后的第一实例,生成用于测试业务代码的测试用例;

若判断结果指示,第一实例的取值不包括空值,则将第一实例的取值赋为预定值;至少基于赋值后的第一实例,生成用于测试业务代码的测试用例。

在一些实施例中,上述业务代码为对应于目标类的目标函数的代码,上述测试用例用于对该目标函数进行单元测试。

本说明书上述实施例装置的各功能模块的功能,可以通过上述方法实施例的各步骤来实现,因此,本说明书一个实施例提供的装置的具体工作过程,在此不复赘述。

本说明书一个实施例提供的测试用例的生成装置,可以提升测试用例的准确性。

根据另一方面的实施例,还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行结合图4所描述的方法。

根据再一方面的实施例,还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现结合图4所描述的方法。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

结合本说明书公开内容所描述的方法或者算法的步骤可以硬件的方式来实现,也可以是由处理器执行软件指令的方式来实现。软件指令可以由相应的软件模块组成,软件模块可以被存放于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、移动硬盘、CD-ROM或者本领域熟知的任何其它形式的存储介质中。一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于ASIC中。另外,该ASIC可以位于服务器中。当然,处理器和存储介质也可以作为分立组件存在于服务器中。

本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

以上所述的具体实施方式,对本说明书的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本说明书的具体实施方式而已,并不用于限定本说明书的保护范围,凡在本说明书的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本说明书的保护范围之内。

相关技术
  • 测试用例生成方法及装置
  • 测试用例生成方法、装置及计算机可读存储介质
  • 自动化测试用例生成方法、装置、介质及电子设备
  • 接口测试用例生成方法、装置、计算机设备和存储介质
  • 接口测试用例生成方法、装置、电子设备、存储介质
  • 测试用例生成装置、测试用例生成方法和测试用例生成程序
  • 测试用例生成装置、测试用例生成方法和测试用例生成程序
技术分类

06120115929125