一种测试用例生成方法、装置、电子设备及存储介质与流程

文档序号:31872839发布日期:2022-10-21 20:05阅读:28来源:国知局
一种测试用例生成方法、装置、电子设备及存储介质与流程

1.本发明涉及计算机技术领域,尤其涉及一种测试用例生成方法、装置、电子设备及存储介质。


背景技术:

2.测试用例按照测试意图可以分为正面测试用例和负面测试用例,相关技术根据预先设定好的栏位表,遍历栏位表中的有效栏位值生成正面测试用例,遍历栏位表中的无效栏位值生成负面测试用例。相关技术需要分别单独生成正面测试用例和负面测试用例,测试用例的生成效率低。


技术实现要素:

3.为了解决上述问题,本发明实施例提供了一种测试用例生成方法、装置、电子设备及存储介质,以至少解决相关技术测试用例生成效率低的问题。
4.本发明的技术方案是这样实现的:
5.第一方面,本发明实施例提供了一种测试用例生成方法,该方法包括:
6.在设定类文件被加载的情况下,确定所述设定类文件中的方法的输入参数的数据类型;
7.基于所述数据类型生成对应的方法的测试用例模板;
8.基于所述测试用例模板生成对应的方法的正面测试用例;
9.基于所述正面测试用例生成对应的方法的负面测试用例。
10.上述方案中,所述基于所述测试用例模板生成对应的方法的正面测试用例,包括:
11.基于设定的第一集合中的值和所述测试用例模板生成对应的方法的正面测试用例;所述设定的第一集合中的值表征对应的方法的正面测试用例中的变量的值。
12.上述方案中,所述基于所述正面测试用例生成对应的方法的负面测试用例,包括:
13.基于所述数据类型确定设定的第二集合中的值;所述设定的第二集合中的值表征对应的方法的负面测试用例中的变量的值;
14.基于所述第二集合中的值和所述正面测试用例生成对应的方法的负面测试用例。
15.上述方案中,所述基于所述第二集合中的值和所述正面测试用例生成对应的方法的负面测试用例,包括:
16.在所述正面测试用例中插入一个所述第二集合中的值,生成一个负面测试用例。
17.上述方案中,所述方法还包括:
18.基于设定类加载器加载所述设定类文件;
19.在所述设定类加载器加载所述设定类文件失败的情况下,由所述设定类加载器的父类加载器加载所述设定类文件。
20.上述方案中,所述方法还包括:
21.从所述设定类文件的路径下获取调用点代码;
22.运行所述调用点代码;所述调用点代码用于从设定数据库中获取所述正面测试用例或所述负面测试用例,并运行所述正面测试用例或所述负面测试用例。
23.上述方案中,所述方法还包括:
24.获取所述正面测试用例或所述负面测试的测试结果;
25.在所述测试结果包括可变内容的情况下,基于设定的正则表达式确定所述测试结果是否通过。
26.上述方案中,所述方法还包括:
27.在运行所述正面测试用例或所述负面测试的过程中获取所述方法产生的异常;
28.确定所述异常是否存储在设定的异常表中,在所述异常未存储在所述设定的异常表中的情况下,发送设定信息;所述设定信息用于提示存在需要修复的漏洞。
29.第二方面,本发明实施例提供了一种测试用例生成装置,该装置包括:
30.确定模块,用于在设定类文件被加载的情况下,确定所述设定类文件中的方法的输入参数的数据类型;
31.第一生成模块,用于基于所述数据类型生成对应的方法的测试用例模板;
32.第二生成模块,用于基于所述测试用例模板生成对应的方法的正面测试用例;
33.第三生成模块,用于基于所述正面测试用例生成对应的方法的负面测试用例。
34.第三方面,本发明实施例提供了一种电子设备,包括处理器和存储器,所述处理器和存储器相互连接,其中,所述存储器用于存储计算机程序,所述计算机程序包括程序指令,所述处理器被配置用于调用所述程序指令,执行本发明实施例第一方面提供的测试用例生成方法的步骤。
35.第四方面,本发明实施例提供了一种计算机可读存储介质,包括:所述计算机可读存储介质存储有计算机程序。所述计算机程序被处理器执行时实现如本发明实施例第一方面提供的测试用例生成方法的步骤。
36.本发明实施例通过在设定类文件被加载的情况下,确定设定类文件中的方法的输入参数的数据类型,基于数据类型生成对应的方法的测试用例模板,基于测试用例模板生成对应的方法的正面测试用例,基于正面测试用例生成对应的方法的负面测试用例。本发明实施例可以基于正面测试用例生成对应的方法的负面测试用例,提高了测试用例的生成效率。
附图说明
37.图1是本发明实施例提供的一种测试用例生成方法的实现流程示意图;
38.图2是本发明用于实施例提供的一种类文件遍历流程的示意图;
39.图3是本发明实施例提供的另一种测试用例生成方法的实现流程示意图;
40.图4是本发明应用实施例提供的一种类加载器继承关系示意图;
41.图5是本发明应用实施例提供的一种类加载器加载类文件的流程示意图;
42.图6是本发明应用实施例提供的一种测试用例模板复制流程的示意图;
43.图7是本发明应用实施例提供的一种测试用例模板的生成流程的示意图;
44.图8是本发明实施例提供的另一种测试用例生成方法的实现流程示意图;
45.图9是本发明应用实施例提供的一种利用正面测试用例生成负面测试用例的流程
图;
46.图10是本发明实施例提供的另一种测试用例生成方法的实现流程示意图;
47.图11是本发明应用实施例提供的一种预期结果的生成流程的示意图;
48.图12是本发明应用实施例提供的一种测试结果的判定流程的示意图;
49.图13是本发明实施例提供的另一种测试用例生成方法的实现流程示意图;
50.图14是本发明实施例提供的一种测试用例生成装置的示意图;
51.图15是本发明一实施例提供的电子设备的示意图。
具体实施方式
52.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
53.在软件测试领域,测试用例(test case)是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,用于核实是否满足某个特定软件需求。测试用例按照测试意图可以分为正面测试(positive testing,也称正向测试)用例和负面测试(negative testing,也称反向测试)用例。正面测试用例尽可能保证函数成功通过测试且覆盖尽可能多的代码路径,正面测试用例用于测试系统是否完成了它应该完成的工作。负面测试用例则尽量模拟非预期的输入从而引发错误,负面测试用例可以检查系统的容错能力和可靠性。
54.对于不同的函数而言,输入参数的个数和类型均不相同,为了确定每个参数的输入值,相关技术通过栏位表记录函数的输入参数的取值范围(称为“栏位值设定”),依据栏位的栏位值设定生成有效栏位值列表和无效栏位值列表,通过遍历有效栏位值列表可以生成正面测试用例,遍历无效栏位值列表可以生成负面测试用例。生成测试用例前,先人工对大量接口函数进行配置,然后利用配置信息生成用例输入数据,但没有生成预期结果。
55.上述相关技术中所描述的“栏位值设定”需要人工进行配置,上述相关技术存在以下缺点:1、对中大型应用程序,接口数量庞大,接口参数为复杂对象时,需要设计每个字段的取值范围,工作量大。2、人工配置容易出现考虑不全面的情况,特别是接口参数为复杂对象的时候。3、.维护负担重,接口参数或业务发生变化时需要对应修改“栏位值设定”。4、不能保证负面测试用例的覆盖率,生成负面测试用例时仅遍历生成无效输入,没有考虑覆盖率。5、没有预期结果,也没有考虑输出结果的正确性如何校验,不能达到“测试用例要满足可以反复运行、自动判定结果”这两个要求。6、分别单独生成正面测试用例和负面测试用例,生成的多个负面测试用例之间相对独立,无法充分利用先前生成的测试用例数据,测试用例的生成效率低。
56.针对上述相关技术的缺点,本发明实施例提供了一种测试用例生成方法,至少能够提高测试用例的生成效率。为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。
57.图1是本发明实施例提供的一种测试用例生成方法的实现流程示意图,所述测试用例生成方法的执行主体可以为电子设备,电子设备可以为台式电脑、笔记本电脑或服务器等。参考图1,测试用例生成方法包括:
58.s101,在设定类文件被加载的情况下,确定所述设定类文件中的方法的输入参数的数据类型。
59.这里,类文件是指用javac编译器产生的.class文件,方法是定义在类内的函数,一个类文件中可能包括多个方法。设定类文件中的方法是测试用例的测试对象,利用测试用例测试设定类文件中的方法。
60.在对设定类文件进行加载之前,用户需要配置目标工程的根路径,用户可以在maven软件(一种项目对象模型管理工具)中配置与当前项目有关的信息,包括项目根目录、服务器端访问路径、服务器访问密钥、不需要测试的代码包路径。然后,从根目录开始,遍历工程中的java类文件,跳过用户配置的不需要测试的包路径,跳过接口类、枚举类和抽象类。
61.参考图2,图2是本发明用于实施例提供的一种类文件遍历流程的示意图。首先,选定一个遍历范围,比如遍历范围为某个文件夹,对文件夹中的所有文件进行遍历,判断每一个文件是否为文件夹,若是文件夹,则获取该文件夹里的子文件,判断是否有子文件,如果没有则跳过该文件。如果有子文件,则遍历所有子文件,判断子文件是否是文件夹。如果文件不是文件夹,而是.class文件,则判断该.class文件是否需要测试,如果需要就使用类加载器加载该.class文件。
62.在本发明实施例中,设定类文件中的方法的输入参数的数据类型只有在设定类文件被加载的情况下才能够获取到。
63.参考图3,在一实施例中,所述方法还包括:
64.s301,基于设定类加载器加载所述设定类文件。
65.设定类加载器按照设定类文件的绝对路径进行类加载,设定类加载器负责将.class文件加载到内存中,并为之生成对应的java.lang.class对象。
66.s302,在所述设定类加载器加载所述设定类文件失败的情况下,由所述设定类加载器的父类加载器加载所述设定类文件。
67.设定类加载器破坏双亲委派模式,先由设定类加载器加载设定类文件,若设定类加载器加载失败,则委托设定类加载器的父类加载器加载设定类文件,目的是让java虚拟机不间断运行的情况下,工程目录下的类可以被反复修改和反复加载、卸载。
68.参考图4,图4是本发明应用实施例提供的一种类加载器继承关系示意图。图4中自定义类加载器为本发明实施例中的设定类加载器,appclassloader是应用程序(application)类加载器,extclassloader是标准扩展(extension)类加载器,bootstrapclassloader是启动(bootstrap)类加载器。其中,启动(bootstrap)类加载器:负责将java_home/lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。标准扩展(extension)类加载器:是由sun的extclassloader(sun.misc.launcher$extclassloader)实现的。它负责将java_home/lib/ext或者由系统变量java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载
器。应用程序(application)类加载器:是由sun的appclassloader(sun.misc.launcher$appclassloader)实现的。它负责将系统类路径(classpath)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。由于这个类加载器是classloader中的getsystemclassloader()方法的返回值,因此一般称为系统(system)加载器。除此之外,还有自定义类加载器,它们之间的层次关系被称为类加载器的双亲委派模型。该模型要求除了顶层的启动类加载器外,其余的类加载器都应该有自己的父类加载器,而这种父子关系一般通过组合(composition)关系来实现,而不是通过继承(inheritance)。这里,设定类加载器的父类加载器为应用程序(application)类加载器。
69.参考图5,图5是本发明应用实施例提供的一种类加载器加载类文件的流程示意图。首先,使用设定类加载器加载类文件,判断是否加载成功。如果没有加载成功,则由设定类加载器的父类加载器加载类文件。如果父类加载器都无法加载成功,则抛出异常。设定类加载器先于父类加载器进行类加载,实现类文件重复加载、卸载,有利于java虚拟机内存垃圾回收,降低服务器内存占用。
70.在一实施例中,在设定类加载器加载设定类文件的过程中,使用反射机制获取设定类文件中的方法的输入参数的数据类型。
71.java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。加载完类之后,堆内存就会产生class类对象,且只会产生一个,这个类对象包含了该类的所有信息,可以通过这个对象看到类的结构,这就像一面镜子所以称之为反射。
72.通过反射机制可以获取设定类文件中的方法的输入参数的数据类型,在实际应用中,通过反射机制解析方法的输入参数的field属性,比如通过java.lang.reflect.field可以获取当前对象的成员变量的类型,和重新设值的方法。这里,方法的输入参数的数据类型包括:基本数据类型、包装类型、string、数组类型、列表类型和复合类型。通过反射机制,类中的受保护方法和私有方法也能进行测试。
73.s102,基于所述数据类型生成对应的方法的测试用例模板。
74.在本发明实施例中,测试用例模板是一个自定义的数据结构,它能准确描述任意java类型、快速遍历和快速复制的功能。测试用例模板包含3个属性:leafnodeview、treenodeview和params。其中,params是方法参数树形结构的根节点,存储了参数结构的描述。leafnodeview是方法参数树形结构的叶子节点引用,是params中的叶子节点的快照,用于快速遍历。treenodeview是方法参数树形结构的非叶子节点引用,是params中的非叶子节点的快照,用于快速遍历。
75.测试用例模板由clonebalelist(可克隆列表)、cloneablemap(可克隆映射表)和placeholder(占位符)三种数据类型组合而成。若方法的输入参数的数据类型为数组类型,则可以用clonebalelist类型模拟。若方法的输入参数的数据类型为复合类型,则可以用cloneablemap模拟。由于java基本数据类型及其包装类型、string类型在参数传递时表现出值传递的特性,故使用placeholder作为占位符进行模拟,该placeholder记录了占位位置的数据类型和一个真实值。因此,使用placeholder、clonebalelist和cloneablemap这3种类型即可模拟所有java数据类型,为了快速复制,clonebalelist实现基于arraylist(数
组列表)的深拷贝、cloneablemap实现基于hashmap(哈希映射表)的深拷贝。
76.参考图6,图6是本发明应用实施例提供的一种测试用例模板复制流程的示意图。测试用例的树节点实现了如下深拷贝功能,加快复制速度:树节点cloneablelist、cloneablemap和placeholder均实现接口treenode,treenode存在一个next指针,对象a复制生成新对象a’后,a的next指针指向新元素a’。首先遍历复制testcasemodel的params属性,当params属性中的树节点复制完成后,复制leafnodeview、treenodeview时,仅需要遍历旧leafnodeview和treenodeview列表,分别取next存入新的leafnodeview、treenodeview列表。
77.参考图7,图7是本发明应用实施例提供的一种测试用例模板的生成流程的示意图。测试用例模板的生成流程包括:首先,通过反射机制获取类的全部field属性,遍历filed,跳过其中final修饰的field。判断field的数据类型,若field为基本数据类型、包装类型和string类型,则生成placeholder;若field为数组类型和列表类型,则生成cloneablelist;若field为map类型和复合类型,则生成cloneablemap。生成上述对象后,在leafnodeview(叶子节点的快照)或treenodeview(非叶子节点的快照)中保存一份引用。
78.测试用例模板由上述三种数据类型的对象组合而成,测试用例模板可以准确表达任意java方法参数的内部结构和取值。测试用例模板可以认为是一个没有插入具体变量值(变量值为空)的测试用例,只需往测试用例模板中插入变量值即可生成测试用例。
79.s103,基于所述测试用例模板生成对应的方法的正面测试用例。
80.在实际应用中,复制测试用例模板,遍历leafnodeview在测试用例模板中插入正常值即得到正面测试用例,正常值指正面测试用例中的变量的值,比如对象人有2个属性(姓名、年龄),测试用例模板为person[name=
“”
,age=
“”
],插入变量值zhangsan”和“19”,即得到一个正面测试用例person[name=“zhangsan”,age=“19”]。
[0081]
在一实施例中,所述基于所述测试用例模板生成对应的方法的正面测试用例,包括:
[0082]
基于设定的第一集合中的值和设定的第一集合中的值和所述测试用例模板生成对应的方法的正面测试用例;所述设定的第一集合中的值表征对应的方法的正面测试用例中的变量的值。
[0083]
第一集合中的值需要预先设定好,在使用的时候直接往测试用例模板中插入第一集合中的值即可生成正面测试用例。
[0084]
生成的测试用例需要通过自定义序列化工具序列化成json字符串格式的测试用例,加入对应的方法的测试用例集。在实际应用中,可以以覆盖率指标为依据筛选出覆盖率高的正面测试用例加入对应的方法的测试用例集。覆盖率通常被用来衡量测试的充分性和完整性,这里的覆盖率指代码覆盖率,代码覆盖率是指至少被执行了一次的条目数占整个条目数的百分比,代码覆盖率越高越能说明测试用例设计是充分且完备的。
[0085]
这里,基于测试用例模板准确表达参数结构和快速复制的功能,同一个方法生成大量正面测试用例和负面测试用例时,仅需要使用1趟反射技术来解析参数结构,后续可直接使用测试用例模板生成测试用例,而不是每生成一个测试用例就使用1次反射技术解析参数结构,提升了参数解析的性能和测试用例生成效率。
[0086]
s104,基于所述正面测试用例生成对应的方法的负面测试用例。
[0087]
将正面测试用例中的变量的值更改为异常值,即可生成负面测试用例。
[0088]
参考图8,在一实施例中,所述基于所述正面测试用例生成对应的方法的负面测试用例,包括:
[0089]
s801,基于所述数据类型确定设定的第二集合中的值;所述设定的第二集合中的值表征对应的方法的负面测试用例中的变量的值。
[0090]
前面说到测试用例模板由clonebalelist(可克隆列表)、cloneablemap(可克隆映射表)和placeholder(占位符)三种数据类型的对象组合而成,clonebalelist(可克隆列表)、cloneablemap(可克隆映射表)和placeholder(占位符)基于方法的输入参数的数据类型确定。
[0091]
对于clonebalelist,异常值包括null和空列表;对于cloneablemap,异常值包括null和空映射表;对于placeholder,根据其具体代表的类型异常值不同:byte/byte(0,0b1111111,随机值),short/short(-32768,0,32767,随机值),int/integer(0x80000000,0,0x7fffffff,随机值),long/long(0x8000000000000000l,0,0x7fffffffffffffffl,随机值),float/float(1.4e-45f,0,3.4028235e+38f,nan,随机值),double/double(4.9e-324,0,1.7976931348623157e+308,nan,随机值),char/character(\u0000,\uffff,随机值),boolean/boolean(true,false),string(null,空字符串,空白字符,超长字符串,sql注入字符串,跨站脚本字符串,随机字符串),此外,上述包装数据类型的异常数据还包括null。
[0092]
上述异常值即为设定的第二集合中的值,只要需要将正面测试用例中的变量的值更改为上述异常值,即可得到负面测试用例。
[0093]
s802,基于所述第二集合中的值和所述正面测试用例生成对应的方法的负面测试用例。
[0094]
在一实施例中,所述基于所述第二集合中的值和所述正面测试用例生成对应的方法的负面测试用例,包括:
[0095]
在所述正面测试用例中插入一个所述第二集合中的值,生成一个负面测试用例。
[0096]
例如:对象人有2个属性(姓名、年龄),表示为person[name,age],若生成的1个正面测试用例为person[name=”zhangsan”,age=19],使用上述方法生成的负面测试用例包括:
[0097]
person[name=null,age=19]
[0098]
person[name=
“”
,age=19]
[0099]
person[name=“zhangsanasdddddddddddddddddddddddddddasfas”。age=19]
[0100]
person[name=“wejsdgadg”,age=19]
[0101]
person[name=“or 1=1”,age=19]
[0102]
person[name=”《/div》《script type="text/javascript"》alert('跨站脚本攻击!')《/script》”,age=19]
[0103]
person[name=”zhangsan”,age=0]
[0104]
person[name=”zhangsan”,age=0x80000000]
[0105]
person[name=”zhangsan”,age=0x7fffffff]
[0106]
person[name=”zhangsan”,age=-12]。
[0107]
这里使用单一变量法,每生成一个负面测试用例的时候,只在正面测试用例中插
入1个第二集合中的值,其他变量的值保持不变。这样负面测试用例的覆盖率依赖对应的正面测试用例覆盖率,只要在生成正面测试时通过覆盖率指标进行筛选,选出覆盖率高的正面测试用例,然后使用单一变量法在正面测试用例中插入异常值,这样对覆盖率影响最小,负面测试用例覆盖率也会比随机生成的相同数量的负面测试用例覆盖率高。而且生成负面测试用例时可以复用正面测试用例数据,提高了测试用例的生成效率,尤其是负面测试用例的生成效率。
[0108]
参考图9,图9是本发明应用实施例提供的一种利用正面测试用例生成负面测试用例的流程图。首先,复制一份正面测试用例,在复制的正面测试用例上,对index指向的节点赋予异常值,从而生成负面测试用例,然后将该负面测试用例序列化成json字符串,加入对应的方法的测试用例集。
[0109]
利用正面测试用例生成负面测试用例,正面测试用例中的数据得到充分利用,不必重新生成,测试用例生成效率更高。使用单一变量法作为生成负面测试用例,每个树节点、叶子节点都有且仅有固定次数的机会插入异常值(该次数等于该节点类型的异常值数量),负面测试用例全面,且不会造成负面测试用例数量爆炸。
[0110]
本发明实施例通过在设定类文件被加载的情况下,确定设定类文件中的方法的输入参数的数据类型,基于数据类型生成对应的方法的测试用例模板,基于测试用例模板生成对应的方法的正面测试用例,基于正面测试用例生成对应的方法的负面测试用例。本发明实施例可以基于正面测试用例生成对应的方法的负面测试用例,提高了测试用例的生成效率。
[0111]
在一实施例中,所述方法还包括:
[0112]
从所述设定类文件的路径下获取调用点代码;运行所述调用点代码;所述调用点代码用于从设定数据库中获取所述正面测试用例或所述负面测试用例,并运行所述正面测试用例或所述负面测试用例。
[0113]
在生成测试用例后,需要对测试用例进行存储。本发明实施例将测试用例数据存储在设定数据库中,首先在设定数据库中生成一个方法编号,生成对应的类名称和方法名称,然后将方法对应的测试用例数据对应存储在设定数据库中。测试用例数据存储在设定数据库,可以使用网页进行展示。
[0114]
相关技术中每一个方法都要生成一个调用点代码,调用点代码用来执行测试用例,相关技术将调用点代码与测试用例代码混在一起编写。本发明实施例在设定类文件的路径下生成一个调用点代码,具体可以是方法对应的代码路径,在需要运行测试用例时,从设定类文件的路径获取调用点代码,运行调用点代码,调用点代码自动从设定数据库中获取测试用例,并运行测试用例。
[0115]
调用点代码是一个静态方法,方法参数依次为:方法编号、类对象、方法、方法参数列表。其中类对象和方法参数列表默认为空,类对象执行过程中自动生成。当用户有手动创建的特殊参数作为测试用例时,可以通过方法参数列表传入;当少数特殊的目标类、参数列表不能自动生成时,可以人工创建对象后通过上述类对象传入。生成的调用点代码作为手动和自动运行测试用例的入口,用于启动测试用例。本发明实施例的调用点代码可以用于启动任意方法的测试用例,并不限于某一个方法的测试用例。调用点代码结构简单,仅作为测试用例的执行入口,程序员仅需要关心待测试代码(方法)的业务逻辑。测试用例数据存
储在数据库,可以使用网页展示。本发明实施例可以实现测试用例和调用点代码的分离,降低了调用点代码的代码量,降低了调用点代码的逻辑复杂度,降低了维护难度。
[0116]
在执行测试用例的时候,调用点代码根据方法编号,从数据库加载该方法的所有测试用例,自行创建类对象,创建执行记录,循环执行所有测试用例,在执行记录下面存储每条测试用例的本次执行结果。
[0117]
参考图10,在一实施例中,所述方法还包括:
[0118]
s1001,获取所述正面测试用例或所述负面测试的测试结果。
[0119]
测试用例执行后,会得到一个测试结果。比如,如果某个方法用于输出当前日期时间,当执行某个测试用例后,测试结果为2021年3月20日。
[0120]
s1002,在所述测试结果包括可变内容的情况下,基于设定的正则表达式确定所述测试结果是否通过。
[0121]
测试用例包括预期结果,预期结果是执行该测试用例希望得到的结果。通常情况下,如果测试结果与预期结果不符合,则说明测试未通过。但是,有一些情况下,测试结果包括可变内容,测试用例在不同的时候执行时会得到不同的测试结果,比如,假设某个方法用于输出当前日期时间,如果当前时间为2021年3月20日,则测试结果为2021年3月20日,但是如果当前时间为2021年3月21日,则测试结果为2021年3月21日。可见,测试结果随着执行时间发生了变化,测试结果包括可变内容。
[0122]
这种情况下,可以用设定的正则表达式对预期结果中的可变部分进行标记,正则表达式(regular expression)是一种文本模式,包括普通字符(例如a到z之间的字母)和特殊字符(称为“元字符”)。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。换句话说,正则表达式就是记录文本规则的代码。通过设定的正则表达式描述测试结果中的可变部分的规则,在得到测试结果时,判断测试结果中的可变内容是否符合设定的正则表达式所描述的规则。这样实现了灵活的自动化结果校验,满足了测试用例要反复执行和反复自动校验的要求,达到了测试结果判定的正确性和灵活性。
[0123]
在实际应用中,由于业务逻辑的正确性只能人工判定,可以提供测试结果审核界面,该界面显示输入参数、测试结果、通过按钮。首次运行测试用例后,人工对测试结果的正确性进行判断,若测试结果不满足预期,则人工排查代码中的漏洞并修改,直至输出正确,此时点击“通过”按钮,当前测试结果作为正确的预期结果存入数据库。
[0124]
参考图11,图11是本发明应用实施例提供的一种预期结果的生成流程的示意图。首先,执行测试用例得到测试结果,人工对测试结果是否正确进行判断,如果测试结果不对,则修复代码中的漏洞。如果测试结果正确,则将测试结果作为预期结果。对预期结果中的可变部分进行标记,可以用设定的正则表达式对预期结果中的可变部分进行标记。
[0125]
参考图12,图12是本发明应用实施例提供的一种测试结果的判定流程的示意图。首先,执行测试用例得到测试结果,对比测试结果和预期结果,判定测试结果中是否包含可变部分,如果包含可变部分,则对测试结果进行正则校验,通过设定的正则表达式对测试结果进行校验,判定测试结果是否通过。如果不包含可变部分,则判定预期结果和测试结果是否相等。如果预期结果和测试结果相等,则该测试用例测试通过;如果测试结果通过正则校验,则该测试用例测试通过。判断测试用例集中的测试用例是否全部测试通过,若是,则方法测试通过。若不是,则方法测试失败。
[0126]
参考图13,在一实施例中,所述方法还包括:
[0127]
s1301,在运行所述正面测试用例或所述负面测试的过程中获取所述方法产生的异常。
[0128]
正面测试用例用于测试系统是否完成了它应该完成的工作,负面测试用例则尽量模拟非预期的输入从而引发错误,负面测试用例用于检查系统的容错能力和可靠性。不管是正面测试用例还是负面测试用例,都可以用于测试系统是否存在异常。这里,主要指被测试的方法是否存在异常。在调用目标代码执行测试用例的外层捕获所有异常,目标代码指被测试方法对应的代码。
[0129]
s1302,确定所述异常是否存储在设定的异常表中,在所述异常未存储在所述设定的异常表中的情况下,发送设定信息;所述设定信息用于提示存在需要修复的漏洞。
[0130]
有一些异常是程序员能够预知的异常,目的可能是对这些异常进行测试,将这些已知的异常存储在设定的异常表中。在执行测试用例的过程中,捕获异常,基于设定的异常表对捕获的异常进行匹配,如果捕获的异常不是设定的异常表中的异常,说明程序存在未知的漏洞,发送第一信息,提示需要修复漏洞。
[0131]
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
[0132]
应当理解,当在本说明书和所附权利要求书中使用时,术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
[0133]
需要说明的是,本发明实施例所记载的技术方案之间,在不冲突的情况下,可以任意组合。
[0134]
另外,在本发明实施例中,“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
[0135]
参考图14,图14是本发明实施例提供的一种测试用例生成装置的示意图,如图14所示,该装置包括:确定模块、第一生成模块、第二生成模块和第三生成模块。
[0136]
确定模块,用于在设定类文件被加载的情况下,确定所述设定类文件中的方法的输入参数的数据类型。
[0137]
第一生成模块,用于基于所述数据类型生成对应的方法的测试用例模板。
[0138]
第二生成模块,用于基于所述测试用例模板生成对应的方法的正面测试用例。
[0139]
第三生成模块,用于基于所述正面测试用例生成对应的方法的负面测试用例。
[0140]
在一实施例中,第二生成模块在基于所述测试用例模板生成对应的方法的正面测试用例时,具体用于:
[0141]
基于设定的第一集合中的值和所述测试用例模板生成对应的方法的正面测试用例;所述设定的第一集合中的值表征对应的方法的正面测试用例中的变量的值。
[0142]
在一实施例中,第三生成模块在基于所述正面测试用例生成对应的方法的负面测试用例时,具体用于:
[0143]
基于所述数据类型确定设定的第二集合中的值;所述设定的第二集合中的值表征对应的方法的负面测试用例中的变量的值;
[0144]
基于所述第二集合中的值和所述正面测试用例生成对应的方法的负面测试用例。
[0145]
在上述实施例中,第三生成模块基于所述第二集合中的值和所述正面测试用例生成对应的方法的负面测试用例时,用于:
[0146]
在所述正面测试用例中插入一个所述第二集合中的值,生成一个负面测试用例。
[0147]
在一实施例中,该装置还包括:
[0148]
第一加载模块,用于基于设定类加载器加载所述设定类文件;
[0149]
第二加载模块,用于在所述设定类加载器加载所述设定类文件失败的情况下,由所述设定类加载器的父类加载器加载所述设定类文件。
[0150]
在一实施例中,该装置还包括:
[0151]
获取模块,用于从所述设定类文件的路径下获取调用点代码;
[0152]
运行模块,用于运行所述调用点代码;所述调用点代码用于从设定数据库中获取所述正面测试用例或所述负面测试用例,并运行所述正面测试用例或所述负面测试用例。
[0153]
在一实施例中,该装置还包括:
[0154]
测试结果模块,用于获取所述正面测试用例或所述负面测试的测试结果;
[0155]
确定模块,用于在所述测试结果包括可变内容的情况下,基于设定的正则表达式确定所述测试结果是否通过。
[0156]
在一实施例中,该装置还包括:
[0157]
异常获取模块,用于在运行所述正面测试用例或所述负面测试的过程中获取所述方法产生的异常;
[0158]
发送模块,用于确定所述异常是否存储在设定的异常表中,在所述异常未存储在所述设定的异常表中的情况下,发送设定信息;所述设定信息用于提示存在需要修复的漏洞。
[0159]
实际应用时,所述确定模块、第一生成模块、第二生成模块和第三生成模块可通过电子设备中的处理器,比如中央处理器(cpu,central processing unit)、数字信号处理器(dsp,digital signal processor)、微控制单元(mcu,microcontroller unit)或可编程门阵列(fpga,field-programmable gate array)等实现。
[0160]
需要说明的是:上述实施例提供的测试用例生成装置在进行测试用例生成时,仅以上述各模块的划分进行举例说明,实际应用中,可以根据需要而将上述处理分配由不同的模块完成,即将装置的内部结构划分成不同的模块,以完成以上描述的全部或者部分处理。另外,上述实施例提供的测试用例生成装置与测试用例生成方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
[0161]
基于上述程序模块的硬件实现,且为了实现本技术实施例的方法,本技术实施例还提供了一种电子设备。图15为本技术实施例电子设备的硬件组成结构示意图,如图15所示,电子设备包括:
[0162]
通信接口,能够与其它设备比如网络设备等进行信息交互;
[0163]
处理器,与所述通信接口连接,以实现与其它设备进行信息交互,用于运行计算机程序时,执行上述电子设备侧一个或多个技术方案提供的方法。而所述计算机程序存储在存储器上。
[0164]
当然,实际应用时,电子设备中的各个组件通过总线系统耦合在一起。可理解,总
线系统用于实现这些组件之间的连接通信。总线系统除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图15中将各种总线都标为总线系统。
[0165]
本技术实施例中的存储器用于存储各种类型的数据以支持电子设备的操作。这些数据的示例包括:用于在电子设备上操作的任何计算机程序。
[0166]
可以理解,存储器可以是易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(rom,read only memory)、可编程只读存储器(prom,programmable read-only memory)、可擦除可编程只读存储器(eprom,erasable programmable read-only memory)、电可擦除可编程只读存储器(eeprom,electrically erasable programmable read-only memory)、磁性随机存取存储器(fram,ferromagnetic random access memory)、快闪存储器(flash memory)、磁表面存储器、光盘、或只读光盘(cd-rom,compact disc read-only memory);磁表面存储器可以是磁盘存储器或磁带存储器。易失性存储器可以是随机存取存储器(ram,random access memory),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的ram可用,例如静态随机存取存储器(sram,static random access memory)、同步静态随机存取存储器(ssram,synchronous static random access memory)、动态随机存取存储器(dram,dynamic random access memory)、同步动态随机存取存储器(sdram,synchronous dynamic random access memory)、双倍数据速率同步动态随机存取存储器(ddrsdram,double data rate synchronous dynamic random access memory)、增强型同步动态随机存取存储器(esdram,enhanced synchronous dynamic random access memory)、同步连接动态随机存取存储器(sldram,synclink dynamic random access memory)、直接内存总线随机存取存储器(drram,direct rambus random access memory)。本技术实施例描述的存储器旨在包括但不限于这些和任意其它适合类型的存储器。
[0167]
上述本技术实施例揭示的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器、dsp,或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。处理器可以实现或者执行本技术实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本技术实施例所公开的方法的步骤,可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于存储介质中,该存储介质位于存储器,处理器读取存储器中的程序,结合其硬件完成前述方法的步骤。
[0168]
可选地,所述处理器执行所述程序时实现本技术实施例的各个方法中由电子设备实现的相应流程,为了简洁,在此不再赘述。
[0169]
在示例性实施例中,本技术实施例还提供了一种存储介质,即计算机存储介质,具体为计算机可读存储介质,例如包括存储计算机程序的第一存储器,上述计算机程序可由电子设备的处理器执行,以完成前述方法所述步骤。计算机可读存储介质可以是fram、rom、prom、eprom、eeprom、flash memory、磁表面存储器、光盘、或cd-rom等存储器。
[0170]
在本技术所提供的几个实施例中,应该理解到,所揭露的装置、电子设备和方法,
可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
[0171]
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
[0172]
另外,在本技术各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0173]
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。
[0174]
或者,本技术上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本技术各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。
[0175]
需要说明的是,本技术实施例所记载的技术方案之间,在不冲突的情况下,可以任意组合。
[0176]
另外,在本技术实例中,“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
[0177]
以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1