CN112099838B - 确定版本差异的方法、装置及存储介质 - Google Patents
确定版本差异的方法、装置及存储介质 Download PDFInfo
- Publication number
- CN112099838B CN112099838B CN201910523473.2A CN201910523473A CN112099838B CN 112099838 B CN112099838 B CN 112099838B CN 201910523473 A CN201910523473 A CN 201910523473A CN 112099838 B CN112099838 B CN 112099838B
- Authority
- CN
- China
- Prior art keywords
- function
- interface
- list
- version
- determining
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种确定版本差异的方法、装置及存储介质,属于计算机领域。该方法包括:读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称;根据读取的函数名和每个函数的函数体包括的接口的名称,确定第一调用关系列表;获取第二调用关系列表和接口变更列表,接口变更列表用于指示接口组件的版本差异;根据第一调用关系列表和第二调用关系列表,确定应用程序的版本差异。本申请无需测试人员的参与,节省了人力成本,提高了效率,而且还能够保证确定出的版本差异的准确性。
Description
技术领域
本申请涉及计算机领域,特别涉及一种确定版本差异的方法、装置及存储介质。
背景技术
应用程序在运行过程中,可能需要依赖于一些诸如底层组件或者第三方SDK(Software Development Kit,软件开发工具)等接口组件来实现某些功能。也即是,应用程序中的一些函数可能需要调用接口组件提供的接口,从而实现某些功能。一旦应用程序或者接口组件中的至少一个发生改动,就会对应用程序的功能造成影响,因此,需要确定应用程序或者接口组件的版本差异,从而便于完善应用程序的功能。在相关技术中,测试人员可以手动进行分析,以确定应用程序或者接口组件的版本差异。但是,人工分析容易遗漏、耗时较长,而且精确度也不够高。
发明内容
本申请提供了一种确定版本差异的方法、装置及存储介质,可以解决相关技术的人工分析容易遗漏、耗时较长,而且精确度也不够高的问题。所述技术方案如下:
一方面,提供了一种确定版本差异的方法,所述方法包括:
读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称,所述第一源代码为第一版本的应用程序的源代码;
根据读取的函数名和每个函数的函数体包括的接口的名称,确定第一调用关系列表,所述第一调用关系列表用于指示第一版本的所述应用程序中的函数与所调用的接口之间的关系;
获取第二调用关系列表和接口变更列表,所述第二调用关系列表用于指示第二版本的所述应用程序中的函数与所调用的接口之间的关系,所述接口变更列表用于指示所述接口组件的版本差异;
根据所述第一调用关系列表和所述第二调用关系列表,确定所述应用程序的版本差异。
另一方面,提供了一种确定版本差异的装置,所述装置包括:
读取模块,用于读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称,所述第一源代码为第一版本的应用程序的源代码;
第一确定模块,用于根据读取的函数名和每个函数的函数体包括的接口的名称,确定第一调用关系列表,所述第一调用关系列表用于指示第一版本的所述应用程序中的函数与所调用的接口之间的关系;
第一获取模块,用于获取第二调用关系列表和接口变更列表,所述第二调用关系列表用于指示第二版本的所述应用程序中的函数与所调用的接口之间的关系,所述接口变更列表用于指示所述接口组件的版本差异;
第二确定模块,用于根据所述第一调用关系列表和所述第二调用关系列表,确定所述应用程序的版本差异。
另一方面,提供了一种确定版本差异的装置,所述装置包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由所述处理器加载并执行以实现上述确定版本差异的方法。
另一方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由处理器加载并执行以实现上述确定版本差异的方法。
另一方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述确定版本差异的方法。
本申请提供的技术方案至少可以带来以下有益效果:本申请可以读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称。根据读取的函数名和每个函数的函数体包括的接口的名称,可以确定用于指示第一版本的应用程序中的函数与所调用的接口之间的关系的调用关系列表,即第一调用关系列表。之后,可以根据第一调用关系列表和第二调用关系列表,确定应用程序的版本差异,并获取用于指示接口组件的版本差异的列表,即接口变更列表。也即是,本申请可以自动地确定应用程序的版本差异和接口组件的版本差异,无需测试人员来确定,节省了人力成本,提高了效率,而且还能够保证确定出的版本差异的准确性。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种确定版本差异的方法的流程图;
图2是本申请实施例提供的另一种确定版本差异的方法的流程图;
图3是本申请实施例提供的一种进行差异化分析的方法的流程图;
图4是本申请实施例提供的一种确定版本差异的装置的结构示意图;
图5是本申请实施例提供的一种测试设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在对本申请实施例提供的确定版本差异的方法进行详细地解释说明之前,先对本申请实施例的应用场景和实施环境予以说明。
应用程序在运行过程中,可能需要依赖于一些接口组件来实现某些功能。换句话说,应用程序中的一些函数可能需要调用接口组件提供的接口来实现某些功能。其中,接口组件可以为底层组件,也可以为第三方SDK。底层组件是指应用程序的开发者开发的且能够为应用程序提供接口的组件,第三方SDK是其他开发者开发的且能够为应用程序提供接口的组件。
可以理解的是,在一些场景中,如果应用程序需要增加某些功能,修改某些功能,或者删除某些不常用的功能,应用程序的源代码可能会被修改,从而对应用程序的功能进行升级。在另一些场景中,如果接口组件需要增加某些功能,修改某些功能,或者删除某些不常用的功能,接口组件的源代码也有可能会被修改,从而对接口组件的功能进行升级。当然,在其他一些场景中,应用程序的源代码和接口组件的源代码可能都会被修改。也就是说,应用程序的源代码和接口组件的源代码都有可能被修改。不管是应用程序的源代码被修改,还是接口组件的源代码被修改,都有可能会影响应用程序的功能,因此,需要根据本申请实施例提供的方法确定版本差异,从而完善应用程序的功能。
本申请实施例提供的版本差异的确定方法可以应用于测试设备中,该测试设备可以为终端、服务器等等,终端可以为手机、平板电脑、台式电脑等等,服务器可以为一台服务器,也可以为多台服务器组成的服务器集群,本申请实施例对此不作限定。
接下来对本申请实施例提供的确定版本差异的方法进行详细介绍。
请参考图1,图1是本申请实施例提供的一种确定版本差异的方法的流程图,该方法应用于测试设备中。该方法包括如下步骤。
步骤101:读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称,第一源代码为第一版本的应用程序的源代码。
源代码中通常可以声明多个函数,一个函数也可以调用接口组件中的一个接口,因此,源代码中针对每个函数编写有函数声明和函数体,函数体中可以包括函数所调用的接口的名称。为了获知第一源代码中都包括哪些函数,这些函数都调用了哪些接口,测试设备可以读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称。
需要说明的是,测试设备可以在检测到版本差异确定指令时,读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称,进而按照后续步骤来确定版本差异。其中,版本差异确定指令可以是人为触发得到,也可以为测试设备检测到存在新版本的应用程序时触发得到。也即是,当测试人员确定存在新版本的应用程序时,可以触发版本差异确定指令。或者,测试设备在检测到存在新版本的应用程序时,触发版本差异确定指令。
对于测试设备来说,测试设备可以按照第一路径下针对应用程序已存储的源代码对应的版本号,检测第一路径下是否存储有新版本的应用程序的源代码,如果存在,那么,可以将新版本的应用程序的源代码作为上述第一源代码,进而触发版本差异确定指令。其中,第一路径是指应用程序的源代码的存储路径。
需要说明的是,第一路径下针对应用程序已存储的源代码可以是已经发布的应用程序的源代码,此时,这些源代码对应的版本号是指已经发布的应用程序的版本号。上述第一源代码是指新版本的应用程序的源代码,也即是,第一版本的应用程序当前并未发布,此时,第一源代码的版本号也可以称为构建号。
步骤102:根据读取的函数名和每个函数的函数体包括的接口的名称,确定第一调用关系列表,第一调用关系列表用于指示第一版本的应用程序中的函数与所调用的接口之间的关系。
由于一个函数可以调用一个接口,也即是,函数与接口之间存在调用关系,因此,可以根据读取的函数名和每个函数的函数体包括的接口的名称,确定第一调用关系列表。
示例性地,假设第一版本的应用程序中包括5个函数,名称分别为11、12、13、14和15,名称为11的函数的函数体包括的接口的名称为21,名称为12的函数的函数体包括的接口的名称为22,名称为13的函数的函数体包括的接口的名称为23,名称为14的函数的函数体包括的接口的名称为24,名称为15的函数的函数体包括的接口的名称为25。也即是,名称为11的函数调用名称为21的接口,名称为12的函数调用名称为22的接口,名称为13的函数调用名称为23的接口,名称为14的函数调用名称为24的接口,名称为15的函数调用名称为25的接口。根据读取的5个函数的函数名和5个函数的函数体包括的接口的名称,可以生成如下表1所示的第一调用关系列表。
表1
需要说明的是,上述表1所示的第一调用关系列表是一种示例,并不对本申请实施例构成限定。
需要说明的是,应用程序采用的编程语言和接口组件采用的编程语言可能相同,也可能不同。当两者采用的编程语言不同时,需要采用中间语言转换成同一种语言。也即是,假设应用程序采用的编程语言为第一语言,接口组件采用的编程语言为第二语言,测试设备从第一源代码中读取出第一语言的函数名和接口的名称之后,可以按照第一语言和第三语言之间的映射关系,确定出第三语言的函数名和接口的名称。之后,即可通过第三语言的函数名和接口的名称生成第一调用关系列表。
也即是,对于多种不同语言的源代码,测试设备都可以对源代码进行分析来确定调用关系列表,而不仅仅只能对一种语言的源代码进行分析,从而可以提高测试设备的语言兼容性。
步骤103:获取第二调用关系列表和接口变更列表,第二调用关系列表用于指示第二版本的应用程序中的函数与所调用的接口之间的关系,接口变更列表用于指示接口组件的版本差异。
需要说明的是,第一版本的应用程序是指新版本的应用程序,那么,相对于第一版本的应用程序,第二版本的应用程序是指旧版本的应用程序。
在一些实施例中,当每生成一个新版本的应用程序时,测试设备都会按照本申请实施例提供的方法确定版本差异。而且,测试设备还可以存储每次进行版本差异时确定的调用关系列表。因此,对于第二调用关系列表,测试设备可以从存储的调用关系列表中获取得到,而不用再次按照上述步骤101-102的方法重新生成第二调用关系列表,节省了时间,提高了效率。
基于上述描述,应用程序可能会被修改,接口组件也有可能会被修改,因此,获取第一调用关系列表和第二调用关系列表之外,还可以获取接口变更列表。由于接口组件可以为底层组件,也可以为第三方SDK,因此,接下来分两种情况对获取接口变更列表的方式进行说明。
第一种情况,接口组件为底层组件。
由于底层组件是应用程序的开发者开发的,测试设备用来对应用程序的功能进行测试,因此,测试设备可以获知底层组件的源代码。在这种情况下,测试设备获取接口变更列表的操作可以为:读取第二源代码中的函数声明包括的函数名,将读取的函数名作为接口组件中的接口的名称,第二源代码为第一版本的接口组件的源代码。根据接口组件中的接口的名称确定第一接口列表,第一接口列表用于指示第一版本的接口组件所提供的接口。获取第二接口列表,第二接口列表用于指示第二版本的接口组件所提供的接口。根据第一接口列表和第二接口列表,确定接口变更列表。
需要说明的是,接口组件对外提供的是接口,但是接口在接口组件的内部实际上是一个函数,因此,测试设备可以将第二源代码中读取的函数名作为接口组件的接口的名称。另外,第一版本的接口组件和第二版本的接口组件是指两个不同版本的接口组件,相对于第二版本的接口组件,第一版本的接口组件是新版本的接口组件,也即是,第一版本的接口组件和第二版本的接口组件是为了区分两个不同版本的接口组件,与第一版本的应用程序并没有版本上的关系。换句话说,第一版本的接口组件的版本号与第一版本的应用程序的版本号没有关系,第二版本的接口组件的版本号与第二版本的应用程序的版本号没有关系。
在一些实施例中,当每生成一个新版本的接口组件时,测试设备都会按照本申请实施例提供的方法确定版本差异。而且,测试设备还可以存储每次进行版本差异时确定的接口列表。因此,对于第二接口列表,测试设备可以从存储的接口列表中获取得到,而不用再次按照生成第一接口列表的方式重新生成第二接口列表,节省了时间,提高了效率。
作为一种示例,测试设备根据第一接口列表和第二接口列表,确定接口变更列表的操作可以为:确定第一接口列表和第二接口列表的交集,将确定的交集包括的表项作为第三表项。确定第一接口列表和第二接口列表中除至少一个第三表项之外的其他表项的并集,将确定的并集包括的表项作为第四表项。确定多个第四表项中每个第四表项对应的差异标签,差异标签用于指示第四表项中的接口的变更情况。根据多个第四表项和每个第四表项对应的差异标签,可以生成接口变更列表。
示例性地,假设第一版本的接口组件中包括5个函数名,分别为21、22、24、25和26,将这5个函数名作为接口组件的接口的名称。根据这5个接口的名称可以生成如下表2所示的第一接口列表。假设,第二接口列表如下述表3所示。通过表2和表3可知,相对于第二版本的接口组件,第一版本的接口组件删除了名称为23的接口,增加了名称为26的接口,此时,可以确定名称为23的接口对应的差异标签为标签1,用于指示名称为23的接口为删除的接口。确定名称为26的接口对应的差异标签为标签2,用于指示名称为26的接口为增加的接口。
表2
接口名称 |
21 |
22 |
24 |
25 |
26 |
表3
接口名称 |
21 |
22 |
23 |
24 |
25 |
表4
接口名称 | 差异标签 |
23 | 标签1:删除的接口 |
26 | 标签2:增加的接口 |
需要说明的是,测试设备可以按照多个第四表项和每个第四表项对应的差异标签,生成上述表4所示的接口变更列表,当然,测试设备按照多个第四表项和每个第四表项对应的差异标签还可以生成其他形式的接口变更列表。也即是,上述表4所示的接口变更列表是一种示例,并不对本申请构成限定。
值得注意的是,在某些情况下,源代码中的函数声明包括的函数名可能没有变化,但是函数体可能会发生变化,因此,为了提高准确率,对于每个第三表项,测试设备还可以确定第三表项包括的接口在第一版本的接口组件的源代码中对应的函数体与其在第二版本的接口组件的源代码中对应的函数体是否相同,如果相同,那么可以进一步确认这个第三表项没有变动,如果不同,那么可以确定这个第三表项发生了变动,此时可以将这个第三表项称为第四表项,然后,确定当前这个第四表项的差异标签,以指示这个第四表项包括的接口是发生修改的接口。之后,将这个第四表项和其对应的差异标签也添加至接口变更列表中。
第二种情况,接口组件为第三方SDK。
由于第三方SDK不是应用程序的开发者开发的,因此,测试设备可能无法获知第三方SDK的源代码。但是,第三方提供第三方SDK的情况下,还提供有每个版本的第三方SDK的接口列表。也即是,对于第一版本的第三方SDK,第三方提供有第一接口列表,对于第二版本的第三方SDK,第三方提供有第二接口列表。在这种情况下,测试设备获取接口变更列表的操作可以为:获取第一接口列表和第二接口列表,第一接口列表用于指示第一版本的接口组件所提供的接口,第二接口列表用于指示第二版本的接口组件所提供的接口。根据第一接口列表和第二接口列表,确定接口变更列表。
作为一种示例,测试设备根据第一接口列表和第二接口列表,确定接口变更列表的操作可以为:确定第一接口列表和第二接口列表的交集,将确定的交集包括的表项作为第三表项。确定第一接口列表和第二接口列表中除至少一个第三表项之外的其他表项的并集,将确定的并集包括的表项作为第四表项。确定多个第四表项中每个第四表项对应的差异标签,差异标签用于指示第四表项中的接口的变更情况。根据多个第四表项和每个第四表项对应的差异标签,可以生成接口变更列表。
基于上述描述,应用程序采用的编程语言与接口组件采用的编程语言可能不同,为了便于后续确定应用程序的版本差异,第二调用关系列表也是基于第三语言确定的。同时,上述确定接口变更列表时,也可以通过第三语言,将第二语言的接口变更列表进行转换。
步骤104:根据第一调用关系列表和第二调用关系列表,确定应用程序的版本差异。
在一些实施例中,测试设备可以确定第一调用关系列表和第二调用关系列表的交集,将确定的交集包括的表项作为第一表项。确定第一调用关系列表和第二调用关系列表中除至少一个第一表项之外的其他表项的并集,将确定的并集包括的表项作为第二表项。确定多个第二表项中每个第二表项对应的差异标签,差异标签用于指示第二表项中的函数与接口的调用关系的差异情况。
作为一种示例,可以根据多个第二表项和每个第二表项对应的差异标签,生成调用关系变更列表。调用关系变更列表用于指示应用程序的版本差异。
示例性地,假设第二调用关系列表如下述表5所示,通过表1和表5可知,相对于第二版本的应用程序,第一版本的应用程序增加了名称为12的函数调用名称为22的接口的调用关系,删除了名称为14的函数调用名称为24的接口的调用关系,删除了名称为15的函数调用名称为22的接口的调用关系,增加了名称为15的函数调用名称为25的接口的调用关系,删除了名称为16的函数调用名称为24的接口的调用关系,删除了名称为17的函数调用名称为25的接口的调用关系。也即是,相对于第二版本的应用程序,第一版本的应用程序中将调用名称为22的接口的函数从14修改为12,将调用名称为24的接口的函数从14修改为16,将调用名称为25的接口的函数从17修改为16。
表5
函数名 | 接口名称 |
11 | 21 |
13 | 23 |
15 | 22 |
16 | 24 |
17 | 25 |
表6
需要说明的是,测试设备可以按照多个第二表项和每个第二表项对应的差异标签,生成上述表6所示的调用关系变更列表,当然,测试设备按照多个第二表项和每个第二表项对应的差异标签还可以生成其他形式的调用关系变更列表。也即是,上述表6所示的调用关系变更列表是一种示例,并不对本申请构成限定。
基于上述描述,应用程序的源代码可能会被修改,接口组件的源代码也有可能被修改,当然,应用程序的源代码和接口组件的源代码可能会被同时修改。当应用程序的源代码被修改,接口组件的源代码未修改时,测试设备可以按照上述方式确定应用程序的版本差异。当应用程序的源代码未修改,接口组件的源代码被修改时,测试设备可以按照上述方式确定接口组件的版本差异。当应用程序的源代码和接口组件的源代码同时被修改时,测试设备可以按照上述方式确定应用程序和版本差异和接口组件的版本差异。
应用程序中可能包括一些常用的功能,也有可能包括一些不常用的功能,常用的功能在源代码中对应的函数可以称为关键函数,不常用的功能在源代码中对应的函数可以称为非关键函数。由于关键函数可能对应用程序的使用造成较大的影响,非关键函数可能对应用程序的使用不会造成较大的影响,也即是,关键函数需要立马投入研发者对应用程序进行维护,非关键函数可能不用立马投入研发者对应用程序进行维护,因此,对于接口组件的版本差异涉及的任一函数,或者应用程序的版本差异涉及的任一函数,可以按照下述方法来确定其是否为关键函数,从而确定出版本差异影响了哪些关键函数,进而便于确定是否需要对应用程序的源代码进行修改,或者确定需要投入多少研发者来修改应用程序的源代码。
作为一种示例,对于第一函数,如果多个关键函数名称中存在第一函数的名称,则将第一函数确定为关键函数,第一函数为接口组件的版本差异涉及的任一函数,或者为应用程序的版本差异涉及的任一函数。对于接口组件的版本差异和应用程序的版本差异涉及的其他函数,也可以按照上述方法来确定其是否为关键函数,本申请实施例对此不做详细阐述。
在确定接口组件的版本差异和应用程序的版本差异涉及的函数是否为关键函数时,需要基于多个关键函数名称来确定,这多个关键函数名称可以通过用户使用应用程序的情况来确定。作为一种示例,测试设备可以获取多个函数调用日志,函数调用日志用于指示应用程序在使用过程中用到的函数以及每个函数所调用的接口。对该多个函数调用日志进行分析,得到应用程序中每个函数的使用频率。将应用程序中使用频率大于频率阈值的函数的名称确定为上述多个关键函数名称。
需要说明的是,函数调用日志中记录有应用程序运行过程中,使用了哪些函数,每个函数都调用了哪些接口,因此,通过函数调用日志可以统计出每个函数的使用频率。
值得注意的是,上述通过函数调用日志统计函数的使用频率,进而通过使用频率确定关键函数名称的方法是一种示例。测试设备还可以通过其他的方法确定关键函数名称。作为另一种示例,可以确定应用程序包括的每个函数对应的功能的重要程度,将重要程度大于一定阈值的功能对应的函数确定为应用程序中的关键函数,进而得到多个关键函数名称。也就是说,可以将应用程序中比较重要的一些功能对应的函数确定为关键函数,进而得到多个关键函数名称。
基于上述描述,接口组件的版本差异和应用程序的版本差异涉及的函数对应用程序的功能可能会造成影响,因此,根据第一调用关系列表和第二调用关系列表,确定应用程序的版本差异之后,还可以对接口组件的版本差异和应用程序的版本差异涉及的函数在应用程序中对应的功能进行测试,以确定应用程序的功能是否受到了影响。作为一种示例,对于第一函数,生成第一函数对应的测试用例,第一函数为接口组件的版本差异涉及的任一函数,或者为应用程序的版本差异涉及的任一函数。运行测试用例,以对第一函数对应的功能进行测试。也即是,测试设备可以自动生成测试用例,通过运行测试用例来对函数对应的功能进行测试,无需测试人员手动进行测试。
需要说明的是,上述步骤是用来确定应用程序的版本差异和接口组件的版本差异。在一些实施例中,应用程序可能包括多个组件,这多个组件之间可能也存在调用关系,接口组件也可能包括多个子组件,这多个子组件之间可能也存在调用关系。也即是,应用程序中的一个组件发生改动之后,对其他组件可能也会造成影响,接口组件中的一个子组件发生改动之后,对其他子组件或者应用程序都可能会造成影响。因此,对于应用程序中的每个组件,以及接口组件中的每个子组件,也可以参照上述方法来确定版本差异。
基于上述描述,应用程序和接口组件中可能存在多个组件需要确定版本差异,为了提高效率,测试设备可以并行地确定这多个组件的版本差异。
在本申请实施例中,测试设备可以读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称。根据读取的函数名和每个函数的函数体包括的接口的名称,可以确定用于指示第一版本的应用程序中的函数与所调用的接口之间的关系的调用关系列表,即第一调用关系列表。之后,可以根据第一调用关系列表和第二调用关系列表,确定应用程序的版本差异,并获取用于指示接口组件的版本差异的列表,即接口变更列表。也即是,测试设备可以自动地确定应用程序的版本差异和接口组件的版本差异,无需测试人员来确定,节省了人力成本,提高了效率,而且还能够保证确定出的版本差异的准确性。
在一些实施例中,可以通过图2和图3所示的流程图表示版本差异的确定方法的详细过程。参见图2,测试设备可以进行任务设置,即,设置步骤101中的版本差异确定指令的触发方式是手动触发方式还是自动触发,设置应用程序采用的编程语言和接口组件采用的编程语言,以及设置应用程序的源代码的存储路径。这样,测试设备可以启动监听,当检测到手动触发或者自动触发的版本差异确定指令时,可以判断应用程序的编程语言和接口组件的编程语言是否相同,进而按照判断结果确定应用程序的第一调用关系列表,并按照第一调用关系列表和第二调用关系列表进行应用程序的差异化分析,也即是,确定应用程序的版本差异。还可以进行接口组件的差异化分析,即,确定接口组件的版本差异。从而得到版本差异结果。
关于应用程序的差异化分析和接口组件的差异化分析,参见图3,测试设备可以判断是否存在用于指示接口组件的版本差异的接口变更列表,如果存在,那么可以直接对应用程序的差异化进行分析。如果不存在,那么可以对接口组件的新旧版本的接口列表进行比对,以确定接口变更列表。也即是,对第一接口列表和第二接口列表进行比对,以确定接口变更列表。
图4是本申请实施例提供的一种确定版本差异的装置的结构示意图,该确定版本差异的装置可以由软件、硬件或者两者的结合实现成为测试设备的部分或者全部。参见图4,该装置包括:获取模块401、第一确定模块402、第一获取模块403和第二确定模块404。
读取模块401,用于读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称,第一源代码为第一版本的应用程序的源代码;
第一确定模块402,用于根据读取的函数名和每个函数的函数体包括的接口的名称,确定第一调用关系列表,第一调用关系列表用于指示第一版本的应用程序中的函数与所调用的接口之间的关系;
第一获取模块403,用于获取第二调用关系列表和接口变更列表,第二调用关系列表用于指示第二版本的应用程序中的函数与所调用的接口之间的关系,接口变更列表用于指示接口组件的版本差异;
第二确定模块404,用于根据第一调用关系列表和第二调用关系列表,确定应用程序的版本差异。
可选地,第二确定模块404包括:
第一确定子模块,用于确定第一调用关系列表和第二调用关系列表的交集,将交集包括的表项作为第一表项;
第二确定子模块,用于确定第一调用关系列表和第二调用关系列表中除至少一个第一表项之外的其他表项的并集,将并集包括的表项作为第二表项;
第三确定子模块,用于确定多个第二表项中每个第二表项对应的差异标签,差异标签用于指示第二表项中的函数与接口的调用关系的差异情况。
可选地,接口组件为底层组件;
第一获取模块403包括:
读取子模块,用于读取第二源代码中的函数声明包括的函数名,将读取的函数名作为接口组件中的接口的名称,第二源代码为第一版本的接口组件的源代码;
第四确定子模块,用于根据接口组件中的接口的名称确定第一接口列表,第一接口列表用于指示第一版本的接口组件所提供的接口;
获取子模块,用于获取第二接口列表,第二接口列表用于指示第二版本的接口组件所提供的接口;
第五确定子模块,用于根据第一接口列表和第二接口列表,确定接口变更列表。
可选地,该装置还包括:
第三确定模块,用于对于第一函数,如果多个关键函数名称中存在第一函数的名称,则将第一函数确定为关键函数,第一函数为接口组件的版本差异涉及的任一函数,或者为应用程序的版本差异涉及的任一函数。
可选地,该装置还包括:
第二获取模块,用于获取多个函数调用日志,函数调用日志用于指示应用程序在使用过程中用到的函数以及每个函数所调用的接口;
分析模块,用于对多个函数调用日志进行分析,得到应用程序中每个函数的使用频率;
第四确定模块,用于将应用程序中使用频率大于频率阈值的函数的名称确定为多个关键函数名称。
可选地,该装置还包括:
生成模块,用于对于第一函数,生成第一函数对应的测试用例,第一函数为接口组件的版本差异涉及的任一函数,或者为应用程序的版本差异涉及的任一函数;
运行模块,用于运行测试用例,以对第一函数对应的功能进行测试。
在本申请实施例中,测试设备可以读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称。根据读取的函数名和每个函数的函数体包括的接口的名称,可以确定用于指示第一版本的应用程序中的函数与所调用的接口之间的关系的调用关系列表,即第一调用关系列表。之后,可以根据第一调用关系列表和第二调用关系列表,确定应用程序的版本差异,并获取用于指示接口组件的版本差异的列表,即接口变更列表。也即是,测试设备可以自动地确定应用程序的版本差异和接口组件的版本差异,无需测试人员来确定,节省了人力成本,提高了效率,而且还能够保证确定出的版本差异的准确性。
需要说明的是:上述实施例提供的确定版本差异的装置在确定版本差异时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的确定版本差异的装置与确定版本差异的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图5是本申请实施例提供的一种测试设备的结构示意图,该测试设备500可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(central processingunits,CPU)501和一个或一个以上的存储器502,其中,所述存储器502中存储有至少一条指令,所述至少一条指令由该处理器501加载并执行,以实现上述实施例中确定版本差异的方法。当然,该测试设备500还可以具有有线或无线网络接口、键盘以及输入输出接口等部件,以便进行输入输出,该测试设备500还可以包括其他用于实现设备功能的部件,在此不做赘述。
在示例性实施例中,还提供了一种计算机可读存储介质,该存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由处理器加载并执行以实现上述确定版本差异的方法。例如,所述计算机可读存储介质可以是ROM(read-only memory,只读存储器)、RAM(random access memory,随机存取存储器)、CD-ROM(Compact Disc Read-Only Memory,只读光盘)、磁带、软盘和光数据存储设备等。
值得注意的是,本申请提到的计算机可读存储介质可以为非易失性存储介质,换句话说,是非瞬时性存储介质。
应当理解的是,实现上述实施例的全部或部分步骤可以通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。所述计算机指令可以存储在上述计算机可读存储介质中。
也即是,在示例性实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述确定版本差异的方法。
以上所述为本申请提供的实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (10)
1.一种确定版本差异的方法,其特征在于,所述方法包括:
读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称,所述第一源代码为第一版本的应用程序的源代码;
根据读取的函数名和每个函数的函数体包括的接口的名称,确定第一调用关系列表,所述第一调用关系列表用于指示第一版本的所述应用程序中的函数与所调用的接口之间的关系,其中,所述应用程序采用的编程语言为第一语言,接口组件采用的编程语言为第二语言,所述第一语言与所述第二语言相同或不同,当不同时,转换得到第三语言的函数名称和接口名称,通过第三语言的函数名称和接口名称生成所述第一调用关系列表;
获取第二调用关系列表和接口变更列表,所述第二调用关系列表用于指示第二版本的所述应用程序中的函数与所调用的接口之间的关系,所述接口变更列表用于指示所述接口组件的版本差异,所述第一语言与所述第二语言不同时,所述第二调用关系列表和所述接口变更列表为基于转换得到的第三语言确定;
根据所述第一调用关系列表和所述第二调用关系列表,确定所述应用程序的版本差异。
2.如权利要求1所述的方法,其特征在于,所述根据所述第一调用关系列表和所述第二调用关系列表,确定所述应用程序的版本差异,包括:
确定所述第一调用关系列表和所述第二调用关系列表的交集,将所述交集包括的表项作为第一表项;
确定所述第一调用关系列表和所述第二调用关系列表中除至少一个所述第一表项之外的其他表项的并集,将所述并集包括的表项作为第二表项;
确定多个所述第二表项中每个所述第二表项对应的差异标签,所述差异标签用于指示所述第二表项中的函数与接口的调用关系的差异情况。
3.如权利要求1所述的方法,其特征在于,所述接口组件为底层组件;
获取接口变更列表,包括:
读取第二源代码中的函数声明包括的函数名,将读取的函数名作为所述接口组件中的接口的名称,所述第二源代码为第一版本的所述接口组件的源代码;
根据所述接口组件中的接口的名称确定第一接口列表,所述第一接口列表用于指示第一版本的所述接口组件所提供的接口;
获取第二接口列表,所述第二接口列表用于指示第二版本的所述接口组件所提供的接口;
根据所述第一接口列表和所述第二接口列表,确定所述接口变更列表。
4.如权利要求1所述的方法,其特征在于,所述根据所述第一调用关系列表和所述第二调用关系列表,确定所述应用程序的版本差异之后,还包括:
对于第一函数,如果多个关键函数名称中存在所述第一函数的名称,则将所述第一函数确定为关键函数,所述第一函数为所述接口组件的版本差异涉及的任一函数,或者为所述应用程序的版本差异涉及的任一函数。
5.如权利要求4所述的方法,其特征在于,所述如果多个关键函数名称中存在所述第一函数的名称,则将所述第一函数确定为关键函数之前,还包括:
获取多个函数调用日志,所述函数调用日志用于指示所述应用程序在使用过程中用到的函数以及每个函数所调用的接口;
对所述多个函数调用日志进行分析,得到所述应用程序中每个函数的使用频率;
将所述应用程序中使用频率大于频率阈值的函数的名称确定为所述多个关键函数名称。
6.如权利要求1所述的方法,其特征在于,所述根据所述第一调用关系列表和所述第二调用关系列表,确定所述应用程序的版本差异之后,还包括:
对于第一函数,生成所述第一函数对应的测试用例,所述第一函数为所述接口组件的版本差异涉及的任一函数,或者为所述应用程序的版本差异涉及的任一函数;
运行所述测试用例,以对所述第一函数对应的功能进行测试。
7.一种确定版本差异的装置,其特征在于,所述装置包括:
读取模块,用于读取第一源代码中的函数声明包括的函数名,以及每个函数的函数体包括的接口的名称,所述第一源代码为第一版本的应用程序的源代码;
第一确定模块,用于根据读取的函数名和每个函数的函数体包括的接口的名称,确定第一调用关系列表,所述第一调用关系列表用于指示第一版本的所述应用程序中的函数与所调用的接口之间的关系,其中,所述应用程序采用的编程语言为第一语言,接口组件采用的编程语言为第二语言,所述第一语言与所述第二语言相同或不同,当不同时,转换得到第三语言的函数名称和接口名称,通过第三语言的函数名称和接口名称生成所述第一调用关系列表;
第一获取模块,用于获取第二调用关系列表和接口变更列表,所述第二调用关系列表用于指示第二版本的所述应用程序中的函数与所调用的接口之间的关系,所述接口变更列表用于指示所述接口组件的版本差异,所述第一语言与所述第二语言不同时,所述第二调用关系列表和所述接口变更列表为基于转换得到的第三语言确定;
第二确定模块,用于根据所述第一调用关系列表和所述第二调用关系列表,确定所述应用程序的版本差异。
8.如权利要求7所述的装置,其特征在于,所述第二确定模块包括:
第一确定子模块,用于确定所述第一调用关系列表和所述第二调用关系列表的交集,将所述交集包括的表项作为第一表项;
第二确定子模块,用于确定所述第一调用关系列表和所述第二调用关系列表中除至少一个所述第一表项之外的其他表项的并集,将所述并集包括的表项作为第二表项;
第三确定子模块,用于确定多个所述第二表项中每个所述第二表项对应的差异标签,所述差异标签用于指示所述第二表项中的函数与接口的调用关系的差异情况。
9.一种确定版本差异的装置,其特征在于,所述装置包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由所述处理器加载并执行以实现如权利要求1-6任一项所述的确定版本差异的方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述指令、所述程序、所述代码集或所述指令集由处理器加载并执行以实现如权利要求1-6任一项所述的确定版本差异的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910523473.2A CN112099838B (zh) | 2019-06-17 | 2019-06-17 | 确定版本差异的方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910523473.2A CN112099838B (zh) | 2019-06-17 | 2019-06-17 | 确定版本差异的方法、装置及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112099838A CN112099838A (zh) | 2020-12-18 |
CN112099838B true CN112099838B (zh) | 2023-08-15 |
Family
ID=73748664
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910523473.2A Active CN112099838B (zh) | 2019-06-17 | 2019-06-17 | 确定版本差异的方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112099838B (zh) |
Citations (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7043505B1 (en) * | 2003-01-28 | 2006-05-09 | Unisys Corporation | Method variation for collecting stability data from proprietary systems |
CN103699488A (zh) * | 2013-12-30 | 2014-04-02 | 优视科技有限公司 | 基于调用关系依赖图的回归测试方法及系统 |
CN104035772A (zh) * | 2014-06-09 | 2014-09-10 | 中国科学院软件研究所 | 基于静态分析的源码多版本函数调用关系差异性标识方法 |
CN104572132A (zh) * | 2015-02-05 | 2015-04-29 | 中国农业银行股份有限公司 | 一种程序版本差异确定方法及装置 |
CN105335204A (zh) * | 2014-07-29 | 2016-02-17 | 株式会社日立制作所 | 软件程序的灰度发布控制方法和灰度发布控制装置 |
CN106020950A (zh) * | 2016-05-12 | 2016-10-12 | 中国科学院软件研究所 | 基于复杂网络分析的函数调用图关键节点识别和标识方法 |
CN106021110A (zh) * | 2016-05-24 | 2016-10-12 | 南京大学 | 基于虚函数表继承关系的代码重利用攻击检测方法 |
JP2017045354A (ja) * | 2015-08-28 | 2017-03-02 | 富士通株式会社 | ソフトウェア開発支援プログラム、ソフトウェア開発支援装置、及びソフトウェア開発支援方法 |
CN106502876A (zh) * | 2016-10-26 | 2017-03-15 | 腾讯科技(深圳)有限公司 | 一种热点函数确定的方法及相关设备 |
CN106528399A (zh) * | 2015-09-15 | 2017-03-22 | 腾讯科技(深圳)有限公司 | 一种测试用例确定方法及装置 |
CN106610838A (zh) * | 2016-12-27 | 2017-05-03 | 北京酷我科技有限公司 | 一种多种脚本语言的转换方法 |
CN106648636A (zh) * | 2016-12-08 | 2017-05-10 | 北京航空航天大学 | 一种基于图挖掘的软件函数变更预测系统及方法 |
CN106776350A (zh) * | 2017-02-10 | 2017-05-31 | 腾讯科技(深圳)有限公司 | 一种程序的精准测试方法和装置 |
CN106909510A (zh) * | 2017-03-02 | 2017-06-30 | 腾讯科技(深圳)有限公司 | 一种获取测试用例的方法以及服务器 |
CN106951228A (zh) * | 2017-02-21 | 2017-07-14 | 腾讯科技(深圳)有限公司 | 版本迭代中差异的处理方法和装置 |
JP2017142712A (ja) * | 2016-02-12 | 2017-08-17 | 富士通株式会社 | コールグラフ差分抽出方法、コールグラフ差分抽出プログラム、および情報処理装置 |
WO2018015963A1 (en) * | 2016-07-21 | 2018-01-25 | Ramot At Tel-Aviv University Ltd. | Method and system for comparing sequences |
CN108334490A (zh) * | 2017-04-07 | 2018-07-27 | 腾讯科技(深圳)有限公司 | 关键词提取方法以及关键词提取装置 |
CN109782090A (zh) * | 2019-01-08 | 2019-05-21 | 国网安徽省电力有限公司合肥供电公司 | 一种判断用电户变关系的方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7661097B2 (en) * | 2005-04-05 | 2010-02-09 | Cisco Technology, Inc. | Method and system for analyzing source code |
US8898285B2 (en) * | 2010-11-01 | 2014-11-25 | Architecture Technology Corporation | Service oriented architecture version and dependency control |
US10248536B2 (en) * | 2016-10-31 | 2019-04-02 | International Business Machines Corporation | Method for static and dynamic configuration verification |
-
2019
- 2019-06-17 CN CN201910523473.2A patent/CN112099838B/zh active Active
Patent Citations (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7043505B1 (en) * | 2003-01-28 | 2006-05-09 | Unisys Corporation | Method variation for collecting stability data from proprietary systems |
CN103699488A (zh) * | 2013-12-30 | 2014-04-02 | 优视科技有限公司 | 基于调用关系依赖图的回归测试方法及系统 |
CN104035772A (zh) * | 2014-06-09 | 2014-09-10 | 中国科学院软件研究所 | 基于静态分析的源码多版本函数调用关系差异性标识方法 |
CN105335204A (zh) * | 2014-07-29 | 2016-02-17 | 株式会社日立制作所 | 软件程序的灰度发布控制方法和灰度发布控制装置 |
CN104572132A (zh) * | 2015-02-05 | 2015-04-29 | 中国农业银行股份有限公司 | 一种程序版本差异确定方法及装置 |
JP2017045354A (ja) * | 2015-08-28 | 2017-03-02 | 富士通株式会社 | ソフトウェア開発支援プログラム、ソフトウェア開発支援装置、及びソフトウェア開発支援方法 |
CN106528399A (zh) * | 2015-09-15 | 2017-03-22 | 腾讯科技(深圳)有限公司 | 一种测试用例确定方法及装置 |
JP2017142712A (ja) * | 2016-02-12 | 2017-08-17 | 富士通株式会社 | コールグラフ差分抽出方法、コールグラフ差分抽出プログラム、および情報処理装置 |
CN106020950A (zh) * | 2016-05-12 | 2016-10-12 | 中国科学院软件研究所 | 基于复杂网络分析的函数调用图关键节点识别和标识方法 |
CN106021110A (zh) * | 2016-05-24 | 2016-10-12 | 南京大学 | 基于虚函数表继承关系的代码重利用攻击检测方法 |
WO2018015963A1 (en) * | 2016-07-21 | 2018-01-25 | Ramot At Tel-Aviv University Ltd. | Method and system for comparing sequences |
CN106502876A (zh) * | 2016-10-26 | 2017-03-15 | 腾讯科技(深圳)有限公司 | 一种热点函数确定的方法及相关设备 |
CN106648636A (zh) * | 2016-12-08 | 2017-05-10 | 北京航空航天大学 | 一种基于图挖掘的软件函数变更预测系统及方法 |
CN106610838A (zh) * | 2016-12-27 | 2017-05-03 | 北京酷我科技有限公司 | 一种多种脚本语言的转换方法 |
CN106776350A (zh) * | 2017-02-10 | 2017-05-31 | 腾讯科技(深圳)有限公司 | 一种程序的精准测试方法和装置 |
CN106951228A (zh) * | 2017-02-21 | 2017-07-14 | 腾讯科技(深圳)有限公司 | 版本迭代中差异的处理方法和装置 |
CN106909510A (zh) * | 2017-03-02 | 2017-06-30 | 腾讯科技(深圳)有限公司 | 一种获取测试用例的方法以及服务器 |
CN108334490A (zh) * | 2017-04-07 | 2018-07-27 | 腾讯科技(深圳)有限公司 | 关键词提取方法以及关键词提取装置 |
CN109782090A (zh) * | 2019-01-08 | 2019-05-21 | 国网安徽省电力有限公司合肥供电公司 | 一种判断用电户变关系的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112099838A (zh) | 2020-12-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110221982B (zh) | 业务系统的性能测试方法、装置、设备及可读存储介质 | |
US8397104B2 (en) | Creation of test plans | |
CN110309039B (zh) | 自动化获取应用程序日志的方法、装置、设备及存储介质 | |
CN110046086B (zh) | 用于测试的期望数据生成方法及装置和电子设备 | |
CN114185791A (zh) | 一种数据映射文件的测试方法、装置、设备及存储介质 | |
CN112241362A (zh) | 一种测试方法、装置、服务器及存储介质 | |
CN111767213B (zh) | 数据库检查点的测试方法、装置、电子设备及存储介质 | |
CN112099838B (zh) | 确定版本差异的方法、装置及存储介质 | |
CN110716859A (zh) | 自动为修改的代码推送测试用例的方法及相关装置 | |
CN116756037A (zh) | 异常代码定位系统、方法、设备及计算机可读存储介质 | |
CN116483888A (zh) | 程序评估方法及装置、电子设备和计算机可读存储介质 | |
CN113688031B (zh) | 一种基于字节码增强技术的测试定位方法 | |
CN115309661A (zh) | 一种应用测试方法、装置、电子设备及可读存储介质 | |
CN115052037A (zh) | 客户端检测方法、装置、存储介质和设备 | |
CN114528214A (zh) | 单元测试方法和装置 | |
US9495278B2 (en) | Dynamic discovery of data segments within instrumented code | |
CN109165127B (zh) | 问题接口的定位方法、装置及电子设备 | |
CN111008147B (zh) | 应用程序的测试方法、终端及计算机可读存储介质 | |
CN110688430A (zh) | 一种获得数据旁路的方法、装置及电子设备 | |
CN116483735B (zh) | 一种代码变更的影响分析方法、装置、存储介质及设备 | |
CN117453514A (zh) | 代码分析方法及装置、计算机可读存储介质、终端 | |
CN110825650B (zh) | 单元测试覆盖精度检测方法及装置 | |
CN115391214A (zh) | 一种测试案例检测方法及装置 | |
CN114780952A (zh) | 敏感应用调用场景的检测方法、系统及存储介质 | |
CN111930549A (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 |