CN115344502B - 基于真实数据自动生成mock数据及自动加载的方法 - Google Patents

基于真实数据自动生成mock数据及自动加载的方法 Download PDF

Info

Publication number
CN115344502B
CN115344502B CN202211269872.9A CN202211269872A CN115344502B CN 115344502 B CN115344502 B CN 115344502B CN 202211269872 A CN202211269872 A CN 202211269872A CN 115344502 B CN115344502 B CN 115344502B
Authority
CN
China
Prior art keywords
mock
data
name
class
file
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.)
Active
Application number
CN202211269872.9A
Other languages
English (en)
Other versions
CN115344502A (zh
Inventor
刘欢
张镜
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Yunzhu Information Technology Chengdu Co ltd
China State Construction eCommerce Co Ltd
Original Assignee
Yunzhu Information Technology Chengdu Co ltd
China State Construction eCommerce Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Yunzhu Information Technology Chengdu Co ltd, China State Construction eCommerce Co Ltd filed Critical Yunzhu Information Technology Chengdu Co ltd
Priority to CN202211269872.9A priority Critical patent/CN115344502B/zh
Publication of CN115344502A publication Critical patent/CN115344502A/zh
Application granted granted Critical
Publication of CN115344502B publication Critical patent/CN115344502B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3696Methods or tools to render software testable

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)

Abstract

本发明公开了基于真实数据自动生成mock数据及自动加载的方法,解决现有mock代码需要手动编写以及mock数据与程序真实执行时不同的技术问题,所述方法包括配置单元测试所需的mock方法,并对单元测试方法进行注解;使用AOP技术前置拦截,获取单元测试方法注解中配置的所需类方法的信息列表;使用字节码插桩技术对类方法进行方法插桩;对插桩后的类方法进行测试,并使用AOP技术后置拦截,恢复插桩前的方法。本发明设计科学合理,使用方便,无需进行mock代码的编写,在执行调用一次后会自动生成mock数据,之后的调用即可直接使用由真实数据构建的mock数据。

Description

基于真实数据自动生成mock数据及自动加载的方法
技术领域
本发明属于数据处理技术领域,具体涉及基于真实数据自动生成mock数据及自动加载的方法。
背景技术
复杂***测试,例如java语言单元测试,基于现有数据或者上游数据进行单元测试的情况下,需要手动构建mock数据(模拟数据),构建过程复杂繁琐。这些手动构建的mock模拟数据可能会被随意填写,且在mock(模拟)后需要手动指定mock源进行加载,无法做到无感知的对单元测试目标方法进行调用。
因此,本发明提供了基于真实数据自动生成mock数据及自动加载的方法,以至少解决上述部分技术问题。
发明内容
本发明要解决的技术问题是:提供基于真实数据自动生成mock数据及自动加载的方法,以至少解决上述部分技术问题。
为实现上述目的,本发明采用的技术方案如下:
基于真实数据自动生成mock数据及自动加载的方法,包括以下步骤:
步骤1、配置单元测试所需的mock方法,并对单元测试方法进行注解;
步骤2、使用AOP技术前置拦截,获取单元测试方法注解中配置的所需类方法的信息列表;
步骤3、使用字节码插桩技术对类方法进行方法插桩;
步骤4、对插桩后的类方法进行测试,并使用AOP技术后置拦截,恢复插桩前的方法。
进一步地,所述步骤1中,使用元数据配置文件或代码注解方式对单元测试方法进行注解;注解作用域是方法级别;注解属性值为类名和方法签名的全限定名组合而成的字符串数组。
进一步地,所述步骤2具体为:使用AOP的通知参数获取单元测试内部的属性,由单元测试内部的属性获取单元测试方法的注解,提取出注解属性值的字符串数组,遍历字符串数组并逐个解析。
进一步地,所述遍历字符串数组并逐个解析的过程包括:获取字符串数组中的mock方法所属类名,在所属类名的后面采用第一分隔符进行切分;在第一分隔符的后面获取mock方法参数类型名称列表,采用括号符号将mock方法参数类型名称列表括起来,并在括号内采用第二分隔符对mock方法参数类型名称列表中mock方法参数类型名称进行切分;将第一分隔符和括号之间的部分获取为mock方法名称。
进一步地,所述步骤3具体为:步骤31、使用java反射获取mock方法所属类名,得到原始类对象,将原始类对象存入创建的列表中;步骤32、对原始类对象的方法进行插桩;步骤33、将原始类对象替换为热加载插桩后的类对象。
进一步地,所述步骤32为:遍历列表,使用字节码生成工具,创建字节码对象,调用重定义方法传入原始类对象,调用字节码访问方法传入增强类、mock方法名称和mock方法参数类型名称中,最后调用类生成方法和类加载方法进行类加载。
进一步地,所述步骤4具体为:步骤41、获取插桩后类方法的方法签名;步骤42、以该方法签名作为路径参数查找本地路径下是否存在单元测试的mock数据的本地文件;步骤43、若mock数据的本地文件存在,读取本地文件内数据并反序列化该数据,将反序列化数据作为测试目标类对象的真实方法返回值,同时停止测试目标后续代码运行;若mock数据的本地文件不存在,该单元测试所在的单元运行生成的数据将自动保存为mock数据,并序列化到本地文件并保存;步骤43、将插桩后的类对象替换为原始类对象。
进一步地,所述步骤42具体为:首先将方法签名的空白字符替换为连接号字符,得到文件名字符串,再通过文件名字符串拼接前缀路径字符串和json文件后缀字符,得到文件路径,然后使用java文件操作判断该文件路径下是否存在本地文件。
进一步地,所述步骤43具体为:若本地文件存在,使用java文件操作读取本地文件中的数据,再使用序列化工具,将该数据反序列化并赋值给测试目标类对象的真实方法返回值,并且执行方法返回停止测试目标后续代码运行;若本地文件不存在,使用序列化工具,将该单元测试所在的单元运行生成的数据序列化为json字符串,再使用java文件操作将该json字符串写入本地文件中。
进一步地,所述序列化工具采用FastJson序列化工具。
与现有技术相比,本发明具有以下有益效果:
本发明设计科学合理,使用方便,无需进行mock代码的编写,在执行调用一次后会自动生成mock数据,之后的调用即可直接使用由真实数据构建的mock数据;利用真实数据库数据或其他代码中使用的数据进行mock数据的构建,具有真实模拟效果。
附图说明
图1为本发明方法流程图。
具体实施方式
术语解释:
单元测试:针对面向对象程序编程实现中的单个方法,进行正确性检测的工具方法代码;
mock:在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为;
AOP:Aspect Oriented Programming 的缩写,为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术;
java:是一门面向对象的编程语言;
json:是一种轻量级的数据交换格式;
FastJson:是开发的一种开源库。
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进一步详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明提供的基于真实数据自动生成mock数据及自动加载的方法,包括以下步骤:
包括以下步骤:
步骤1、配置单元测试所需的mock方法,并对单元测试方法进行注解;
步骤2、使用AOP技术前置拦截,获取单元测试方法注解中配置的所需类方法的信息列表;
步骤3、使用字节码插桩技术对类方法进行方法插桩;
步骤4、对插桩后的类方法进行测试,并使用AOP技术后置拦截,恢复插桩前的方法。
本发明所述步骤1中,使用元数据配置文件或代码注解方式对mock方法进行注解;注解作用域是方法级别,包含1个属性;注解属性值为类名和方法签名的全限定名组合而成的字符串数组。所述组合采用以”#”拼接的方式。
本发明所述步骤2具体为:使用AOP(优选AOP技术中的Spring AOP技术)的通知参数获取单元测试内部的属性,由单元测试内部的属性获取单元测试方法的注解提取出注解属性值的字符串数组,遍历字符串数组并逐个解析。所述遍历字符串数组并逐个解析的过程包括:获取字符串数组中的mock方法所属类名,在所属类名的后面采用第一分隔符”#”进行切分;在第一分隔符的后面获取mock方法参数类型名称列表,采用括号符号将mock方法参数类型名称列表括起来,并在括号内采用第二分隔符”,”对mock方法参数类型名称列表中mock方法参数类型名称进行切分;将第一分隔符和括号之间的部分获取为mock方法名称。
本发明所述步骤3具体为:步骤31、使用java反射获取mock方法所属类名,得到原始类对象,将原始类对象存入创建的列表中;步骤32、对原始类对象的方法进行插桩;步骤33、将原始类对象替换为热加载插桩后的类对象。所述步骤32中,所述字节码生成工具采用ByteBuddy字节码生成工具,所述步骤32为:遍历列表,创建字节码ByteBuddy对象,调用重定义redefine方法传入类对象,调用visit方法传入增强类、mock方法名称和mock方法参数类型名称中,最后调用make方法和load方法进行类加载,所述增强类主要通过使用ByteBuddy的OnMethodEnter和OnMethodExit两个方法实现。所述步骤33为:遍历列表,创建字节码对象调用重定义方法传入原始类对象,最后调用make方法和load方法进行类加载。步骤32和步骤33中类加载的加载策略均优选Byte Buddy agent方式。
本发明所述步骤4具体为:步骤41、获取插桩后类方法的方法签名;步骤42、以该方法签名作为路径参数查找本地路径下是否存在单元测试的mock数据的本地文件;步骤43、mock数据的本地文件存在,读取本地文件内数据并反序列化该数据,将反序列化数据作为测试目标类对象的真实方法返回值,同时停止测试目标后续代码运行;mock数据的本地文件不存在,该单元测试所在的单元运行生成的数据将自动保存为mock数据,并序列化到本地文件并保存;步骤43、将热加载插桩后的类对象替换为原始类对象。其中,所述步骤42具体为:首先将方法签名的空白字符替换为连接号字符”-”,得到文件名字符串,再通过文件名字符串拼接前缀路径字符串和json文件后缀字符,得到文件路径,然后使用java文件操作判断该文件路径下是否存在本地文件。所述步骤43具体为:本地文件存在,使用java文件操作读取本地文件中的数据,再使用序列化工具,将该数据反序列化并赋值给测试目标类对象的真实方法返回值;本地文件不存在,使用序列化工具,将该单元测试所在的单元运行生成的数据序列化为json字符串,再使用java文件操作将该json字符串写入本地文件中。所述序列化工具采用FastJson序列化工具。
相较于现有技术在编写单元测试时需要提前将mock代码组装完毕,再进行测试方法的调用,本发明可以不用进行mock代码的编写,在执行调用一次后会自动生成mock数据,之后的调用可以直接使用由真实数据构建的mock数据。
相较于现有技术提供mock数据的自动生成,但通常是基于字段类型进行模拟数据的构建,本发明可以利用真实数据库数据或其他代码中使用的数据进行mock数据的构建,具有真实模拟效果。
最后应说明的是:以上各实施例仅仅为本发明的较优实施例用以说明本发明的技术方案,而非对其限制,当然更不是限制本发明的专利范围;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围;也就是说,但凡在本发明的主体设计思想和精神上作出的毫无实质意义的改动或润色,其所解决的技术问题仍然与本发明一致的,均应当包含在本发明的保护范围之内;另外,将本发明的技术方案直接或间接的运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (9)

1.基于真实数据自动生成mock数据及自动加载的方法,其特征在于,包括以下步骤:
步骤1、配置单元测试所需的mock方法,并对单元测试方法进行注解;
步骤2、使用AOP技术前置拦截,获取单元测试方法注解中配置的所需类方法的信息列表;
步骤3、使用字节码插桩技术对类方法进行方法插桩;
步骤4、对插桩后的类方法进行测试,并使用AOP技术后置拦截,恢复插桩前的方法;
所述步骤4具体为:步骤41、获取插桩后类方法的方法签名;步骤42、以该方法签名作为路径参数查找本地路径下是否存在单元测试的mock数据的本地文件;步骤43、若mock数据的本地文件存在,读取本地文件内数据并反序列化该数据,将反序列化数据作为测试目标类对象的真实方法返回值,同时停止测试目标后续代码运行;若mock数据的本地文件不存在,该单元测试所在的单元运行生成的数据将自动保存为mock数据,并序列化到本地文件并保存;步骤44、将插桩后的类对象替换为原始类对象。
2.根据权利要求1所述的基于真实数据自动生成mock数据及自动加载的方法,其特征在于,所述步骤1中,使用元数据配置文件或代码注解方式对单元测试方法进行注解;注解作用域是方法级别;注解属性值为类名和方法签名的全限定名组合而成的字符串数组。
3.根据权利要求2所述的基于真实数据自动生成mock数据及自动加载的方法,其特征在于,所述步骤2具体为:使用AOP的通知参数获取单元测试内部的属性,由单元测试内部的属性获取单元测试方法的注解,提取出注解属性值的字符串数组,遍历字符串数组并逐个解析。
4.根据权利要求3所述的基于真实数据自动生成mock数据及自动加载的方法,其特征在于,所述遍历字符串数组并逐个解析的过程包括:获取字符串数组中的mock方法所属类名,在所属类名的后面采用第一分隔符进行切分;在第一分隔符的后面获取mock方法参数类型名称列表,采用括号符号将mock方法参数类型名称列表括起来,并在括号内采用第二分隔符对mock方法参数类型名称列表中mock方法参数类型名称进行切分;将第一分隔符和括号之间的部分获取为mock方法名称。
5.根据权利要求3所述的基于真实数据自动生成mock数据及自动加载的方法,其特征在于,所述步骤3具体为:步骤31、使用java反射获取mock方法所属类名,得到原始类对象,将原始类对象存入创建的列表中;步骤32、对原始类对象的方法进行插桩;步骤33、将原始类对象替换为热加载插桩后的类对象。
6.根据权利要求5所述的基于真实数据自动生成mock数据及自动加载的方法,其特征在于,所述步骤32为:遍历列表,使用字节码生成工具,创建字节码对象,调用重定义方法传入原始类对象,调用字节码访问方法传入增强类、mock方法名称和mock方法参数类型名称中,最后调用类生成方法和类加载方法进行类加载。
7.根据权利要求5所述的基于真实数据自动生成mock数据及自动加载的方法,其特征在于,所述步骤42具体为:首先将方法签名的空白字符替换为连接号字符,得到文件名字符串,再通过文件名字符串拼接前缀路径字符串和json文件后缀字符,得到文件路径,然后使用java文件操作判断该文件路径下是否存在本地文件。
8.根据权利要求7所述的基于真实数据自动生成mock数据及自动加载的方法,其特征在于,所述步骤43具体为:若本地文件存在,使用java文件操作读取本地文件中的数据,再使用序列化工具,将该数据反序列化并赋值给测试目标类对象的真实方法返回值,并且执行方法返回停止测试目标后续代码运行;若本地文件不存在,使用序列化工具,将该单元测试所在的单元运行生成的数据序列化为json字符串,再使用java文件操作将该json字符串写入本地文件中。
9.根据权利要求8所述的基于真实数据自动生成mock数据及自动加载的方法,其特征在于,所述序列化工具采用FastJson序列化工具。
CN202211269872.9A 2022-10-18 2022-10-18 基于真实数据自动生成mock数据及自动加载的方法 Active CN115344502B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211269872.9A CN115344502B (zh) 2022-10-18 2022-10-18 基于真实数据自动生成mock数据及自动加载的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211269872.9A CN115344502B (zh) 2022-10-18 2022-10-18 基于真实数据自动生成mock数据及自动加载的方法

Publications (2)

Publication Number Publication Date
CN115344502A CN115344502A (zh) 2022-11-15
CN115344502B true CN115344502B (zh) 2023-03-10

Family

ID=83957691

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211269872.9A Active CN115344502B (zh) 2022-10-18 2022-10-18 基于真实数据自动生成mock数据及自动加载的方法

Country Status (1)

Country Link
CN (1) CN115344502B (zh)

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105389256A (zh) * 2015-11-11 2016-03-09 中国建设银行股份有限公司 一种单元测试方法及***
CN109446063A (zh) * 2018-09-18 2019-03-08 深圳壹账通智能科技有限公司 接口测试方法、装置、计算机设备和存储介质
CN109739656A (zh) * 2018-11-29 2019-05-10 东软集团股份有限公司 接口数据模拟方法、装置、存储介质和电子设备
CN110502224A (zh) * 2019-08-22 2019-11-26 深圳前海环融联易信息科技服务有限公司 基于http请求的接口模拟方法、装置和计算机设备
CN110633213A (zh) * 2019-09-19 2019-12-31 浙江大搜车软件技术有限公司 单元测试方法、装置、计算机设备和存储介质
CN113157590A (zh) * 2021-05-20 2021-07-23 中国工商银行股份有限公司 测试案例生成方法及装置
CN113553250A (zh) * 2020-04-23 2021-10-26 腾讯科技(深圳)有限公司 一种代码的测试方法和装置
CN113760397A (zh) * 2020-09-01 2021-12-07 北京京东拓先科技有限公司 接口调用的处理方法、装置、设备及存储介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7613597B2 (en) * 2006-01-20 2009-11-03 International Business Machines Corporation Non-intrusive method for simulation or replay of external events related to an application process, and a system implementing said method
CN106776313B (zh) * 2016-12-13 2020-06-23 广州品唯软件有限公司 一种模拟服务的方法、装置及集中管理平台
CN111797020A (zh) * 2020-07-03 2020-10-20 北京每日优鲜电子商务有限公司 基于动态字节码的mock数据方法及装置
CN114528214A (zh) * 2022-02-18 2022-05-24 马上消费金融股份有限公司 单元测试方法和装置

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105389256A (zh) * 2015-11-11 2016-03-09 中国建设银行股份有限公司 一种单元测试方法及***
CN109446063A (zh) * 2018-09-18 2019-03-08 深圳壹账通智能科技有限公司 接口测试方法、装置、计算机设备和存储介质
CN109739656A (zh) * 2018-11-29 2019-05-10 东软集团股份有限公司 接口数据模拟方法、装置、存储介质和电子设备
CN110502224A (zh) * 2019-08-22 2019-11-26 深圳前海环融联易信息科技服务有限公司 基于http请求的接口模拟方法、装置和计算机设备
CN110633213A (zh) * 2019-09-19 2019-12-31 浙江大搜车软件技术有限公司 单元测试方法、装置、计算机设备和存储介质
CN113553250A (zh) * 2020-04-23 2021-10-26 腾讯科技(深圳)有限公司 一种代码的测试方法和装置
CN113760397A (zh) * 2020-09-01 2021-12-07 北京京东拓先科技有限公司 接口调用的处理方法、装置、设备及存储介质
CN113157590A (zh) * 2021-05-20 2021-07-23 中国工商银行股份有限公司 测试案例生成方法及装置

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
"A language-independent approach to black-box testing using Erlang as test specification language";Laura M.Castro等;《Journal of Systems and Software》;20130718;第86卷(第12期);第3109-3122页 *
"基于J2EE架构软件测试的研究与应用";陈华;《中国优秀硕士学位论文全文数据库 信息科技辑》;20080615(第06期);I138-114 *
"面向HTTP API的自动化灰盒测试软件的设计与实现";梁鹏远;《中国优秀硕士学位论文全文数据库 信息科技辑》;20170215(第02期);I138-1761 *
面向方面软件测试的研究进展;顾海波等;《计算机科学》;20080925;第35卷(第09期);第266-269+277页 *

