CN106681903A - 生成测试用例的方法及装置 - Google Patents
生成测试用例的方法及装置 Download PDFInfo
- Publication number
- CN106681903A CN106681903A CN201510767969.6A CN201510767969A CN106681903A CN 106681903 A CN106681903 A CN 106681903A CN 201510767969 A CN201510767969 A CN 201510767969A CN 106681903 A CN106681903 A CN 106681903A
- Authority
- CN
- China
- Prior art keywords
- function
- test condition
- current
- variable
- measured
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种生成测试用例的方法及装置。其中,该方法包括:获取待测函数;遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件;记录由各个分支的测试条件构成的表达式集合,其中,表达式集合中包含的一个表达式用于表征待测函数中对应的一个分支的测试用例;根据表达式集合生成用于测试待测函数的测试用例集合。
Description
技术领域
本发明涉及计算机领域,具体而言,涉及一种生成测试用例的方法及装置。
背景技术
如今,单元测试已成为软件开发过程中不可缺少的一部分。为了对被测试的待测函数中所包含的函数模块进行对应的单元测试,目前常用的测试方式是针对待测函数中不同的函数模块,由人工编写对应的测试用例实现对待测函数的单元测试。然而,当待测函数的数据量较大时,若仍然采用这种通过人工编写测试用例的方式,一个一个编写用于测试当前待测函数的测试用例时,测试效率明显较低;此外,这种手动编写的测试用例也无法保证实现对待测函数的全面覆盖。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
根据本申请实施例的一个方面,提供了一种生成测试用例的方法,包括:获取待测函数;遍历上述待测函数中的函数语句,获取进入上述待测函数中任意一个或多个分支时的测试条件;记录由各个分支的测试条件构成的表达式集合,其中,上述表达式集合中包含的一个表达式用于表征上述待测函数中对应的一个分支的测试用例;根据上述表达式集合生成用于测试上述待测函数的测试用例集合。
根据本申请实施例的另一个方面,提供了一种生成测试用例的装置,包括:第一获取单元,用于获取待测函数;第二获取单元,用于遍历上述待测函数中的函数语句,获取进入上述待测函数中任意一个或多个分支时的测试条件;记录单元,用于记录由各个分支的测试条件构成的表达式集合,其中,上述表达式集合中包含的一个表达式用于表征上述待测函数中对应的一个分支的测试用例;生成单元,用于根据上述表达式集合生成用于测试上述待测函数的测试用例集合。
在本申请实施例中,通过遍历待测函数中的全部函数语句,获取到进入待测函数中任意一个或多个分支时的测试条件,进一步,通过记录由上述各个测试条件构成的表达式集合,其中,表达式集合中的每一个表达式用于表征待测函数中对应的一个分支的测试用例,从而实现利用上述表达式集合中的表达式生成用于测试该待测函数的测试用例。也就是说,通过这种自动遍历进入待测函数中任意一个或多个分支时的测试条件,记录各个分支对应的表达式,从而实现自动生成不同的测试用例,不仅大大提高了测试待测函数的测试效率,而且,遍历函数语句还可以保证覆盖到全部分支,进而实现提高测试覆盖度的效果。进而解决了现有技术中通过手动编写测试用例所导致的测试效率较低的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本申请实施例的一种可选的生成测试用例的方法的流程图;
图2是根据本申请实施例的一种可选的生成测试用例的方法的应用场景示意图;
图3是根据本申请实施例的一种可选的生成测试用例的方法的示意图;
图4是根据本申请实施例的一种可选的生成测试用例的方法所涉及的待测函数的示意图;
图5是根据本申请实施例的一种可选的生成测试用例的装置的示意图;以及
图6是根据本申请实施例的一种可选的生成测试用例的计算机终端的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例1
根据本发明实施例,还提供了一种生成测试用例的方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
在本发明实施例中,图1示出了上述生成测试用例的方法的流程图,如图1所示,该方法包括:
S102,获取待测函数;
S104,遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件;
S106,记录由各个分支的测试条件构成的表达式集合,其中,表达式集合中包含的一个表达式用于表征待测函数中对应的一个分支的测试用例;
S108,根据表达式集合生成用于测试待测函数的测试用例集合。
可选地,在本实施例中,上述生成测试用例的方法可以但不限于应用于如图2所示的应用场景中,测试服务器202通过上述生成测试用例的方法生成对被测服务器204中的待测函数进行自动化测试的测试用例,从而实现对待测函数的自动化测试。其中,上述测试服务器202与被测服务器204可以为同一服务器,也就是说,测试服务器也可以对自身运行的待测函数进行自动化测试,本实施例对此不做任何限定。
具体而言,测试服务器在获取到需要进行测试的待测函数后,通过遍历待测函数中的全部函数语句,获取到进入待测函数中任意一个或多个分支时的测试条件,进一步,通过记录由上述各个测试条件构成的表达式集合,其中,表达式集合中的每一个表达式用于表征待测函数中对应的一个分支的测试用例,从而实现利用上述表达式集合中的表达式生成用于测试该待测函数的测试用例。也就是说,通过这种自动遍历进入待测函数中任意一个或多个分支时的测试条件,记录各个分支对应的表达式,从而实现自动生成不同的测试用例,不仅大大提高了测试待测函数的测试效率,而且,遍历函数语句还可以保证覆盖到全部分支,进而实现提高测试覆盖度的效果。
可选地,在本实施例中,在遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件时,还可以包括:根据由待测函数获取到的测试条件建立与待测函数相匹配的树状结构。通过将进入任意一个分支的测试条件存储到对应的树状结构的路径节点中,以便于获取由测试条件构成的一个分支的表达式。其中,树状结构中作为根节点的路径节点中的测试条件与作为子节点的路径节点中的测试条件具有嵌套关系。
进一步,记录由各个分支的测试条件构成的表达式集合可以包括但不限于:读取树状结构的各个分支路径中各个路径节点中的测试条件,其中一个分支路径中的路径节点记录为一个表达式,树状结构中的所有分支路径的表达式构成该待测函数的表达式集合。
例如,待测函数及其对应的树状结构可以如图3所示,其中,在该待测函数中可以依次获取到测试条件为:x>0、x<3,x≥3,result=null,result!=null,x≤0。进一步,由上述树状结构可以得出,该待测函数共包含四个分支。其中,由树状结构的根节点读取至最后一个叶子节点可以如下:第一分支的测试条件所构成的表达式可以为:x>0,且x<3;第二分支的测试条件所构成的表达式可以为:x>0,且x≥3,result=null;第三分支的测试条件所构成的表达式可以为:x>0,且x≥3,result!=null;第四分支的测试条件所构成的表达式可以为:x≤0。将上述四个表达式记录为获取到的待测函数的表达式集合。
可选地,在本实施例中,获取进入待测函数中任意一个或多个分支时的测试条件可以包括但不限于:通过预先设置的条件关键字从待测函数的每一条函数语句中查找测试条件所在的函数语句,并从该函数语句中获取测试条件存储至树状结构中对应的路径节点中。例如,条件关键词可以为:if、else等。
可选地,在本实施例中,根据表达式集合生成用于测试待测函数的测试用例集合可以包括但不限于:依次获取表达式集合中的表达式,分别按照每一个表达式生成一个对应的测试用例。可选地,在本实施例中,在生成测试用例时,可以但不限于通过构造每一个测试条件中的条件变量来模拟待测函数运行到该测试条件时的运行情况,例如,运行到第一个分支的第二个测试条件时,可以但不限于将条件变量构造为x=5,直接构造满足测试条件的条件变量,从而实现在测试过程中进入该测试条件所在的分支,以达到准确测试该分支的目的。
通过本申请提供的实施例,通过遍历待测函数中的全部函数语句,获取到进入待测函数中任意一个或多个分支时的测试条件,进一步,通过记录由上述各个测试条件构成的表达式集合,其中,表达式集合中的每一个表达式用于表征待测函数中对应的一个分支的测试用例,从而实现利用上述表达式集合中的表达式生成用于测试该待测函数的测试用例。也就是说,通过这种自动遍历进入待测函数中任意一个或多个分支时的测试条件,记录各个分支对应的表达式,从而实现自动生成不同的测试用例,不仅大大提高了测试待测函数的测试效率,而且,遍历函数语句还可以保证覆盖到全部分支,进而实现提高测试覆盖度的效果。
作为一种可选的方案,步骤S108,根据表达式集合生成用于测试待测函数的测试用例集合包括:
S1,将从表达式集合中依次读取到的任意一个表达式作为当前表达式,并对当前表达式执行以下步骤,以生成当前表达式所对应的测试用例,直至遍历完表达式集合中的表达式:
S12,获取当前表达式中所涉及的测试条件中的条件变量,其中,条件变量包括以下至少之一:可构造对象变量、非构造对象变量;和
S14,在生成当前表达式所对应的测试用例的过程中,在待测函数中测试条件的条件变量为可构造对象变量时,直接构造可构造对象变量得到构造后的条件变量,并将构造后的变量作为当前表达式所对应的测试用例中测试条件的条件变量,以生成当前表达式所对应的测试用例;和/或,在待测函数中测试条件的条件变量为非构造对象变量时,采用Mock函数模拟非构造对象变量得到模拟后的条件变量,并将模拟后的条件变量作为当前表达式所对应的测试用例中测试条件的条件变量,以生成当前表达式所对应的测试用例;和
S16,将生成的当前表达式所对应的测试用例存储在用于测试待测函数的测试用例集合中,其中,测试用例集合中包括表达式集合中每一个表达式所对应的测试用例。
可选地,在本实施例中,上述可构造对象变量可以但不限于通过函数参数值设定。例如,x>3,则可以设定x=5,从而使所生成的测试用例在测试过程中可以直接进入该测试条件所在的分支。可选地,在本实施例中,上述非构造对象变量可以但不限于调用函数调用结构。例如,上述待测函数中的测试条件为:result=null,其中,result=utf8HexDecode(value),也就是说,条件变量中的参数是根据调用函数调用结果的变化而变化的,无法直接构造,因而,在本实施例中,可以通过Mock函数模拟上述非构造对象变量,例如,无论调用结果是什么,在运行到上述测试条件时,直接模拟result=null,或者result!=null。
可选地,在本实施例中,
上述步骤S2,在待测函数中测试条件的条件变量为可构造对象变量时,直接构造可构造对象变量得到构造后的条件变量包括:S22,在待测函数中条件变量所涉及的条件参数为常量参数时,直接构造常量参数,将构造后的常量参数作为测试用例中测试条件的条件变量的条件参数;
上述步骤S2,在待测函数中测试条件的条件变量为非构造对象变量时,采用Mock函数模拟非构造对象变量得到模拟后的条件变量包括:S24,在条件变量所涉及的条件参数为变量参数时,通过Mock函数将变量参数模拟为常量参数,将模拟后的常量参数作为测试用例中测试条件的条件变量的条件参数。
也就是说,在本实施例中,上述可构造对象变量中条件变量所涉及的条件参数为常量参数,例如,x,y,z等;上述非构造对象变量所涉及的条件参数为常量参数,例如,result等调用函数。
通过本申请提供的实施例,通过从表达式集合中依次读取一个表达式作为当前表达式,对当前表达式可以执行如下步骤,直至遍历完成表达式集合中的全部表达式:获取当前表达式中每一个测试条件的条件变量,根据条件变量所涉及的变量参数的类型来确定如生成造测试用例中的测试条件,即在条件变量所涉及的条件参数为常量参数时,该条件变量为可构造变量,则可直接构造常量参数作为测试用例中测试条件的条件变量的条件参数;在条件变量所涉及的条件参数为变量参数时,该条件变量为非构造变量,则可直接通过Mock函数将变量参数模拟为常量参数,并将其作为测试用例中测试条件的条件变量的条件参数。通过上述分别与各个分支对应的表达式,生成对应的测试用例,从而得到覆盖待测函数全部分支的测试用例集合,以实现提高测试覆盖度的效果。
作为一种可选的方案,在步骤S106遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件时,还包括:
S1,根据由待测函数获取到的测试条件建立与待测函数相匹配的树状结构,其中,树状结构中的每一个路径节点存储一个测试条件,树状结构中作为根节点的路径节点中的测试条件与作为子节点的路径节点中的测试条件具有嵌套关系。
可选地,在本实施例中,获取待测函数中的测试条件以生成对应的测试用例的过程中,可以借助二叉树,即建立对应的树状结构,也可以通过其他方式映射待测函数中各个分支的测试条件的对应关系,从而便于生成与各个分支对应的测试用例。需要说明的是,上述树状结构仅是一种示例,在本实施例中对此不作任何限定。其中,上述与待测函数相匹配的树状结构可以包括但不限于一个或多个树状结构。
可选地,在本实施例中,根据由待测函数获取到的测试条件建立与待测函数相匹配的树状结构包括:
S12,依次读取待测函数中的函数语句作为当前函数语句,对当前函数语句执行以下步骤,直至读完待测函数中的全部函数语句;
S121,判断当前函数语句中是否包含测试条件;
S122,若当前函数语句中包含测试条件,则将测试条件对应存储到树状结构中对应的路径节点中;
S123,获取下一个函数语句作为当前函数语句。
可选地,在本实施例中,在遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件的同时,建立与该待测函数对应的树状结构。其中,需要说明的是,在上述树状结构中,若相邻两个测试条件为嵌套关系,则上述测试条件在树状结构中的路径节点的关系对应为根节点和子节点;若相邻两个测试条件不为嵌套关系,则上述测试条件在树状结构中的路径节点的关系对应为并列节点,并列节点可以在同一个树状结构中,也可以在不同的树状结构中。
具体结合图3所示进行说明,依次读取图3所示左侧待测函数中的函数语句作为当前函数语句,并判断读取到的当前函数语句中是否包含测试条件,若判断出包含,则将该测试条件存储到图3所示右侧对应的树状结构的路径节点中。例如,通过判断得知当前函数语句“if(x≥3)”中包括测试条件“x≥3”,则将其存储到树状结构对应的路径节点中,如图3所示。通过判断得知当前函数语句“result=utf8HexDecode(value)”中并不包括测试条件,则直接获取下一个函数语句作为当前函数语句。
通过本申请提供的实施例,通过遍历的方式依次判断各个函数语句中是否包括测试条件,实现全面覆盖待测函数,从而保证根据遍历获取到的测试条件所生成的测试用例的覆盖度较高,可以覆盖待测函数的全部分支,以克服现有技术中手动生成测试用例所导致的测试用例覆盖度较低,影响测试结果准确性的问题。
作为一种可选的方案,步骤S121,判断当前函数语句中是否包含测试条件包括:
S121-1,判断当前函数语句中是否包括用于标识测试条件的条件关键字;
S121-2,若读取到的当前函数语句中包括条件关键字,则判断出当前函数语句为测试条件所在的函数语句。
可选地,在本实施例中,上述条件关键字可以包括但不限于:用于选择分支的关键字,例如,if、else等。需要说明的是,在不同程序中用于选择分支的程序代码不同,所配置的条件关键字可以调整为不同内容以适应不同程序。上述仅是一种示例,本实施例对此不作任何限定。
通过本申请提供的实施例,通过预先配置的条件关键字,从待测函数中的函数语句中获取对应的测试条件,从而保证准确获取到待测函数中全部的测试条件,以得到待测函数中的全部分支,进而实现提高对待测函数测试的测试准确性。
作为一种可选的方案,步骤S122,将测试条件对应存储到树状结构中对应的路径节点中包括:
S122-1,重复执行以下步骤,直至获取到测试条件在树状结构中对应的路径节点:
S122-11,获取在当前函数语句之前出现的相邻的上一个测试条件作为当前历史测试条件;
S122-12,判断当前函数语句中的测试条件与当前历史测试条件是否具有嵌套关系;
S122-13,若当前函数语句中的测试条件与当前历史测试条件具有嵌套关系,则将当前函数语句中的测试条件存储到与当前历史测试条件对应的路径节点的子节点中;
S122-14,若当前函数语句中的测试条件与当前历史测试条件不具有嵌套关系,则判断当前函数语句中的测试条件是否为树状结构中的根节点;
S122-15,若当前函数语句中的测试条件是树状结构中的根节点,则将当前函数语句中的测试条件存储到新的树状结构的根节点中;
S122-16,若当前函数语句中的测试条件不是树状结构中的根节点,则重新获取在当前历史测试条件之前出现的相邻的上一个测试条件作为下一个当前历史测试条件。
具体结合图3所示进行说明,假设当前函数语句获取到的测试条件为result=null,获取在当前函数语句之前出现的相邻的上一个测试条件作为当前历史测试条件,即,x≥3。进一步,判断当前函数语句中的测试条件与当前历史测试条件是否具有嵌套关系,在判断出具有嵌套关系后,将由当前函数语句获取到的测试条件result=null,存储到当前历史测试条件x≥3对应的路径节点的子节点中,如图3所示,二者具有从属关系。
具体结合图3所示进行说明,假设当前函数语句获取到的测试条件为x<0,获取在当前函数语句之前出现的相邻的上一个测试条件作为当前历史测试条件。进一步,判断当前函数语句中的测试条件与当前历史测试条件是否具有嵌套关系,在判断出不具有嵌套关系后,则判断当前函数语句中的测试条件是否为树状结构中的根节点;在当前函数语句中的测试条件是树状结构中的根节点时,将当前函数语句中的测试条件存储到新的树状结构的根节点中,如图3所示。
此外,若当前函数语句获取到的测试条件与当前历史测试条件不具有嵌套关系,且当前函数语句中的测试条件不是树状结构中的根节点,则将在当前历史测试条件之前出现的相邻的上一个测试条件作为下一个当前历史测试条件,判断当前函数语句中的测试条件与新获取的当前历史测试条件是否具有嵌套关系,依次类推,直至找到该当前函数语句获取到的测试条件在树状结构中对应的路径节点。
通过本申请提供的实施例,通过上述方式将读取到的当前函数语句中的测试条件映射到树状结构中对应的路径节点中,从而便于利用待测函数对应的树状结构获取该待测函数对应的表达式。
作为一种可选的方案,步骤S106,记录由各个分支的测试条件构成的表达式集合包括:
S1,读取从树状结构的根节点分别到每一个叶子节点的测试条件,其中,树状结构的根节点到一个叶子节点之间的所有路径节点构成一个分支的路径,叶子节点为分支的最后一个路径节点;
S2,将每一条路径中读取到的测试条件作为与路径对应的分支的表达式,并存储到待测函数的表达式集合中。
具体结合以下示例进行说明,例如,待测函数及其对应的树状结构可以如图3所示,其中,在该待测函数中可以依次获取到测试条件为:x>0、x<3,x≥3,result=null,result!=null,x≤0。进一步,读取从树状结构的根节点分别到每一个叶子节点的测试条件所构成的一个分支的路径,作为与路径对应的分支的表达式。其中,由图3所示树状结构的根节点读取至最后一个叶子节点可以如下:第一分支的测试条件所构成的表达式可以为:x>0,且x<3;第二分支的测试条件所构成的表达式可以为:x>0,且x≥3,result=null;第三分支的测试条件所构成的表达式可以为:x>0,且x≥3,result!=null;第四分支的测试条件所构成的表达式可以为:x≤0。将上述四个表达式存储到待测函数的表达式集合中。
通过本申请提供的实施例,利用由待测函数中的测试条件建立的树状结构来映射出待测函数中各个分支中的测试条件之间的相对关系,从而更加便于生成该待测函数的测试用例,进而实现提高生成测试用例的效率的目的。
作为一种可选的实施方式,具体结合图4所示待测函数进行说明:
例如,按照流程读取待测函数handleEvent函数后,遍历各个函数语句得到待测函数的表达式集合,共有3条记录,具体如下:
1、函数从line 7结束,需要传入的参数queue=null,value=any string
2、函数从line 12结束,需要传入的参数queue!=null,value=anystring,utf8HexDecode(value)返回不等于空的值。
3、函数从line 15结束。需要传入的参数为queue!=null,value=anystring,utf8HexDecode(value)返回空。
其中,记录1生成测试用例过程中不需要mock。可以直接通过构造条件变量生成一个测试用例;new一个类A的对象instance;调用instance的handleEvent函数,并将queue的值设为null验证handleEvent函数是否返回false。
此外,记录2生成测试用例过程中需要mock。具体步骤:生成一个测试用例;new一个类A的对象instance;测试用例中mock utf8HexDecode函数,使其返回一个非空值;测试用例中mock saveToDatabase函数,使其接收任意参数,并不做操作;调用instance的handleEvent函数,并将queue的值设为非空;验证handleEvent函数是否返回true。
而记录3生成测试用例过程中需要mock。具体步骤:生成一个测试用例;new一个类A的对象instance;测试用例中mock utf8HexDecode函数,使其返回一个空值;调用instance的handleEvent函数,并将queue的值设为非空;验证handleEvent函数是否返回false。
实施例2
根据本发明实施例,还提供了一种用于实施上述生成测试用例的方法的生成测试用例的装置,如图5所示,该装置包括:
1)第一获取单元502,用于获取待测函数;
2)第二获取单元504,用于遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件;
3)记录单元506,用于记录由各个分支的测试条件构成的表达式集合,其中,表达式集合中包含的一个表达式用于表征待测函数中对应的一个分支的测试用例;
4)生成单元508,用于根据表达式集合生成用于测试待测函数的测试用例集合。
可选地,在本实施例中,上述生成测试用例的方法可以但不限于应用于如图2所示的应用场景中,测试服务器202通过上述生成测试用例的方法生成对被测服务器204中的待测函数进行自动化测试的测试用例,从而实现对待测函数的自动化测试。其中,上述测试服务器202与被测服务器204可以为同一服务器,也就是说,测试服务器也可以对自身运行的待测函数进行自动化测试,本实施例对此不做任何限定。
具体而言,测试服务器在获取到需要进行测试的待测函数后,通过遍历待测函数中的全部函数语句,获取到进入待测函数中任意一个或多个分支时的测试条件,进一步,通过记录由上述各个测试条件构成的表达式集合,其中,表达式集合中的每一个表达式用于表征待测函数中对应的一个分支的测试用例,从而实现利用上述表达式集合中的表达式生成用于测试该待测函数的测试用例。也就是说,通过这种自动遍历进入待测函数中任意一个或多个分支时的测试条件,记录各个分支对应的表达式,从而实现自动生成不同的测试用例,不仅大大提高了测试待测函数的测试效率,而且,遍历函数语句还可以保证覆盖到全部分支,进而实现提高测试覆盖度的效果。
可选地,在本实施例中,在遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件时,还可以包括:根据由待测函数获取到的测试条件建立与待测函数相匹配的树状结构。通过将进入任意一个分支的测试条件存储到对应的树状结构的路径节点中,以便于获取由测试条件构成的一个分支的表达式。其中,树状结构中作为根节点的路径节点中的测试条件与作为子节点的路径节点中的测试条件具有嵌套关系。
进一步,记录由各个分支的测试条件构成的表达式集合可以包括但不限于:读取树状结构的各个分支路径中各个路径节点中的测试条件,其中一个分支路径中的路径节点记录为一个表达式,树状结构中的所有分支路径的表达式构成该待测函数的表达式集合。
例如,待测函数及其对应的树状结构可以如图3所示,其中,在该待测函数中可以依次获取到测试条件为:x>0、x<3,x≥3,result=null,result!=null,x≤0。进一步,由上述树状结构可以得出,该待测函数共包含四个分支。其中,由树状结构的根节点读取至最后一个叶子节点可以如下:第一分支的测试条件所构成的表达式可以为:x>0,且x<3;第二分支的测试条件所构成的表达式可以为:x>0,且x≥3,result=null;第三分支的测试条件所构成的表达式可以为:x>0,且x≥3,result!=null;第四分支的测试条件所构成的表达式可以为:x≤0。将上述四个表达式记录为获取到的待测函数的表达式集合。
可选地,在本实施例中,获取进入待测函数中任意一个或多个分支时的测试条件可以包括但不限于:通过预先设置的条件关键字从待测函数的每一条函数语句中查找测试条件所在的函数语句,并从该函数语句中获取测试条件存储至树状结构中对应的路径节点中。例如,条件关键词可以为:if、else等。
可选地,在本实施例中,根据表达式集合生成用于测试待测函数的测试用例集合可以包括但不限于:依次获取表达式集合中的表达式,分别按照每一个表达式生成一个对应的测试用例。可选地,在本实施例中,在生成测试用例时,可以但不限于通过构造每一个测试条件中的条件变量来模拟待测函数运行到该测试条件时的运行情况,例如,运行到第一个分支的第二个测试条件时,可以但不限于将条件变量构造为x=5,直接构造满足测试条件的条件变量,从而实现在测试过程中进入该测试条件所在的分支,以达到准确测试该分支的目的。
通过本申请提供的实施例,通过遍历待测函数中的全部函数语句,获取到进入待测函数中任意一个或多个分支时的测试条件,进一步,通过记录由上述各个测试条件构成的表达式集合,其中,表达式集合中的每一个表达式用于表征待测函数中对应的一个分支的测试用例,从而实现利用上述表达式集合中的表达式生成用于测试该待测函数的测试用例。也就是说,通过这种自动遍历进入待测函数中任意一个或多个分支时的测试条件,记录各个分支对应的表达式,从而实现自动生成不同的测试用例,不仅大大提高了测试待测函数的测试效率,而且,遍历函数语句还可以保证覆盖到全部分支,进而实现提高测试覆盖度的效果。
作为一种可选的方案,生成单元508包括:
1)第一处理模块,用于将从表达式集合中依次读取到的任意一个表达式作为当前表达式,并对当前表达式执行以下步骤,以生成当前表达式所对应的测试用例,直至遍历完表达式集合中的表达式:获取当前表达式中所涉及的测试条件中的条件变量,其中,条件变量包括以下至少之一:可构造对象变量、非构造对象变量;和在生成当前表达式所对应的测试用例的过程中,在待测函数中测试条件的条件变量为可构造对象变量时,直接构造可构造对象变量得到构造后的条件变量,并将构造后的变量作为当前表达式所对应的测试用例中测试条件的条件变量,以生成当前表达式所对应的测试用例;和/或,在待测函数中测试条件的条件变量为非构造对象变量时,采用Mock函数模拟非构造对象变量得到模拟后的条件变量,并将模拟后的条件变量作为当前表达式所对应的测试用例中测试条件的条件变量,以生成当前表达式所对应的测试用例;和将生成的当前表达式所对应的测试用例存储在用于测试待测函数的测试用例集合中,其中,测试用例集合中包括表达式集合中每一个表达式所对应的测试用例。
可选地,在本实施例中,上述可构造对象变量可以但不限于通过函数参数值设定。例如,x>3,则可以设定x=5,从而使所生成的测试用例在测试过程中可以直接进入该测试条件所在的分支。可选地,在本实施例中,上述非构造对象变量可以但不限于调用函数调用结构。例如,上述待测函数中的测试条件为:result=null,其中,result=utf8HexDecode(value),也就是说,条件变量中的参数是根据调用函数调用结果的变化而变化的,无法直接构造,因而,在本实施例中,可以通过Mock函数模拟上述非构造对象变量,例如,无论调用结果是什么,在运行到上述测试条件时,直接模拟result=null,或者result!=null。
可选地,在本实施例中,
1)第一处理模块通过以下步骤实现在待测函数中测试条件的条件变量为可构造对象变量时,直接构造可构造对象变量得到构造后的条件变量:在待测函数中条件变量所涉及的条件参数为常量参数时,直接构造常量参数,将构造后的常量参数作为测试用例中测试条件的条件变量的条件参数;
2)第一处理模块通过以下步骤实现在待测函数中测试条件的条件变量为非构造对象变量时,采用Mock函数模拟非构造对象变量得到模拟后的条件变量:在条件变量所涉及的条件参数为变量参数时,通过Mock函数将变量参数模拟为常量参数,将模拟后的常量参数作为测试用例中测试条件的条件变量的条件参数。
也就是说,在本实施例中,上述可构造对象变量中条件变量所涉及的条件参数为常量参数,例如,x,y,z等;上述非构造对象变量所涉及的条件参数为常量参数,例如,result等调用函数。
通过本申请提供的实施例,通过从表达式集合中依次读取一个表达式作为当前表达式,对当前表达式可以执行如下步骤,直至遍历完成表达式集合中的全部表达式:获取当前表达式中每一个测试条件的条件变量,根据条件变量所涉及的变量参数的类型来确定如生成造测试用例中的测试条件,即在条件变量所涉及的条件参数为常量参数时,该条件变量为可构造变量,则可直接构造常量参数作为测试用例中测试条件的条件变量的条件参数;在条件变量所涉及的条件参数为变量参数时,该条件变量为非构造变量,则可直接通过Mock函数将变量参数模拟为常量参数,并将其作为测试用例中测试条件的条件变量的条件参数。通过上述分别与各个分支对应的表达式,生成对应的测试用例,从而得到覆盖待测函数全部分支的测试用例集合,以实现提高测试覆盖度的效果。
作为一种可选的方案,还包括:
1)建立单元,用于在遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件时,根据由待测函数获取到的测试条件建立与待测函数相匹配的树状结构,其中,树状结构中的每一个路径节点存储一个测试条件,树状结构中作为根节点的路径节点中的测试条件与作为子节点的路径节点中的测试条件具有嵌套关系。
可选地,在本实施例中,获取待测函数中的测试条件以生成对应的测试用例的过程中,可以借助二叉树,即建立对应的树状结构,也可以通过其他方式映射待测函数中各个分支的测试条件的对应关系,从而便于生成与各个分支对应的测试用例。需要说明的是,上述树状结构仅是一种示例,在本实施例中对此不作任何限定。其中,上述与待测函数相匹配的树状结构可以包括但不限于一个或多个树状结构。
可选地,在本实施例中,建立单元包括:
1)第二处理模块,用于依次读取待测函数中的函数语句作为当前函数语句,对当前函数语句执行以下步骤,直至读完待测函数中的全部函数语句;判断当前函数语句中是否包含测试条件;在当前函数语句中包含测试条件时,将测试条件对应存储到树状结构中对应的路径节点中;获取下一个函数语句作为当前函数语句。
可选地,在本实施例中,在遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件的同时,建立与该待测函数对应的树状结构。其中,需要说明的是,在上述树状结构中,若相邻两个测试条件为嵌套关系,则上述测试条件在树状结构中的路径节点的关系对应为根节点和子节点;若相邻两个测试条件不为嵌套关系,则上述测试条件在树状结构中的路径节点的关系对应为并列节点,并列节点可以在同一个树状结构中,也可以在不同的树状结构中。
具体结合图3所示进行说明,依次读取图3所示左侧待测函数中的函数语句作为当前函数语句,并判断读取到的当前函数语句中是否包含测试条件,若判断出包含,则将该测试条件存储到图3所示右侧对应的树状结构的路径节点中。例如,通过判断得知当前函数语句“if(x≥3)”中包括测试条件“x≥3”,则将其存储到树状结构对应的路径节点中,如图3所示。通过判断得知当前函数语句“result=utf8HexDecode(value)”中并不包括测试条件,则直接获取下一个函数语句作为当前函数语句。
通过本申请提供的实施例,通过遍历的方式依次判断各个函数语句中是否包括测试条件,实现全面覆盖待测函数,从而保证根据遍历获取到的测试条件所生成的测试用例的覆盖度较高,可以覆盖待测函数的全部分支,以克服现有技术中手动生成测试用例所导致的测试用例覆盖度较低,影响测试结果准确性的问题。
作为一种可选的方案,第二处理模块通过以下步骤实现判断当前函数语句中是否包含测试条件包括:
S1,判断当前函数语句中是否包括用于标识测试条件的条件关键字;
S2,若读取到的当前函数语句中包括条件关键字,则判断出当前函数语句为测试条件所在的函数语句。
可选地,在本实施例中,上述条件关键字可以包括但不限于:用于选择分支的关键字,例如,if、else等。需要说明的是,在不同程序中用于选择分支的程序代码不同,所配置的条件关键字可以调整为不同内容以适应不同程序。上述仅是一种示例,本实施例对此不作任何限定。
通过本申请提供的实施例,通过预先配置的条件关键字,从待测函数中的函数语句中获取对应的测试条件,从而保证准确获取到待测函数中全部的测试条件,以得到待测函数中的全部分支,进而实现提高对待测函数测试的测试准确性。
作为一种可选的方案,第二处理模块通过以下步骤实现将测试条件对应存储到树状结构中对应的路径节点中包括:
S3,重复执行以下步骤,直至获取到测试条件在树状结构中对应的路径节点:
S3-1,获取在当前函数语句之前出现的相邻的上一个测试条件作为当前历史测试条件;
S3-2,判断当前函数语句中的测试条件与当前历史测试条件是否具有嵌套关系;
S3-3,若当前函数语句中的测试条件与当前历史测试条件具有嵌套关系,则将当前函数语句中的测试条件存储到与当前历史测试条件对应的路径节点的子节点中;
S3-4,若当前函数语句中的测试条件与当前历史测试条件不具有嵌套关系,则判断当前函数语句中的测试条件是否为树状结构中的根节点;
S3-5,若当前函数语句中的测试条件是树状结构中的根节点,则将当前函数语句中的测试条件存储到新的树状结构的根节点中;
S3-6,若当前函数语句中的测试条件不是树状结构中的根节点,则重新获取在当前历史测试条件之前出现的相邻的上一个测试条件作为下一个当前历史测试条件。
具体结合图3所示进行说明,假设当前函数语句获取到的测试条件为result=null,获取在当前函数语句之前出现的相邻的上一个测试条件作为当前历史测试条件,即,x≥3。进一步,判断当前函数语句中的测试条件与当前历史测试条件是否具有嵌套关系,在判断出具有嵌套关系后,将由当前函数语句获取到的测试条件result=null,存储到当前历史测试条件x≥3对应的路径节点的子节点中,如图3所示,二者具有从属关系。
具体结合图3所示进行说明,假设当前函数语句获取到的测试条件为x<0,获取在当前函数语句之前出现的相邻的上一个测试条件作为当前历史测试条件。进一步,判断当前函数语句中的测试条件与当前历史测试条件是否具有嵌套关系,在判断出不具有嵌套关系后,则判断当前函数语句中的测试条件是否为树状结构中的根节点;在当前函数语句中的测试条件是树状结构中的根节点时,将当前函数语句中的测试条件存储到新的树状结构的根节点中,如图3所示。
此外,若当前函数语句获取到的测试条件与当前历史测试条件不具有嵌套关系,且当前函数语句中的测试条件不是树状结构中的根节点,则将在当前历史测试条件之前出现的相邻的上一个测试条件作为下一个当前历史测试条件,判断当前函数语句中的测试条件与新获取的当前历史测试条件是否具有嵌套关系,依次类推,直至找到该当前函数语句获取到的测试条件在树状结构中对应的路径节点。
通过本申请提供的实施例,通过上述方式将读取到的当前函数语句中的测试条件映射到树状结构中对应的路径节点中,从而便于利用待测函数对应的树状结构获取该待测函数对应的表达式。
作为一种可选的方案,记录单元包括:
1)读取模块,用于读取从树状结构的根节点分别到每一个叶子节点的测试条件,其中,树状结构的根节点到一个叶子节点之间的所有路径节点构成一个分支的路径,叶子节点为分支的最后一个路径节点;
2)记录模块,用于将每一条路径中读取到的测试条件作为与路径对应的分支的表达式,并存储到待测函数的表达式集合中。
具体结合以下示例进行说明,例如,待测函数及其对应的树状结构可以如图3所示,其中,在该待测函数中可以依次获取到测试条件为:x>0、x<3,x≥3,result=null,result!=null,x≤0。进一步,读取从树状结构的根节点分别到每一个叶子节点的测试条件所构成的一个分支的路径,作为与路径对应的分支的表达式。其中,由图3所示树状结构的根节点读取至最后一个叶子节点可以如下:第一分支的测试条件所构成的表达式可以为:x>0,且x<3;第二分支的测试条件所构成的表达式可以为:x>0,且x≥3,result=null;第三分支的测试条件所构成的表达式可以为:x>0,且x≥3,result!=null;第四分支的测试条件所构成的表达式可以为:x≤0。将上述四个表达式存储到待测函数的表达式集合中。
通过本申请提供的实施例,利用由待测函数中的测试条件建立的树状结构来映射出待测函数中各个分支中的测试条件之间的相对关系,从而更加便于生成该待测函数的测试用例,进而实现提高生成测试用例的效率的目的。
实施例3
本发明的实施例可以提供一种计算机终端,该计算机终端可以是计算机终端群中的任意一个计算机终端设备。可选地,在本实施例中,上述计算机终端也可以替换为移动终端等终端设备。
可选地,在本实施例中,上述计算机终端可以位于计算机网络的多个网络设备中的至少一个网络设备。
可选地,在本实施例中,如图6所示,该计算机终端可以包括一个或多个处理器602(处理器602可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器604、以及用于通信功能的传输模块606。本领域普通技术人员可以理解,上述仅为示例,其并不对上述电子装置的结构造成限定。例如,计算机终端还可包括更多或者更少的组件,或者具有与所示示例不同的配置。
存储器604可用于存储应用软件的软件程序以及模块,例如,待测函数中的函数语句即记录的表达式集合中的表达式,处理器602通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的生成测试用例的方法中所涉及的生成测试用例的过程。存储器604可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器604可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置606用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端的通信供应商提供的无线网络。在一个实例中,传输装置606可以但不限于包括一个网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置606可以为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
实施例4
本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例一所提供的生成测试用例的方法所执行的程序代码。
可选地,在本实施例中,上述存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中。
可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:
S1,获取待测函数;
S2,遍历待测函数中的函数语句,获取进入待测函数中任意一个或多个分支时的测试条件;
S3,记录由各个分支的测试条件构成的表达式集合,其中,表达式集合中包含的一个表达式用于表征待测函数中对应的一个分支的测试用例;
S4,根据表达式集合生成用于测试待测函数的测试用例集合。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (16)
1.一种生成测试用例的方法,其特征在于,包括:
获取待测函数;
遍历所述待测函数中的函数语句,获取进入所述待测函数中任意一个或多个分支时的测试条件;
记录由各个分支的测试条件构成的表达式集合,其中,所述表达式集合中包含的一个表达式用于表征所述待测函数中对应的一个分支的测试用例;
根据所述表达式集合生成用于测试所述待测函数的测试用例集合。
2.根据权利要求1所述的方法,其特征在于,所述根据所述表达式集合生成用于测试所述待测函数的测试用例集合包括:
将从所述表达式集合中依次读取到的任意一个表达式作为当前表达式,并对所述当前表达式执行以下步骤,以生成所述当前表达式所对应的测试用例,直至遍历完所述表达式集合中的表达式:
获取所述当前表达式中所涉及的测试条件中的条件变量,其中,所述条件变量包括以下至少之一:可构造对象变量、非构造对象变量;和
在生成所述当前表达式所对应的测试用例的过程中,在所述待测函数中所述测试条件的条件变量为所述可构造对象变量时,直接构造所述可构造对象变量得到构造后的条件变量,并将所述构造后的变量作为所述当前表达式所对应的测试用例中测试条件的条件变量,以生成所述当前表达式所对应的测试用例;和/或,在所述待测函数中所述测试条件的条件变量为所述非构造对象变量时,采用Mock函数模拟所述非构造对象变量得到模拟后的条件变量,并将所述模拟后的条件变量作为所述当前表达式所对应的测试用例中测试条件的条件变量,以生成所述当前表达式所对应的测试用例;和
将生成的所述当前表达式所对应的测试用例存储在用于测试所述待测函数的所述测试用例集合中,其中,所述测试用例集合中包括所述表达式集合中每一个表达式所对应的测试用例。
3.根据权利要求2所述的方法,其特征在于,
在所述待测函数中所述测试条件的条件变量为所述可构造对象变量时,直接构造所述可构造对象变量得到构造后的条件变量包括:在所述待测函数中所述条件变量所涉及的条件参数为常量参数时,直接构造所述常量参数,将构造后的所述常量参数作为所述测试用例中测试条件的条件变量的条件参数;
在所述待测函数中所述测试条件的条件变量为所述非构造对象变量时,采用Mock函数模拟所述非构造对象变量得到模拟后的条件变量包括:在所述条件变量所涉及的条件参数为变量参数时,通过所述Mock函数将所述变量参数模拟为常量参数,将模拟后的常量参数作为所述测试用例中测试条件的条件变量的条件参数。
4.根据权利要求1所述的方法,其特征在于,在所述遍历所述待测函数中的函数语句,获取进入所述待测函数中任意一个或多个分支时的测试条件时,还包括:
根据由所述待测函数获取到的所述测试条件建立与所述待测函数相匹配的树状结构,其中,所述树状结构中的每一个路径节点存储一个所述测试条件,所述树状结构中作为根节点的路径节点中的所述测试条件与作为子节点的路径节点中的所述测试条件具有嵌套关系。
5.根据权利要求4所述的方法,其特征在于,所述根据由所述待测函数获取到的所述测试条件建立与所述待测函数相匹配的树状结构包括:
依次读取所述待测函数中的函数语句作为当前函数语句,对所述当前函数语句执行以下步骤,直至读完所述待测函数中的全部函数语句;
判断所述当前函数语句中是否包含所述测试条件;
若所述当前函数语句中包含所述测试条件,则将所述测试条件对应存储到所述树状结构中对应的路径节点中;
获取下一个函数语句作为所述当前函数语句。
6.根据权利要求5所述的方法,其特征在于,所述判断所述当前函数语句中是否包含所述测试条件包括:
判断所述当前函数语句中是否包括用于标识所述测试条件的条件关键字;
若读取到的所述当前函数语句中包括所述条件关键字,则判断出所述当前函数语句为所述测试条件所在的函数语句。
7.根据权利要求5所述的方法,其特征在于,所述将所述测试条件对应存储到所述树状结构中对应的路径节点中包括:
重复执行以下步骤,直至获取到所述测试条件在所述树状结构中对应的所述路径节点:
获取在所述当前函数语句之前出现的相邻的上一个测试条件作为当前历史测试条件;
判断所述当前函数语句中的所述测试条件与所述当前历史测试条件是否具有所述嵌套关系;
若所述当前函数语句中的所述测试条件与所述当前历史测试条件具有所述嵌套关系,则将所述当前函数语句中的所述测试条件存储到与所述当前历史测试条件对应的所述路径节点的子节点中;
若所述当前函数语句中的所述测试条件与所述当前历史测试条件不具有所述嵌套关系,则判断所述当前函数语句中的所述测试条件是否为所述树状结构中的所述根节点;
若所述当前函数语句中的所述测试条件是所述树状结构中的所述根节点,则将所述当前函数语句中的所述测试条件存储到新的树状结构的根节点中;
若所述当前函数语句中的所述测试条件不是所述树状结构中的所述根节点,则重新获取在所述当前历史测试条件之前出现的相邻的上一个测试条件作为下一个所述当前历史测试条件。
8.根据权利要求4至7中任一项所述的方法,其特征在于,所述记录由各个分支的测试条件构成的表达式集合包括:
读取从所述树状结构的所述根节点分别到每一个叶子节点的所述测试条件,其中,所述树状结构的所述根节点到一个所述叶子节点之间的所有路径节点构成一个分支的路径,所述叶子节点为所述分支的最后一个路径节点;
将每一条所述路径中读取到的所述测试条件作为与所述路径对应的所述分支的表达式,并存储到所述待测函数的所述表达式集合中。
9.一种生成测试用例的装置,其特征在于,包括:
第一获取单元,用于获取待测函数;
第二获取单元,用于遍历所述待测函数中的函数语句,获取进入所述待测函数中任意一个或多个分支时的测试条件;
记录单元,用于记录由各个分支的测试条件构成的表达式集合,其中,所述表达式集合中包含的一个表达式用于表征所述待测函数中对应的一个分支的测试用例;
生成单元,用于根据所述表达式集合生成用于测试所述待测函数的测试用例集合。
10.根据权利要求9所述的装置,其特征在于,所述生成单元包括:
第一处理模块,用于将从所述表达式集合中依次读取到的任意一个表达式作为当前表达式,并对所述当前表达式执行以下步骤,以生成所述当前表达式所对应的测试用例,直至遍历完所述表达式集合中的表达式:获取所述当前表达式中所涉及的测试条件中的条件变量,其中,所述条件变量包括以下至少之一:可构造对象变量、非构造对象变量;和在生成所述当前表达式所对应的测试用例的过程中,在所述待测函数中所述测试条件的条件变量为所述可构造对象变量时,直接构造所述可构造对象变量得到构造后的条件变量,并将所述构造后的变量作为所述当前表达式所对应的测试用例中测试条件的条件变量,以生成所述当前表达式所对应的测试用例;和/或,在所述待测函数中所述测试条件的条件变量为所述非构造对象变量时,采用Mock函数模拟所述非构造对象变量得到模拟后的条件变量,并将所述模拟后的条件变量作为所述当前表达式所对应的测试用例中测试条件的条件变量,以生成所述当前表达式所对应的测试用例;和将生成的所述当前表达式所对应的测试用例存储在用于测试所述待测函数的所述测试用例集合中,其中,所述测试用例集合中包括所述表达式集合中每一个表达式所对应的测试用例。
11.根据权利要求10所述的装置,其特征在于,
所述第一处理模块通过以下步骤实现在所述待测函数中所述测试条件的条件变量为所述可构造对象变量时,直接构造所述可构造对象变量得到构造后的条件变量:在所述待测函数中所述条件变量所涉及的条件参数为常量参数时,直接构造所述常量参数,将构造后的所述常量参数作为所述测试用例中测试条件的条件变量的条件参数;
所述第一处理模块通过以下步骤实现在所述待测函数中所述测试条件的条件变量为所述非构造对象变量时,采用Mock函数模拟所述非构造对象变量得到模拟后的条件变量:在所述条件变量所涉及的条件参数为变量参数时,通过所述Mock函数将所述变量参数模拟为常量参数,将模拟后的常量参数作为所述测试用例中测试条件的条件变量的条件参数。
12.根据权利要求9所述的装置,其特征在于,还包括:
建立单元,用于在所述遍历所述待测函数中的函数语句,获取进入所述待测函数中任意一个或多个分支时的测试条件时,根据由所述待测函数获取到的所述测试条件建立与所述待测函数相匹配的树状结构,其中,所述树状结构中的每一个路径节点存储一个所述测试条件,所述树状结构中作为根节点的路径节点中的所述测试条件与作为子节点的路径节点中的所述测试条件具有嵌套关系。
13.根据权利要求12所述的装置,其特征在于,所述建立单元包括:
第二处理模块,用于依次读取所述待测函数中的函数语句作为当前函数语句,对所述当前函数语句执行以下步骤,直至读完所述待测函数中的全部函数语句;判断所述当前函数语句中是否包含所述测试条件;在所述当前函数语句中包含所述测试条件时,将所述测试条件对应存储到所述树状结构中对应的路径节点中;获取下一个函数语句作为所述当前函数语句。
14.根据权利要求13所述的装置,其特征在于,所述第二处理模块通过以下步骤实现判断所述当前函数语句中是否包含所述测试条件包括:
判断所述当前函数语句中是否包括用于标识所述测试条件的条件关键字;
若读取到的所述当前函数语句中包括所述条件关键字,则判断出所述当前函数语句为所述测试条件所在的函数语句。
15.根据权利要求13所述的装置,其特征在于,所述第二处理模块通过以下步骤实现将所述测试条件对应存储到所述树状结构中对应的路径节点中包括:
重复执行以下步骤,直至获取到所述测试条件在所述树状结构中对应的所述路径节点:
获取在所述当前函数语句之前出现的相邻的上一个测试条件作为当前历史测试条件;
判断所述当前函数语句中的所述测试条件与所述当前历史测试条件是否具有所述嵌套关系;
若所述当前函数语句中的所述测试条件与所述当前历史测试条件具有所述嵌套关系,则将所述当前函数语句中的所述测试条件存储到与所述当前历史测试条件对应的所述路径节点的子节点中;
若所述当前函数语句中的所述测试条件与所述当前历史测试条件不具有所述嵌套关系,则判断所述当前函数语句中的所述测试条件是否为所述树状结构中的所述根节点;
若所述当前函数语句中的所述测试条件是所述树状结构中的所述根节点,则将所述当前函数语句中的所述测试条件存储到新的树状结构的根节点中;
若所述当前函数语句中的所述测试条件不是所述树状结构中的所述根节点,则重新获取在所述当前历史测试条件之前出现的相邻的上一个测试条件作为下一个所述当前历史测试条件。
16.根据权利要求12至15中任一项所述的装置,其特征在于,所述记录单元包括:
读取模块,用于读取从所述树状结构的所述根节点分别到每一个叶子节点的所述测试条件,其中,所述树状结构的所述根节点到一个所述叶子节点之间的所有路径节点构成一个分支的路径,所述叶子节点为所述分支的最后一个路径节点;
记录模块,用于将每一条所述路径中读取到的所述测试条件作为与所述路径对应的所述分支的表达式,并存储到所述待测函数的所述表达式集合中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510767969.6A CN106681903B (zh) | 2015-11-11 | 2015-11-11 | 生成测试用例的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510767969.6A CN106681903B (zh) | 2015-11-11 | 2015-11-11 | 生成测试用例的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106681903A true CN106681903A (zh) | 2017-05-17 |
CN106681903B CN106681903B (zh) | 2020-05-12 |
Family
ID=58864848
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510767969.6A Active CN106681903B (zh) | 2015-11-11 | 2015-11-11 | 生成测试用例的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106681903B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108694124A (zh) * | 2018-06-19 | 2018-10-23 | 链家网(北京)科技有限公司 | 一种基于Mock的房产交易系统测试数据构造方法及系统 |
CN109446814A (zh) * | 2018-09-30 | 2019-03-08 | 北京金山安全软件有限公司 | 一种漏洞检测方法及装置 |
CN109697167A (zh) * | 2018-12-27 | 2019-04-30 | 江苏满运软件科技有限公司 | 测试变量的管理方法、系统、电子设备和存储介质 |
CN109901984A (zh) * | 2017-12-08 | 2019-06-18 | 北京京东尚科信息技术有限公司 | 生成大数据测试用例的方法和装置 |
CN109992498A (zh) * | 2017-12-29 | 2019-07-09 | 北京京东尚科信息技术有限公司 | 测试用例的生成方法及系统、计算机系统 |
CN110196800A (zh) * | 2018-02-24 | 2019-09-03 | 财付通支付科技有限公司 | 分布式事务测试方法、装置及系统 |
CN111611152A (zh) * | 2019-02-25 | 2020-09-01 | 北京嘀嘀无限科技发展有限公司 | 测试用例生成方法、装置、电子设备及可读存储介质 |
CN113157590A (zh) * | 2021-05-20 | 2021-07-23 | 中国工商银行股份有限公司 | 测试案例生成方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101165658A (zh) * | 2006-10-18 | 2008-04-23 | 国际商业机器公司 | 自动生成可再现运行时问题的单元测试用例的方法和系统 |
CN101436128A (zh) * | 2007-11-16 | 2009-05-20 | 北京邮电大学 | 软件测试用例自动生成方法及系统 |
US20090271139A1 (en) * | 2008-04-28 | 2009-10-29 | Kabushiki Kaisha Toshiba | Test case generation apparatus, generation method therefor, and program storage medium |
CN101788907A (zh) * | 2010-01-04 | 2010-07-28 | 北京航空航天大学 | 组合服务精简测试用例的自动生成方法及装置 |
CN104809067A (zh) * | 2015-05-07 | 2015-07-29 | 北京邮电大学 | 面向等式约束的测试用例生成方法和装置 |
CN104899136A (zh) * | 2015-05-15 | 2015-09-09 | 百度在线网络技术(北京)有限公司 | 一种用于生成测试用例的方法和装置 |
-
2015
- 2015-11-11 CN CN201510767969.6A patent/CN106681903B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101165658A (zh) * | 2006-10-18 | 2008-04-23 | 国际商业机器公司 | 自动生成可再现运行时问题的单元测试用例的方法和系统 |
CN101436128A (zh) * | 2007-11-16 | 2009-05-20 | 北京邮电大学 | 软件测试用例自动生成方法及系统 |
US20090271139A1 (en) * | 2008-04-28 | 2009-10-29 | Kabushiki Kaisha Toshiba | Test case generation apparatus, generation method therefor, and program storage medium |
CN101788907A (zh) * | 2010-01-04 | 2010-07-28 | 北京航空航天大学 | 组合服务精简测试用例的自动生成方法及装置 |
CN104809067A (zh) * | 2015-05-07 | 2015-07-29 | 北京邮电大学 | 面向等式约束的测试用例生成方法和装置 |
CN104899136A (zh) * | 2015-05-15 | 2015-09-09 | 百度在线网络技术(北京)有限公司 | 一种用于生成测试用例的方法和装置 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109901984A (zh) * | 2017-12-08 | 2019-06-18 | 北京京东尚科信息技术有限公司 | 生成大数据测试用例的方法和装置 |
CN109992498A (zh) * | 2017-12-29 | 2019-07-09 | 北京京东尚科信息技术有限公司 | 测试用例的生成方法及系统、计算机系统 |
CN110196800A (zh) * | 2018-02-24 | 2019-09-03 | 财付通支付科技有限公司 | 分布式事务测试方法、装置及系统 |
CN110196800B (zh) * | 2018-02-24 | 2023-05-12 | 财付通支付科技有限公司 | 分布式事务测试方法、装置及系统 |
CN108694124A (zh) * | 2018-06-19 | 2018-10-23 | 链家网(北京)科技有限公司 | 一种基于Mock的房产交易系统测试数据构造方法及系统 |
CN109446814A (zh) * | 2018-09-30 | 2019-03-08 | 北京金山安全软件有限公司 | 一种漏洞检测方法及装置 |
CN109697167A (zh) * | 2018-12-27 | 2019-04-30 | 江苏满运软件科技有限公司 | 测试变量的管理方法、系统、电子设备和存储介质 |
CN109697167B (zh) * | 2018-12-27 | 2022-03-25 | 江苏满运软件科技有限公司 | 测试变量的管理方法、系统、电子设备和存储介质 |
CN111611152A (zh) * | 2019-02-25 | 2020-09-01 | 北京嘀嘀无限科技发展有限公司 | 测试用例生成方法、装置、电子设备及可读存储介质 |
CN111611152B (zh) * | 2019-02-25 | 2023-08-04 | 北京嘀嘀无限科技发展有限公司 | 测试用例生成方法、装置、电子设备及可读存储介质 |
CN113157590A (zh) * | 2021-05-20 | 2021-07-23 | 中国工商银行股份有限公司 | 测试案例生成方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106681903B (zh) | 2020-05-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106681903A (zh) | 生成测试用例的方法及装置 | |
Magel et al. | Applying software complexity metrics to program maintenance | |
CN109857667A (zh) | 接口自动化测试方法、测试装置、测试设备及存储介质 | |
CN107993085A (zh) | 模型训练方法、基于模型的用户行为预测方法及装置 | |
CN106651392A (zh) | 一种智能商业选址方法、装置及系统 | |
CN108804704A (zh) | 一种用户深度画像方法及装置 | |
CN103761189B (zh) | 一种测试用例管理方法及系统 | |
CN109582969A (zh) | 实体匹配方法、装置及电子设备 | |
CN110008349A (zh) | 计算机执行的事件风险评估的方法及装置 | |
CN106874187A (zh) | 代码覆盖率收集方法和装置 | |
CN110019519A (zh) | 数据处理方法、装置、存储介质和电子装置 | |
CN106843941A (zh) | 信息处理方法、装置和计算机设备 | |
CN106033469A (zh) | 用于大数据的结构化查询的高效性能预测的方法和系统 | |
CN109982361A (zh) | 信号干扰分析方法、装置、设备及介质 | |
CN108874470A (zh) | 一种信息处理方法及服务器、计算机存储介质 | |
CN106874204A (zh) | 自动化测试定制方法及定制系统 | |
CN110020144A (zh) | 一种推荐模型建立方法及其设备、存储介质、服务器 | |
CN107038108A (zh) | 软件的测试方法和装置 | |
CN107729247A (zh) | 基于jenkins检查源程序代码错误的方法和装置 | |
CN107080945A (zh) | 测试游戏中人工智能行为的方法、装置及电子设备 | |
CN109871770A (zh) | 房产证识别方法、装置、设备及存储介质 | |
CN105323763B (zh) | 一种垃圾短消息的识别方法及装置 | |
CN107563789A (zh) | 数据处理方法、系统、终端及计算机可读存储介质 | |
CN110334012A (zh) | 一种风险评估方法及装置 | |
CN108121749A (zh) | 网站用户行为分析方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |