基于领域知识的测试用例生成方法与流程

文档序号:19879045发布日期:2020-02-08 06:46阅读:198来源:国知局

本发明涉及软件测试技术领域,特别是涉及一种基于领域知识的测试用例生成方法。



背景技术:

软件测试是软件系统开发周期的重要组成部分,对确保软件系统的功能完整性、正确性以及稳定性有着重要意义。随着现代软件工程的发展,软件的规模越来越大,功能也越来越复杂,自动化测试已经逐渐取代人工测试,得到越来越广泛的应用。自动化测试一般包括测试数据准备,测试用例自动执行与校验,测试报告生成等。

其中,测试数据准备的充分与否决定了测试的效果。对于数据特性简单的系统可以自动地生成测试数据。然而,对于针对特定领域,例如金融交易等开发的软件,会存在输入数据结构复杂,根据对应的业务逻辑,各个数据字段之间存在不同约束的情况。为了测试软件功能的正确性,需要生成满足所有约束的输入数据,现有的工具无法做到这一点。实际上,在对这类软件进行测试时,仍然需要依靠人工编写测试数据进行测试。

依靠人工准备测试数据容易造成功能场景覆盖不全面的情况,并且需要消耗大量的时间在测试数据编写上,延长了测试周期,降低了软件开发的效率。



技术实现要素:

本发明的目的是针对上述技术问题而提供的一种基于领域知识的测试用例生成方法,该方法通过读取初始数据约束信息自动化地生成大量测试用例,相对于人工编写测试用例减少了大量了重复工作,并且对功能场景的覆盖更加全面。

实现本发明目的的具体技术方案是:

一种基于领域知识的测试用例生成方法,该方法包括以下具体步骤:

步骤1:约束记录

以一种计算机可读的数据形式,记录针对待测软件的一组初始数据约束信息以及若干组期望测试结果信息;

所述一组初始数据约束信息是若干条数据约束的集合;初始数据约束信息描述了待测软件能够正确接收的输入数据应该满足什么样的条件和限制,而每条数据约束描述了输入数据中的一个字段的数据应该满足的条件和限制;每条数据约束包括以下内容:

1)本条数据约束所描述的字段的名称,或任何能够唯一地标识这一字段的信息;

2)对该字段的数据类型的描述,所选的数据类型包括但不限于字符串、整型、浮点数、数组和字典;

3)对该字段的取值的具体约束的描述,包括但不限于用正则表达式描述字符串类型的字段的数据应该符合的格式或用区间上下限限定浮点数类型的字段的数据的取值范围;在描述中能够包含对其他字段的值的引用,从而表达字段之间的依赖关系;

记录若干组期望测试结果信息;每组期望测试结果信息包括一组输出数据约束信息,一组输出数据约束信息是若干条数据约束的集合;输出数据约束信息描述了待测软件在接收到满足该组期望测试结果信息所对应的测试数据约束信息所描述的条件和限制的输入数据后输出的数据应该满足的条件和限制,而每条数据约束描述了输出数据中的一个字段的数据应该满足的条件和限制;每条数据约束所包括的内容与所述一组初始数据约束信息中的数据约束所包括的内容相同;每组期望测试结果信息所对应的测试数据约束信息的构建将在步骤2中描述;

一组期望测试结果信息中包括或者不包括一组覆盖约束,一组覆盖约束是若干条数据约束的集合;当覆盖约束存在时,会在构建测试数据约束信息时被使用;覆盖约束描述了该组期望测试结果信息所对应的测试数据约束信息与初始数据约束信息之间的差异,其作用是使得生成的数据符合该组期望测试结果信息的测试目标;

步骤2:测试生成

以一组初始数据约束信息和若干组期望测试结果信息作为输入,为每组期望测试结果信息生成一组测试用例,每组测试用例的数量由用户指定;对每组期望测试结果信息执行以下子步骤:

步骤2.1:构建测试数据约束信息

构建该组期望测试结果信息所对应的测试数据约束信息;若该组期望测试结果信息不包括覆盖约束,则测试数据约束信息与初始数据约束信息相同;若包含覆盖约束,执行以下操作:

ⅰ)生成一组数据约束的集合a,内容与初始数据约束信息相同;

ⅱ)对覆盖约束中每条数据约束c,查看其对应的字段名称或唯一标识信息,若a中存在一条数据约束o,o对应的字段名称或唯一标识信息与c相同,则将o从a中移除;

ⅲ)将覆盖约束中的数据约束全部加入集合a;

最后得到的集合a即是该组期望测试结果信息对应的测试数据约束信息;

步骤2.2:数据生成

以步骤2.1构建的测试数据约束信息作为输入,执行以下操作:

ⅰ)查看测试数据约束信息中的每条数据约束所描述的字段名称或唯一标识信息,为每个字段找到对应的数据约束;例如,假设测试约束信息包含三条数据约束ca、cb、cc,它们所描述的字段的名称分别为“a”,“b”,“c”,则在这一子步骤中生成的数据包括三个字段fa,fb,fc,它们的名称分别为“a”,“b”,“c”,它们对应的数据约束分别为ca、cb、cc。

ⅱ)查看每个字段,若该字段还没有被赋值,并且其对应的数据约束的内容当中不包含对其他的字段的值的引用,则随机生成一个满足该数据约束所描述的条件及限制的值,并将该值覆盖给该字段;

ⅲ)查看每个字段,若该字段还没有被赋值,并且其对应的数据约束的内容当中包含对其他的字段的值的引用,那么查看每一处引用,若该处引用所指向的字段已经被赋值,则修改数据约束,将数据约束的内容中表示该处引用的数据替换为其所指向的字段的值;

ⅳ)重复步骤ⅱ)、步骤ⅲ),直到每个字段都已被赋值;

ⅴ)将所有字段以及对应的赋值以待测软件能够识别的数据形式存储,称被存储的数据是一条测试数据;

ⅵ)重复步骤i)~步骤v),直到存储下来的测试数据的数量达到用户指定的数量;

步骤2.3:用例生成

以步骤2.2所生成的若干条测试数据作为输入,为每条测试数据生成一条对应的测试用例程序;为一条测试数据生成的测试用例程序时包括执行以下操作的代码:

ⅰ)将测试数据输入待测软件

等待软件执行,获取软件的输出数据;

ⅱ)查看期望结果信息中的输出数据约束信息中的每条数据约束,若数据约束的内容中包含对其他字段的值的引用,则根据字段名称或唯一标识信息在测试数据或者本次输出数据中查找该处引用所指向的字段的值,并将数据约束的内容中标识该处引用的数据替换为该字段的值;

ⅲ)查看输出结果中的每个字段,根据字段名称或唯一标识信息在输出数据约束信息中查找得到该字段对应的数据约束,若该字段的值满足对应的数据约束所描述的条件及限制,则继续查看下一个字段;否则,执行用户事先指定的在测试不通过时执行的操作;

ⅳ)如果所有字段的值均满足对应的数据约束,执行用户事先指定的在测试通过时执行的操作。

所述记录若干组期望测试结果信息,其每组期望测试结果信息包括如下内容:

ⅰ)一组输出数据约束信息,包含若干条数据约束。

ⅱ)一组覆盖约束,包含若干条数据约束;期望测试结果信息包含或不包含覆盖约束。

本发明通过读取初始数据约束信息自动化地生成大量测试用例,相对于人工编写测试用例减少了大量了重复工作,并且对功能场景的覆盖更加全面。除了正确的、满足约束的输入以外,本方法还引入了覆盖约束,使测试人员能够临时修改部分约束以生成各类异常输入,用以测试软件系统在异常输入下的健壮性,有效提升测试环节的效率和软件测试的效果。

具体实施方式

下面结合实施例对本发明详细描述。

实施例

根据本发明的方法,测试人员首先根据软件的接口定义等信息,定义对应的初始数据约束信息与若干期望结果信息。在本实施例中,使用自定义的语法记录针对待测软件的一组初始数据约束信息以及若干组期望测试结果信息。下面给出通过该语法定义的初始数据约束信息的一个例子:

goodsidisstringformat"[a-z]{4}"

objctnmisintegerin[8,9,10]

orderidisstringin["2508_<%goodsid%>","0000"]

上述初始数据约束信息的例子中,每一行均表示一条数据约束,因此上述例子描述了输入数据中的三个字段的数据分别应该满足的条件和限制。按照本实施例的方案,在每条数据约束中,“is”是一个固定的关键字,“is”左边应当有且仅有一个不包含空格的字符串表示该数据约束所描述的字段的名称,“is”右边的第一个不含空格的字符串描述了该字段的数据类型,数据约束的剩余部分是对该字段的取值的具体约束的描述。同时,在每条数据约束中能够使用在“<%”和“%>”这一对字符串中填写字段名称的形式引用其他字段的值。例如,“<%goodsid%>”表示对名称为“goodsid”的字段的值的引用。

因此在上述例子中,第一条数据约束描述了名称为“goodsid”的字段,其数据应该为字符串类型,且字符串的内容满足正则表达式“[a-z]{4}”;第二条数据约束描述了名称为“objctnm”的字段,其数据应该为整型数据,且取值只能为8、9、10中的一个;第三条数据描述了名称为“orderid”的字段,其数据应该为字符串类型,其具体约束包含对名为“goodsid”的字段的值的引用,因此该字段依赖于名为“goodsid”的字段,其取值范围会根据名为“goodsid”的字段的值变化。例如,当goodsid的数据为“nero”时,该字段的数据必须为“2508_nero”或“0000”中的一个。

下面给出通过本实施例中自定义的语法定义的期望测试结果信息的一个例子:

expect:

retcodeisintegervalue1

retmsgisstringvalue"objctnm取值超出范围"

endexpect

overwrite:

objctnmisintegervalue20

endoverwrite

字符串“expect:”以及“endexpect”之间的每一行表示输出数据约束信息中的一条数据约束,“overwrite”和“endoverwrite”之间的每一行表示覆盖约束中的一条数据约束,这些数据约束的格式与之前给出的初始数据约束信息中的数据约束的格式相同。

上述例子中的输出数据约束信息表示待测软件在接收到满足该组期望测试结果信息所对应的测试数据约束信息所描述的条件和限制的输入数据后输出的数据中应包含两个字段,一个字段的名称为“retcode”且其数据类型应该是整型,取值固定为1;另一个字段的名称为“retmsg”且其数据类型应该是字符串,取值固定为“objctnm取值超出范围”。

上述例子中的覆盖约束表示该组期待测试结果信息所对应的测试数据约束信息中,对名为“objctnm”的字段的数据约束与初始数据约束信息不同。在测试数据约束信息中,名为“objctnm”的字段的取值固定为20。因此,该组期望测试结果信息的测试目标是待测软件在objctnm的取值超出范围时的行为。

在overwrite下定义了一条覆盖约束,表示字段objctnm的数据固定为20,这样生成的测试数据中,字段objctnm将违反原本的约束。若软件正确运行,则该错误应该能被发现,并输出相应的错误码以及错误信息。因此,测试人员在expect下定义了上述数据约束,表示由该期望结果信息与初始数据约束信息组合生成的测试数据输入软件后,软件输出的数据应该包含两个字段retcode与retmsg,retcode的值应为1,而retmsg的值应为“objctnm取值超出范围”。

下面以上述初始数据约束信息以及期望测试结果信息为例描述测试用例的生成过程。首先需要构建测试数据约束信息。初始化一组数据约束集合a,内容与初始数据约束信息相同,即为:

goodsidisstringformat"[a-z]{4}"

objctnmisintegerin[8,9,10]

orderidisstringin["2508_<%goodsid%>","0000"]

查看期望测试结果信息中的覆盖约束,发现覆盖约束和集合a中均存在描述名为“objctnm”的字段的数据约束,将对应的数据约束从集合a中移除,此时集合a的内容为:

goodsidisstringformat"[a-z]{4}"

orderidisstringin["2508_<%goodsid%>","0000"]

最后将覆盖约束中的数据约束全部加入集合a,得到测试数据约束信息,内容为:

goodsidisstringformat"[a-z]{4}"

objctnmisintegervalue20

orderidisstringin["2508_<%goodsid%>","0000"]

之后根据测试数据约束信息生成测试数据。查看每条数据约束,针对名为“goodsid”和“objctnm”的两个字段的数据约束的内容中不包含任何引用,因此可以为其生成数据。goodsid的约束要求数据符合正则表达式“[a-z]{4}”,因此任意由4个大写字母构成的字符串均符合约束。假设在这一次生成中,goodsid的取值为“nara”,而objctnm的取值固定为20。再次查看每条数据约束,针对名为“orderid”的字段的数据约束的内容中包含对名为“goodsid”的字段的值的引用,而goodsid已经被赋值为“nara”,因此将该处引用的数据替换为“nara”,即,上述测试数据约束信息中的第三条数据约束的内容被修改为:

orderidisstringin["2508_nara","0000"]

其中不包含任何引用,因此能够为orderid生成数据。假设在这一次的生成中,orderid的取值为“2508_nara”。至此,一条新的测试数据生成完毕,各个字段取值如下:

goodsid:"nara"

objctnm:20

orderid:"2508_nara"

接下来,根据软件系统具体的输入方式将测试数据转换为软件系统可以接受的形式。假设待测系统使用json字符串作为输入和输出数据的格式,则上述数据应该被转换为如下字符串:

{"goodsid":"nara","objctnm":20,"orderid":"2508_nara"}

这一转换过程应当是简单且自然的,这里不做详细描述。

接下来,生成实际可用的测试用例。一般而言,在这一步可以生成一段代码,代码执行以下操作:

1.将之前生成的json字符串输入软件。

2.等待软件执行,获取软件的输出数据。

3.检查输出数据,要求输出数据应为json字符串,并包含如下数据:

{"retcode":1,"retmsg":"objctnm取值超出范围"}

根据检查结果,执行对应的固定操作。

上述操作的逻辑是确定的,因此生成相应的代码是完全可行的。至此,一条测试用例生成完毕。上述生成操作不需要任何人为干预,可以自动化地生成大量测试样例,尽可能多地覆盖各类场景。

可以理解的是,以上的初始数据约束信息、期望结果信息、测试用例生成均为示意性说明,不应理解为对本发明方法的限制。本领域技术人员可以根据实际需求,对各种信息中定义的内容进行增减、删改,或者采用不同的语法格式进行定义。对于采用不同输入输出方式的软件系统,在生成测试样例时也需要作出相应的修改以适配待测软件,这些并不影响本发明整体方案的实施。

以上所述仅是本发明的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1