Also Published As

Publication number Publication date
CN115344502A (zh) 2022-11-15

Similar Documents

Publication Publication Date Title
CN112015628B (zh) 一种智能合约函数级动态监测分析***及实现方法
US7610545B2 (en) Annotations for tracking provenance
US7024661B2 (en) System and method for verifying computer program correctness and providing recoverable execution trace information
CN109918294B (zh) 一种混源软件自主可控性检测方法及***
Arcaini et al. AsmetaSMV: a way to link high-level ASM models to low-level NuSMV specifications
CN104461898A (zh) 应用测试的方法、中控服务器、测试终端及***
CN103970659A (zh) 基于插桩技术的安卓应用软件自动化测试方法
CN117009231B (zh) 基于对话式大语言模型的高可靠单元测试自动生成方法及装置
CN105224309B (zh) 一种调取函数的方法和装置
CN111736846B (zh) 一种面向动态分析的源代码插桩改进方法
CN106991100A (zh) 数据导入方法及装置
CN110096264A (zh) 一种代码运行方法及装置
CN111797020A (zh) 基于动态字节码的mock数据方法及装置
US10394685B2 (en) Extensible markup language (XML) path (XPATH) debugging framework
CN111240772A (zh) 一种基于区块链的数据处理方法、装置及存储介质
CN103235757B (zh) 基于自动化造数对输入域测试对象进行测试的装置和方法
CN110162299A (zh) web程序及其快速开发框架、开发方法与相关设备
CN115344502B (zh) 基于真实数据自动生成mock数据及自动加载的方法
CN109491884A (zh) 代码性能检测方法、装置、计算机设备和介质
CN115878097B (zh) 一种创建定时任务的方法及***
CN112925523B (zh) 对象比较方法、装置、设备及计算机可读介质
CN113467761A (zh) 一种基于Java反射原理的接口测试模板生成方法
CN113553250A (zh) 一种代码的测试方法和装置
JPH11134198A (ja) コンパイル処理装置、コンパイル処理方法、プログラム実行装置、プログラム実行方法及びプログラム記憶媒体
CN118051443B (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