CN106066828A - 一种生成Protobuf格式测试数据的方法及装置 - Google Patents
一种生成Protobuf格式测试数据的方法及装置 Download PDFInfo
- Publication number
- CN106066828A CN106066828A CN201610371677.5A CN201610371677A CN106066828A CN 106066828 A CN106066828 A CN 106066828A CN 201610371677 A CN201610371677 A CN 201610371677A CN 106066828 A CN106066828 A CN 106066828A
- Authority
- CN
- China
- Prior art keywords
- attribute
- data
- rule
- protobuf
- message
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种生成protobuf格式测试数据的方法及装置,可以针对每个根据预设规则生成的Protobuf Message执行下述步骤:A、遍历Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;如果是,执行步骤B;否则,执行步骤C;B、根据Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足属性的数据;C、根据Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足属性的Protobuf Message,并执行步骤A。应用本发明,可以提高生成Protobuf格式测试数据的效率。
Description
技术领域
本发明涉及测试数据生成领域,特别是涉及一种生成Protobuf格式数据的方法及装置。
背景技术
在企业中,为了保证应用软件的质量,测试人员需要根据业务场景设计和生成大量的测试数据进行应用软件的功能测试和压力测试。因此,能够提供一种质量好、生成效率高的数据及其生成方法显得非常重要。
Protocol Buffers(简称Protobuf)是一种轻便高效的结构化数据存储格式。使用Protobuf格式数据Protobuf Message,可以有效地减少传输带宽需求,节省存储空间,因而在通讯、数据存储、软件测试等领域得到了广泛的应用。
目前,生成测试数据的方法存在两种情况:
第一种,通过手工或者一些定制的代码来生成测试数据。但是采用手工或者定制方式生成Protobuf这种复杂、多变的数据格式时,开发和维护成本都很高。一旦有变更,需要重新制作数据,或者调整代码,生成过程耗时长。
第二种,针对特定设备来模拟用户操作,或者针对特定应用来设计,采用脚本的方式自动生成测试数据。但该方法不适用于Protobuf这种结构复杂的数据格式。
现有技术,对于结构简单的测试数据的生成是可行的。对于Protobuf这种结构复杂的数据格式,生成效率低且不易维护。
发明内容
本发明实施例的目的在于提供一种生成protobuf格式测试数据的方法及装置,以提高Protobuf格式测试数据生成效率。
为达到上述目的,本发明实施例公开了一种生成protobuf格式测试数据的方法,包括如下步骤:
根据预设规则,生成至少一个Protobuf Message,针对每个Protobuf Message执行下述步骤:
A、针对当前Protobuf Message,遍历所述Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;如果是,执行步骤B;否则,执行步骤C;
B、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
C、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message,并执行步骤A。
优选的,所述根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据包括:
判断当前属性的限定修饰符类型;
如果当前属性的限定修饰符类型为必须类型,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
如果当前属性的限定修饰符类型为可选类型,使用一个随机函数判断是否生成满足该属性的数据,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
如果当前属性的限定修饰符类型为重复类型,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据生成规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足该属性的数据。
优选的,所述根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message包括:
判断当前属性的限定修饰符类型;
如果当前属性的限定修饰符类型为必须类型,根据所述Protobuf Message中该属性对应的的客户化规则标签中封装的数据生成规则,生成满足所述属性的ProtobufMessage;
如果当前属性的限定修饰符类型为可选类型,使用一个随机函数判断是否需要生成满足该属性的Protobuf Message,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
如果当前属性的限定修饰符类型为重复类型,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足所述属性的Protobuf Message。
优选的,所述根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据包括:
当所述属性的数据生成规则为ascii时,则生成的数据为长度在该ascii中定义的最小长度和最大长度之间的随机字符串;
当所述属性的数据生成规则为rand时,则生成的数据为在该rand中定义的最小值和最大值之间的随机整数;
当所述属性的数据生成规则为randf时,则生成的数据为在该randf中定义的最小值和最大值之间的随机浮点数;
当所述属性的数据生成规则为charfile时,则生成的数据为长度在该charfile中定义的最小长度和最大长度之间的字符串;
当所述属性的数据生成规则为strfile时,则生成的数据为在该strfile中定义的最小个数和最大个数之间的字符串或列表;
当所述属性的数据生成规则为list时,则生成的数据为元素的数量在该list中定义的最小个数和最大个数之间的列表,所述列表中每一元素对应的值由该list中定义的函数来生成;
当所述属性的数据生成规则为bound时,则生成的数据为数量在该bound中定义的最小个数和最大个数之间的列表。
优选的,所述客户化规则标签为根据Options选项定义的标签。
为实现上述目的,本发明实施例还提供了一种生成Protobuf格式测试数据的装置,所述装置包括:Message生成模块、判断模块、第一数据生成模块和第二数据生成模块,
所述Message生成模块,用于根据预设规则,生成至少一个Protobuf Message,并针对每个Protobuf Message触发一次所述第一判断模块和所述数据生成模块;
所述判断模块,用于针对当前Protobuf Message,遍历所述Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;
所述数据生成模块,用于在所述判断模块获得的结果为是时,根据所述ProtobufMessage中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
所述第二数据生成模块,用于在所述判断模块获得的结果为否时,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成ProtobufMessage,并触发所述判断模块。
优选的,所述第一数据生成模块包括:第一判断模块子模块、第一数据生成子模块、第二数据生成子模块和第三数据生成子模块,
所述第一判断模块子模块,用于在所述判断模块获得的结果为是时,判断当前属性的限定修饰符类型;
所述第一数据生成子模块,用于在当前属性的限定修饰符类型为必须类型时,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
所述第二数据生成子模块,用于在当前属性的限定修饰符类型为可选类型时,使用一个随机函数判断是否生成满足该属性的数据,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
所述第三数据生成子模块,用于在当前属性的限定修饰符类型为重复类型时,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据生成规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足该属性的数据。
优选的,所述第二数据生成模块包括:第二判断模块子模块、第一message生成子模块、第二message生成子模块和第三message生成子模块,
所述第二判断模块子模块,用于在所述判断模块获得的判断结果为否时,判断当前属性的限定修饰符类型;
所述第一message生成子模块,用于在当前属性的限定修饰符类型为必须类型时,根据所述Protobuf Message中该属性对应的的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
所述第二message生成子模块,用于在当前属性的限定修饰符类型为可选类型时,使用一个随机函数判断是否需要生成满足该属性的Protobuf Message,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
所述第三message生成子模块,用于在当前属性的限定修饰符类型为重复类型时,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足所述属性的Protobuf Message。
优选的,所述第一数据生成模块具体用于,
当所述属性的数据生成规则为ascii时,则生成的数据为长度在该ascii中定义的最小长度和最大长度之间的随机字符串;
当所述属性的数据生成规则为rand时,则生成的数据为在该rand中定义的最小值和最大值之间的随机整数;
当所述属性的数据生成规则为randf时,则生成的数据为在该randf中定义的最小值和最大值之间的随机浮点数;
当所述属性的数据生成规则为charfile时,则生成的数据为长度在该charfile中定义的最小长度和最大长度之间的字符串;
当所述属性的数据生成规则为strfile时,则生成的数据为在该strfile中定义的最小个数和最大个数之间的字符串或列表;
当所述属性的数据生成规则为list时,则生成的数据为元素的数量在该list中定义的最小个数和最大个数之间的列表,所述列表中每一元素对应的值由该list中定义的函数来生成;
当所述属性的数据生成规则为bound时,则生成的数据为数量在该bound中定义的最小个数和最大个数之间的列表。
优选的,所述客户化规则标签为根据Options选项定义的标签。
本发明实施例提供的一种生成protobuf格式测试数据的方法及装置,可以根据预设规则,生成至少一个Protobuf Message,针对每个Protobuf Message执行下述步骤:A、针对当前Protobuf Message,遍历所述Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;如果是,执行步骤B;否则,执行步骤C;B、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;C、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message,并执行步骤A。由于是将每一Protobuf Message中的各属性对应的数据生规则作为该属性的扩展内容,封装在该属性的客户化规则标签中,这样在生成该属性对应的数据时,可以直接调用该属性的客户化规则标签中封装的数据生成规则,因此,本发明实施例提供的生成Protobuf格式测试数据的方法及装置,可以自动批量生成Protobuf格式测试数据,提高了生成Protobuf格式测试数据的效率。当然,实施本发明的任一产品或方法必不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种生成protobuf格式测试数据的方法的流程图;
图2为图1所示的实施例中的步骤S103的具体流程图;
图3为图1所示的实施例中的步骤S104的具体流程图;
图4为本发明实施例提供的一种生成protobuf格式测试数据的结构图;
图5为图4所示的实施例中的数据生成模块103的具体结构图;
图6为图4所示的实施例中的数据生成模块104的具体结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供了一种生成Protobuf格式测试数据的方法及装置,首先对本发明实施例所提供的一种生成Protobuf格式测试数据的方法进行说明。
如图1所示,本发明实施例提供了一种生成Protobuf格式测试数据的方法,该方法可以包括:
S101、根据预设规则,生成至少一个Protobuf Message,针对每个ProtobufMessage执行步骤S102至步骤S104;
上述预设规则是根据Protobuf Message(简称message)自身的结构,以及用户实际测试需要的数据的基本信息来确定的;
其中,每一Protobuf Message由至少一个属性(也可以称为字段)构成;而每一属性至少由以下四部分构成:①限定修饰符类型、②数据类型、③属性名称和④属性编码值;
①限定修饰符类型包括:必须类型(required)、可选类型(optional)、重复类型(repeated);
②数据类型包括:int32、string、和float等;其中,每一数据类型几乎都可以映射到C++\Java等语言的基础数据类型;
③属性名称的命名,与C、C++、Java等语言的变量命名方式基本相同,例如age、name等;
④属性编码值为取值范围为1~232(4294967296)的整数,属性编码值越大,其编码的时间和空间效率就越低,其中1~15这个范围内的属性编码值的编码时间和空间效率是最高的,当然一般情况下可以认为相邻的2个属性编码值的编码效率是相同的,除非这2个属性编码值值恰好是在4字节,12字节,20字节等临界区,例如15和16这两个属性编码值的时间效率和空间效率相差就比较大。
其中,用户实际测试需要的数据的基本信息由用户预先定义,这些基本信息至少包括:1)数据的大类名称、2)数据的小类名称、3)小类数据的具体类型、4)小类数据的客户化规则标签和5)小类数据的数据生成规则;
这样,在生成message时:
1)数据的大类名称可以对应为message自身的名称,例如,当数据的大类名称为Student(学生)时,表明需要生成一个名为Student的message,当数据的大类名称为Teacher(老师)时,表明需要生成一个名为Teacher的message;
2)数据的小类名称可以对应为message中的属性名称,例如,age可以作为messageStudent的一个属性的名称,表明需要生成学生的年龄的测试数据;age也可以作为messageTeacher的一个属性的名称,表明需要生成老师的年龄的测试数据;
3)小类数据的具体类型可以对应为message中的属性的数据类型,例如int32、string等;
4)小类数据的客户化规则标签可以对应为message中的属性的扩展内容;这些客户化规则标签由用户利用Protocol Buffers的自定义选项预先定义,例如用户利用选项Options定义的一个客户化规则标签的具体示例可以为:
extend google.Protobuf.MessageOptions{
optional string gen=50001;
}
其中gen就是客户化规则标签,在实际应用中,当使用上述客户化规则标签gen时,需要将客户化规则标签gen用圆括号包裹起来,以表明它是对message的属性的扩展;
5)小类数据的数据生成规则可以对应为message中的属性对应的生成规则,并作为客户化规则标签的值,即将小类数据的数据生成规则封装在属性的客户化规则标签中;例如,age[(gen)=”rand(7,100)”],其中,age是属性名称,gen是客户化规则标签,rand(7,100)为属性age对应的数据生成规则,该生成规则表明需要生成最小值为7,最大值为100的随机整数。
具体的,根据预设规则,生成的一个message的示例可以为:
正是由于每一message中的属性的扩展部分(客户化规则标签)中封装了该属性对应的数据生成规则,这样在生成该属性对应的数据时,可以直接调用该属性的客户化规则标签中封装的数据生成规则,从而使得本发明提供的生成Protobuf格式测试数据的方法能够提高Protobuf格式测试数据生成效率。
步骤S102、针对当前Protobuf Message,遍历所述Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;在判断结果为是时,执行步骤S103;否则执行步骤S104;
具体的,可以根据当前属性的名称识别该属性是否为基本类型。当当前属性的名称为步骤S101中生成的message自身的名称时,则该属性为复合类型,即嵌套在message中的message属于复合类型的属性;否则,该属性为基本类型。
例如,当步骤S101中生成一个名为Student的message时,下述名为Teacher的message中的属性Student即为复合类型,而名为name的属性为基本类型;
步骤S103、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
具体的,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据可以包括:
当该属性的扩展部分封装的数据生成规则为ascii时,则生成的数据为长度在该ascii中定义的最小长度和最大长度之间的随机字符串;
例如,当该属性的扩展部分封装的数据生成规则为ascii(min,max,pattern)时,则生成最小长度为min,最大长度为max,符合pattern定义模式的随机字符串,如果pattern为空,则生成任意字符串。
当该属性的扩展部分封装的数据生成规则为rand时,则生成的数据为在该rand中定义的最小值和最大值之间的随机整数;
例如,当该属性的扩展部分封装的数据生成规则为rand(min,max)时,则生成最小值为min,最大值为max的随机整数。
当该属性的扩展部分封装的数据生成规则为randf时,则生成的数据为在该randf中定义的最小值和最大值之间的随机浮点数;
例如,当该属性的扩展部分封装的数据生成规则为randf(min,max)时,则生成最小值为min,最大值为max的随机浮点数。
当该属性的扩展部分封装的数据生成规则为charfile时,则生成的数据为长度在该charfile中定义的最小长度和最大长度之间的字符串;
例如,当该属性的扩展部分封装的数据生成规则为charfile(filename,min,max)时,则生成最小长度为min,最大长度为max的字符串。
当该属性的扩展部分封装的数据生成规则为strfile时,则生成的数据为在该strfile中定义的最小个数和最大个数之间的字符串或列表;
例如,当该属性的扩展部分封装的数据生成规则为strfile(filename,min,max)时,则生成最小个数为min,最大个数为max的字符串或列表。
当该属性的扩展部分封装的数据生成规则为list时,则生成的数据为元素的数量在该list中定义的最小个数和最大个数之间的列表,所述列表中每一元素对应的值由该list中定义的函数来生成;
例如,当该属性的扩展部分封装的数据生成规则为list(min,max,fun)时,则生成最小个数为min,最大个数为max的列表,列表中的值由fun函数来生成。
当该属性的扩展部分封装的数据生成规则为bound时,则生成的数据为数量在该bound中定义的最小个数和最大个数之间的列表;
例如,当该属性的扩展部分封装的数据生成规则为bound(min,max)时,则生成个数最小为min,最大为max的属性列表。
步骤S104、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message,并执行步骤A。
例如,当当前属性为步骤S103中所述的message Teacher中的属性“Student”时,根据该属性的客户化规则标签gen中封装的数据生成规则“bound(10,20)”,生成最少为10个最多为20个message Student,然后针对每一个message Student再返回执行步骤A。
在本发明图1所示的实施例中,由于是将每一Protobuf Message中的每一属性对应的数据生规则作为该属性的扩展内容,封装在该属性的客户化规则标签中,因此,在应用本发明图1所示的实施例提供的生成Protobuf格式测试数据的方法时,可以直接调用当前属性的扩展部分封装的数据生成规则生成数据,自动批量地生成Protobuf格式的测试数据,进而提高了生成Protobuf格式测试数据的效率。
进一步,在图1所示的实施例的基础上,为了使生成的测试数据更符合用户的测试需求,在确定当前属性是否为基本类型的属性后,在生成该属性对应的数据前,还可以判断该属性的限定修饰符类型。
因此,如图2所示,步骤S103中所述的“对于基本类型的属性,根据所述ProtobufMessage中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据”可以包括:
S201、判断当前属性的限定修饰符类型;
根据Protobuf Message中的属性的组成内容可知,限定修饰符类型包括:必须类型(required)、可选类型(optional)和重复类型(repeated)。
S202、如果当前属性的限定修饰符类型为必须类型(required),根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
例如,如果当前属性为步骤S101中定义的message Student中的属性name,则直接调用gen标签中封装的规则“charfile(name,1,1)+charfile(firstname,1,2)”,生成由名和姓组成的字符串。
S203、如果当前属性的限定修饰符类型为可选类型(optional),使用一个随机函数判断是否生成满足该属性的数据,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
例如,如果当前属性为步骤S101中定义的message Student中的属性gae,首先使用随机函数判断是否需要生成该属性对应的数据,如果需要,则调用gen标签中封装的规则“rand(7,100)”,生成值在7~100之间的一个随机整数。
S204、如果当前属性的限定修饰符类型为重复类型(repeated),读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据生成规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足该属性的数据。
例如,如果当前属性为步骤S101中定义的message Student中的属性lesson,则调用gen标签中的规则“strfile(lesson,2,5)”,首先生成最小为2最大为5的重复次数,然后生成相应重复次数的“lesson”,组成一个列表。
同样的,在图1所示的实施例的基础上,为了使生成的测试数据更符合用户的测试需求,如图3所示,步骤S104中所述的“对于复合类型的属性,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的ProtobufMessage”可以包括:
S301、判断当前属性的限定修饰符类型;
限定修饰符的类型与步骤S201中的描述一致,此处不再赘述。
S302、如果当前属性的限定修饰符类型为必须类型,根据所述Protobuf Message中该属性对应的的客户化规则标签中封装的数据生成规则,生成满足所述属性的ProtobufMessage;
具体方法同步骤S202。
S303、如果当前属性的限定修饰符类型为可选类型,使用一个随机函数判断是否需要生成满足该属性的Protobuf Message,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
具体方法同步骤S203。
S304、如果当前属性的限定修饰符类型为重复类型,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足所述属性的Protobuf Message。
具体方法同步骤S204。
需要说明的是,本发明实施例提供的一种生成Protobuf格式测试数据的方法可以应用于个人电脑、服务器等电子设备中。
本发明实施例提供的一种生成Protobuf格式测试数据的方法,可以根据预设规则,生成至少一个Protobuf Message,针对每个Protobuf Message执行下述步骤:A、针对当前Protobuf Message,遍历所述Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;如果是,执行步骤B;否则,执行步骤C;B、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;C、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message,并执行步骤A。由于所述方法是将每一Protobuf Message中的各属性对应的数据生规则作为该属性的扩展内容,封装在该属性的客户化规则标签中,这样在生成该属性对应的数据时,可以直接调用该属性的客户化规则标签中封装的数据生成规则,因此,本发明实施例提供的生成Protobuf格式测试数据的方法,可以自动批量生成Protobuf格式测试数据,提高了生成Protobuf格式测试数据的效率。
相应于图1所示的方法实施例,如图4所示,本发明实施例还提供了一种生成Protobuf格式测试数据的装置,所述装置包括:message生成模块101、判断模块102、第一数据生成模块103和第二数据生成模块104,
message生成模块101,用于根据预设规则,生成至少一个Protobuf Message,并针对每个Protobuf Message触发一次所述第一判断模块和所述数据生成模块;
上述预设规则是根据Protobuf Message(简称message)自身的结构,以及用户实际测试需要的数据的基本信息来确定的;
其中,Protobuf Message自身的结构与图1所示的方法实施例的步骤S101中所述的一致,此处不再赘述;
其中,用户实际测试需要的数据的基本信息由用户预先定义,这些基本信息至少包括:1)数据的大类名称、2)数据的小类名称、3)小类数据的具体类型、4)小类数据的客户化规则标签和5)小类数据的数据生成规则;
这样,message生成模块101在生成message时:
1)数据的大类名称可以对应为message自身的名称,例如,当数据的大类名称为Student(学生)时,表明需要生成一个名为Student的message,当数据的大类名称为Teacher(老师)时,表明需要生成一个名为Teacher的message;
2)数据的小类名称可以对应为message中的属性名称,例如,age可以作为messageStudent的一个属性的名称,表明需要生成学生的年龄的测试数据;age也可以作为messageTeacher的一个属性的名称,表明需要生成老师的年龄的测试数据;
3)小类数据的具体类型可以对应为message中的属性的数据类型,例如int32、string等;
4)小类数据的客户化规则标签可以对应为message中的属性的扩展内容;这些客户化规则标签由用户利用Protocol Buffers的自定义选项预先定义,例如用户利用选项Options定义的一个客户化规则标签的具体示例可以为:
extend google.Protobuf.MessageOptions{
optional string gen=50001;
}
其中gen就是客户化规则标签,在实际应用中,当使用上述客户化规则标签gen时,需要将客户化规则标签gen用圆括号包裹起来,以表明它是对message的属性的扩展;
5)小类数据的数据生成规则可以对应为message中的属性对应的生成规则,并作为客户化规则标签的值,即将小类数据的数据生成规则封装在属性的客户化规则标签中;例如,age[(gen)=”rand(7,100)”],其中,age是属性名称,gen是客户化规则标签,rand(7,100)为属性age对应的数据生成规则,该生成规则表明需要生成最小值为7,最大值为100的随机整数。
具体的,message生成模块101,根据预设规则,生成的一个message的示例可以为:
正是由于每一message中的属性的扩展部分(客户化规则标签)中封装了该属性对应的数据生成规则,这样在生成该属性对应的数据时,可以直接调用该属性的客户化规则标签中封装的数据生成规则,从而使得本发明提供的生成Protobuf格式测试数据的方法能够提高Protobuf格式测试数据生成效率。
判断模块102,用于针对当前Protobuf Message,遍历所述Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;
具体的,可以根据当前属性的名称识别该属性是否为基本类型。当当前属性的名称为message生成模块101生成的message的名称时,则该属性为复合类型,即嵌套在message中的message属于复合类型的属性;否则,该属性为基本类型。
第一数据生成模块103,用于在所述判断模块102获得的结果为是时,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
具体的,第一数据生成模块103,用于当该属性的扩展部分封装的数据生成规则为ascii时,则生成的数据为长度在该ascii中定义的最小长度和最大长度之间的随机字符串;
当该属性的扩展部分封装的数据生成规则为rand时,则生成的数据为在该rand中定义的最小值和最大值之间的随机整数;
当该属性的扩展部分封装的数据生成规则为randf时,则生成的数据为在该randf中定义的最小值和最大值之间的随机浮点数;
当该属性的扩展部分封装的数据生成规则为charfile时,则生成的数据为长度在该charfile中定义的最小长度和最大长度之间的字符串;
当该属性的扩展部分封装的数据生成规则为strfile时,则生成的数据为在该strfile中定义的最小个数和最大个数之间的字符串或列表;
当该属性的扩展部分封装的数据生成规则为list时,则生成的数据为元素的数量在该list中定义的最小个数和最大个数之间的列表,所述列表中每一元素对应的值由该list中定义的函数来生成;
当该属性的扩展部分封装的数据生成规则为bound时,则生成的数据为数量在该bound中定义的最小个数和最大个数之间的列表。
第二数据生成模块104,用于在所述判断模块102获得的结果为否时,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成ProtobufMessage,并触发所述判断模块102。
例如,当当前属性为图1所示的实施例中所述的message Teacher中的属性“Student”时,根据该属性的客户化规则标签gen中封装的数据生成规则“bound(10,20)”,生成最少为10个最多为20个message Student,然后针对每一个message Student再触发所述判断模块102。
在本发明图4所示的实施例中,由于是将每一Protobuf Message中的每一属性对应的数据生规则作为该属性的扩展内容,封装在该属性的客户化规则标签中,因此,在应用本发明图4所示的实施例提供的生成Protobuf格式测试数据的装置时,可以直接调用当前属性的扩展部分封装的数据生成规则生成数据,自动批量地生成Protobuf格式的测试数据,进而提高了生成Protobuf格式测试数据的效率。
进一步,在图4所示的实施例的基础上,为了使生成的测试数据更符合用户的测试需求,如图5所示,第一数据生成模块103可以包括:第一判断模块子模块201、第一数据生成子模块202、第二数据生成子模块203和第三数据生成子模块204,
第一判断模块子模块201,用于在所述判断模块102获得的结果为是时,判断当前属性的限定修饰符类型;
其中,根据Protobuf Message中的属性的组成内容可知,限定修饰符类型包括:必须类型(required)、可选类型(optional)和重复类型(repeated)。
第一数据生成子模块202,用于在当前属性的限定修饰符类型为必须类型时,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
第二数据生成子模块203,用于在当前属性的限定修饰符类型为可选类型时,使用一个随机函数判断是否生成满足该属性的数据,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
第三数据生成子模块204,用于在当前属性的限定修饰符类型为重复类型时,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据生成规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足该属性的数据。
同样的,在图4所示的实施例的基础上,为了使生成的测试数据更符合用户的测试需求,如图6所示,第二数据生成模块104可以包括:第二判断模块子模块301、第一message生成子模块302、第二message生成子模块303和第三message生成子模块304,
第二判断模块子模块301,用于在所述判断模块102获得的判断结果为否时,判断当前属性的限定修饰符类型;
第一message生成子模块302,用于在当前属性的限定修饰符类型为必须类型时,根据所述Protobuf Message中该属性对应的的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
第二message生成子模块303,用于在当前属性的限定修饰符类型为可选类型时,使用一个随机函数判断是否需要生成满足该属性的Protobuf Message,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
第三message生成子模块304,用于在当前属性的限定修饰符类型为重复类型时,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足所述属性的Protobuf Message。
需要说明的是,本发明实施例提供的一种生成Protobuf格式测试数据的装置可以应用于个人电脑、服务器等电子设备中。
本发明实施例提供的一种生成Protobuf格式测试数据的装置,可以根据预设规则,生成至少一个Protobuf Message,并针对每个Protobuf Message触发一次判断模块、第一数据生成模块和第二数据生成模块;判断模块针对当前Protobuf Message,遍历Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;第一数据生成模块在判断模块获得的结果为是时,根据Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足属性的数据;第二数据生成模块在判断模块获得的结果为否时,根据Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成Protobuf Message,并触发判断模块。由于所述装置是将每一Protobuf Message中的各属性对应的数据生规则作为该属性的扩展内容,封装在该属性的客户化规则标签中,这样在生成该属性对应的数据时,可以直接调用该属性的客户化规则标签中封装的数据生成规则,因此,本发明实施例提供的生成Protobuf格式测试数据的装置,可以自动批量生成Protobuf格式测试数据,提高了生成Protobuf格式测试数据的效率。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (10)
1.一种生成Protobuf格式测试数据的方法,其特征在于,所述方法包括步骤:
根据预设规则,生成至少一个Protobuf Message,针对每个Protobuf Message执行下述步骤:
A、针对当前Protobuf Message,遍历所述Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;如果是,执行步骤B;否则,执行步骤C;
B、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
C、根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message,并执行步骤A。
2.根据权利要求1所述的生成Protobuf格式测试数据的方法,其特征在于,所述根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据包括:
判断当前属性的限定修饰符类型;
如果当前属性的限定修饰符类型为必须类型,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
如果当前属性的限定修饰符类型为可选类型,使用一个随机函数判断是否生成满足该属性的数据,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
如果当前属性的限定修饰符类型为重复类型,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据生成规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足该属性的数据。
3.根据权利要求1所述的生成Protobuf格式测试数据的方法,其特征在于,所述根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message包括:
判断当前属性的限定修饰符类型;
如果当前属性的限定修饰符类型为必须类型,根据所述Protobuf Message中该属性对应的的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
如果当前属性的限定修饰符类型为可选类型,使用一个随机函数判断是否需要生成满足该属性的Protobuf Message,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
如果当前属性的限定修饰符类型为重复类型,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足所述属性的Protobuf Message。
4.根据权利要求1或2所述的生成Protobuf格式测试数据的方法,其特征在于,所述根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据包括:
当所述属性的数据生成规则为ascii时,则生成的数据为长度在该ascii中定义的最小长度和最大长度之间的随机字符串;
当所述属性的数据生成规则为rand时,则生成的数据为在该rand中定义的最小值和最大值之间的随机整数;
当所述属性的数据生成规则为randf时,则生成的数据为在该randf中定义的最小值和最大值之间的随机浮点数;
当所述属性的数据生成规则为charfile时,则生成的数据为长度在该charfile中定义的最小长度和最大长度之间的字符串;
当所述属性的数据生成规则为strfile时,则生成的数据为在该strfile中定义的最小个数和最大个数之间的字符串或列表;
当所述属性的数据生成规则为list时,则生成的数据为元素的数量在该list中定义的最小个数和最大个数之间的列表,所述列表中每一元素对应的值由该list中定义的函数来生成;
当所述属性的数据生成规则为bound时,则生成的数据为数量在该bound中定义的最小个数和最大个数之间的列表。
5.根据权利要求1-4中任一项所述的生成Protobuf格式测试数据的方法,其特征在于,所述客户化规则标签为根据Options选项定义的标签。
6.一种生成Protobuf格式测试数据的装置,其特征在于,所述装置包括:Message生成模块、判断模块、第一数据生成模块和第二数据生成模块,
所述Message生成模块,用于根据预设规则,生成至少一个Protobuf Message,并针对每个Protobuf Message触发一次所述第一判断模块和所述数据生成模块;
所述判断模块,用于针对当前Protobuf Message,遍历所述Protobuf Message中包含的每一属性,判断当前属性是否为基本类型;
所述数据生成模块,用于在所述判断模块获得的结果为是时,根据所述ProtobufMessage中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
所述第二数据生成模块,用于在所述判断模块获得的结果为否时,根据所述ProtobufMessage中该属性对应的客户化规则标签中封装的数据生成规则,生成Protobuf Message,并触发所述判断模块。
7.根据权利要求6所述的生成Protobuf格式测试数据的装置,其特征在于,所述第一数据生成模块包括:第一判断模块子模块、第一数据生成子模块、第二数据生成子模块和第三数据生成子模块,
所述第一判断模块子模块,用于在所述判断模块获得的结果为是时,判断当前属性的限定修饰符类型;
所述第一数据生成子模块,用于在当前属性的限定修饰符类型为必须类型时,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
所述第二数据生成子模块,用于在当前属性的限定修饰符类型为可选类型时,使用一个随机函数判断是否生成满足该属性的数据,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的数据;
所述第三数据生成子模块,用于在当前属性的限定修饰符类型为重复类型时,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据生成规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足该属性的数据。
8.根据权利要求6所述的生成Protobuf格式测试数据的装置,其特征在于,所述第二数据生成模块包括:第二判断模块子模块、第一message生成子模块、第二message生成子模块和第三message生成子模块,
所述第二判断模块子模块,用于在所述判断模块获得的判断结果为否时,判断当前属性的限定修饰符类型;
所述第一message生成子模块,用于在当前属性的限定修饰符类型为必须类型时,根据所述Protobuf Message中该属性对应的的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
所述第二message生成子模块,用于在当前属性的限定修饰符类型为可选类型时,使用一个随机函数判断是否需要生成满足该属性的Protobuf Message,如果是,根据所述Protobuf Message中该属性对应的客户化规则标签中封装的数据生成规则,生成满足所述属性的Protobuf Message;
所述第三message生成子模块,用于在当前属性的限定修饰符类型为重复类型时,读取当前属性对应的客户化规则标签中封装的数据生成规则,获得该数据规则中包含的重复次数,并根据读取的所述数据生成规则及获得的所述重复次数,重复生成满足所述属性的Protobuf Message。
9.根据权利要求6或7所述的生成Protobuf格式测试数据的装置,其特征在于,所述第一数据生成模块具体用于,
当所述属性的数据生成规则为ascii时,则生成的数据为长度在该ascii中定义的最小长度和最大长度之间的随机字符串;
当所述属性的数据生成规则为rand时,则生成的数据为在该rand中定义的最小值和最大值之间的随机整数;
当所述属性的数据生成规则为randf时,则生成的数据为在该randf中定义的最小值和最大值之间的随机浮点数;
当所述属性的数据生成规则为charfile时,则生成的数据为长度在该charfile中定义的最小长度和最大长度之间的字符串;
当所述属性的数据生成规则为strfile时,则生成的数据为在该strfile中定义的最小个数和最大个数之间的字符串或列表;
当所述属性的数据生成规则为list时,则生成的数据为元素的数量在该list中定义的最小个数和最大个数之间的列表,所述列表中每一元素对应的值由该list中定义的函数来生成;
当所述属性的数据生成规则为bound时,则生成的数据为数量在该bound中定义的最小个数和最大个数之间的列表。
10.根据权利要求6-9任一项所述的生成Protobuf格式测试数据的装置,其特征在于,所述客户化规则标签为根据Options选项定义的标签。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610371677.5A CN106066828B (zh) | 2016-05-30 | 2016-05-30 | 一种生成Protobuf格式测试数据的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610371677.5A CN106066828B (zh) | 2016-05-30 | 2016-05-30 | 一种生成Protobuf格式测试数据的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106066828A true CN106066828A (zh) | 2016-11-02 |
CN106066828B CN106066828B (zh) | 2019-02-22 |
Family
ID=57420414
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610371677.5A Active CN106066828B (zh) | 2016-05-30 | 2016-05-30 | 一种生成Protobuf格式测试数据的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106066828B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107480053A (zh) * | 2017-07-21 | 2017-12-15 | 杭州销冠网络科技有限公司 | 一种软件测试数据生成方法及装置 |
CN111611174A (zh) * | 2020-05-28 | 2020-09-01 | 北京字节跳动网络技术有限公司 | 一种测试数据的构造方法、装置、计算机设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103294652A (zh) * | 2012-02-27 | 2013-09-11 | 腾讯科技(深圳)有限公司 | 一种数据转换方法及系统 |
CN103942280A (zh) * | 2014-04-02 | 2014-07-23 | 云南电网公司 | 一种基于数据结构自动生成代码的方法 |
CN103970737A (zh) * | 2013-01-24 | 2014-08-06 | 腾讯科技(深圳)有限公司 | 一种数据构造方法和装置 |
US20150039591A1 (en) * | 2013-07-30 | 2015-02-05 | International Business Machines Corporation | Method and apparatus for proliferating testing data |
-
2016
- 2016-05-30 CN CN201610371677.5A patent/CN106066828B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103294652A (zh) * | 2012-02-27 | 2013-09-11 | 腾讯科技(深圳)有限公司 | 一种数据转换方法及系统 |
CN103970737A (zh) * | 2013-01-24 | 2014-08-06 | 腾讯科技(深圳)有限公司 | 一种数据构造方法和装置 |
US20150039591A1 (en) * | 2013-07-30 | 2015-02-05 | International Business Machines Corporation | Method and apparatus for proliferating testing data |
CN103942280A (zh) * | 2014-04-02 | 2014-07-23 | 云南电网公司 | 一种基于数据结构自动生成代码的方法 |
Non-Patent Citations (1)
Title |
---|
聂晓旭 等: "基于Protobuf的数据传输协议", 《计算机系统应用》 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107480053A (zh) * | 2017-07-21 | 2017-12-15 | 杭州销冠网络科技有限公司 | 一种软件测试数据生成方法及装置 |
CN111611174A (zh) * | 2020-05-28 | 2020-09-01 | 北京字节跳动网络技术有限公司 | 一种测试数据的构造方法、装置、计算机设备及存储介质 |
CN111611174B (zh) * | 2020-05-28 | 2023-08-11 | 北京火山引擎科技有限公司 | 一种测试数据的构造方法、装置、计算机设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN106066828B (zh) | 2019-02-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104683386A (zh) | 可定制响应的桩服务实现方法及装置 | |
CN106648945B (zh) | 一种接口数据测试方法、装置及电子设备 | |
CN105069118B (zh) | 一种基于gis配置的应用场景管理方法及系统 | |
CN103810196B (zh) | 基于业务模型进行数据库性能测试的方法 | |
CN106302442A (zh) | 一种基于Java语言的网络通讯数据包解析方法 | |
CN110222067B (zh) | 区块链智能合约锚定可信任外部数据库的方法及系统 | |
CN105554726B (zh) | 一种配置文件的加载方法及用户终端 | |
CN105808227A (zh) | 一种美术资源文件检测方法和装置 | |
CN104732332A (zh) | 基于电子商务的订单拆分方法和装置 | |
CN106547681A (zh) | 数据自动加载并复用模拟服务测试的方法和装置 | |
CN104133765B (zh) | 网络活动的测试用例发送方法及测试用例服务器 | |
CN108415708A (zh) | 应用程序安装包大小的处理方法、装置、设备和存储介质 | |
CN106066828A (zh) | 一种生成Protobuf格式测试数据的方法及装置 | |
CN108255481A (zh) | 应用开发方法及相关设备 | |
CN107342910A (zh) | 模拟多用户进行网络访问的自动化测试方法及工具 | |
CN108933787A (zh) | 报文生成方法及装置 | |
CN106850650A (zh) | 用于游戏客户端访问数据的方法及客户端游戏系统 | |
CN106021340A (zh) | 一种实现Android终端动态表格控件的方法 | |
GB2400780A (en) | Converting graphic object data | |
CN101295251B (zh) | 一种界面发布方法和装置 | |
CN103744942B (zh) | 网页浏览方法及装置、网页浏览终端设备 | |
CN106293679B (zh) | 一种元素名称冲突处理方法及装置 | |
CN106681735A (zh) | 基于字体生成动态图标的方法、装置及设备 | |
CN109271160A (zh) | 活动规则组建方法、装置和计算机系统、介质 | |
CN106873931A (zh) | 栅格数据可视化装置、方法及计算机系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |