CN115309642A - 一种代码测试方法、装置、电子设备及存储介质 - Google Patents
一种代码测试方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN115309642A CN115309642A CN202210939210.1A CN202210939210A CN115309642A CN 115309642 A CN115309642 A CN 115309642A CN 202210939210 A CN202210939210 A CN 202210939210A CN 115309642 A CN115309642 A CN 115309642A
- Authority
- CN
- China
- Prior art keywords
- test
- code
- memory
- expected
- operation result
- 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.)
- Pending
Links
Images
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/3688—Test management for test execution, e.g. scheduling of test suites
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
本发明实施例公开了一种代码测试方法、装置、电子设备及存储介质。该方法包括:响应于代码测试指令,获取测试代码,并且注册内存数据源,其中,内存数据源用于在内存数据库中进行数据读取;基于内存数据源,从内存数据库中读取到测试数据;基于读取到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。本发明实施例中的技术方案,通过内存数据源从内存数据库中读取测试数据进行代码测试,由此可以避免出现测试数据被污染或在调试BUG时需要重置测试数据的情况,从而降低了代码测试难度。
Description
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种代码测试方法、装置、电子设备及存储介质。
背景技术
目前采用Java语言开发的系统在交付前,通常会进行代码测试来覆盖各种业务场景,从而保证系统交付的质量。
在实现本发明的过程中,发明人发现现有技术中存在以下技术问题:代码测试难度较大。
发明内容
本发明实施例提供了一种代码测试方法、装置、电子设备及存储介质,以降低代码测试难度。
根据本发明的一方面,提供了一种代码测试方法,可以包括:
响应于代码测试指令,获取测试代码,并且注册内存数据源,其中,内存数据源用于在内存数据库中进行数据读取;
基于内存数据源,从内存数据库中读取测试数据;
基于读取到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。
根据本发明的另一方面,提供了一种代码测试装置,可以包括:
内存数据源注册模块,用于响应于代码测试指令,获取测试代码,并且注册内存数据源,其中,内存数据源用于在内存数据库中进行数据读取;
测试数据读取模块,用于基于内存数据源,从内存数据库中读取测试数据;
测试结果得到模块,用于基于读取到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。
根据本发明的另一方面,提供了一种电子设备,可以包括:
至少一个处理器;以及
与至少一个处理器通信连接的存储器;其中,
存储器存储有可被至少一个处理器执行的计算机程序,计算机程序被至少一个处理器执行,以使至少一个处理器执行时实现本发明任意实施例所提供的代码测试方法。
根据本发明的另一方面,提供了一种计算机可读存储介质,其上存储有计算机指令,该计算机指令用于使处理器执行时实现本发明任意实施例所提供的代码测试方法。
本发明实施例的技术方案,通过响应于代码测试指令,获取测试代码,并注册内存数据源,该内存数据源用于在内存数据库中进行数据读取;基于内存数据源从内存数据库中读取测试数据;基于读取到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。上述技术方案,通过内存数据源从内存数据库中读取测试数据进行代码测试,由此可以避免出现测试数据被污染或在调试BUG时需要重置测试数据的情况,从而降低了代码测试难度。
应当理解,本部分所描述的内容并非旨在标识本发明的实施例的关键或是重要特征,也不用于限制本发明的范围。本发明的其它特征将通过以下的说明书而变得容易理解。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本发明实施例提供的一种代码测试方法的流程图;
图2是根据本发明实施例提供的另一种代码测试方法的流程图;
图3是根据本发明实施例提供的另一种代码测试方法的流程图;
图4是根据本发明实施例提供的另一种代码测试方法中可选示例的流程图;
图5是根据本发明实施例提供的一种代码测试装置的结构框图;
图6是实现本发明实施例的代码测试方法的电子设备的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。“目标”、“原始”等的情况类似,在此不再赘述。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
图1是本发明实施例中提供的一种代码测试方法的流程图。本实施例可以适用于代码测试的情况,尤其适用于通过从内存数据库中读取测试数据来进行代码测试的情况。该方法可以由本发明实施例提供的代码测试装置来执行,该装置可以由软件和/或硬件的方式实现,该装置可以集成在电子设备上,该设备可以是各种用户终端或服务器。
参见图1,本发明实施例的方法具体包括如下步骤:
S110、响应于代码测试指令,获取测试代码,并且注册内存数据源,其中,内存数据源用于在内存数据库中进行数据读取。
其中,代码测试指令可以是用于确定测试代码在被运行后得到的实际运行结果是否满足预期运行结果的指令;测试代码可以是待进行测试的代码,实际应用中,可选的,其可以是单元测试代码(即待进行单元测试的代码)或回归测试代码(即待进行回归测试的代码)等,在此未做具体限定。
内存数据源可以用于在内存数据库中进行数据读取。实际应用中,可选的,该内存数据源可以理解为用于在内存数据库中实现数据读取功能的工具、插件服务或是代码段等,在此未做具体限定;再可选的,该内存数据源也可以称为代理数据源,这是因为在某些应用场景下,其可以代理(即替代)用于在磁盘数据库中进行数据读取的磁盘数据源。
响应于代码测试指令,获取测试代码,并且注册内存数据源。需要说明的是,这里的注册内存数据源可以理解为让已创建的内存数据源可被应用,从而使其可在内存数据库中进行数据读取;也可以理解为先创建内存数据源,然后再让已创建的内存数据源可被应用,从而使其可在内存数据库中进行数据读取;等等,在此未做具体限定。
S120、基于内存数据源,从内存数据库中读取测试数据。
其中,测试数据可以是在对测试代码进行测试时需要应用的数据,如测试代码是计算器中的加法代码时,测试数据可以是具体的加数和被加数。如上文所述,内存数据源可以用于在内存数据库中进行数据读取,因此这里可以基于内存数据源从内存数据库中读取到测试数据。
S130、基于读取得到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。
其中,基于读取到的测试数据运行测试代码,得到测试代码在被实际运行后输出的实际运行结果,以便根据实际运行结果确定测试代码的测试结果,如展示实际运行结果,以使相关人员将展示出来的实际运行结果与预期运行结果进行核对,从而得到测试结果,该预期运行结果可以理解为在基于读取得到的测试数据运行测试代码的情况下预期得到的运行结果;再如获取预期运行结果,并通过自动核对实际运行结果和预期运行结果来得到测试结果,在实际应用中,可选的,这里的获取预期运行结果可以从内存数据库、内存或是缓存中获取;当然,也可以通过其余方式得到测试结果,在此未做具体限定。
为了更好地理解上述技术方案为什么可以降低代码测试难度,在这里先对现有的代码测试方案为什么存在代码测试难度这一问题进行示例性说明。示例性的,现有的代码测试方案通常从磁盘数据库中读取测试数据,这一读取机制会导致如下两种情况的出现:
一、在实际代码测试过程中,不同测试系统的测试人员通常使用同一测试数据库(即存储有测试数据的磁盘数据库),那么这就可能存在测试数据被污染的情况,如某测试系统需要应用的1被其余测试系统需改为2,进而导致实际运行结果和预期运行结果不一致,此时无法快速确定这一测试BUG到底是由于测试数据被污染而导致的,还是由于测试代码有问题而导致的,从而大大增加了代码测试难度。针对上述情况,也可以通过错开测试数据或者错开测试时段来解决,但是这无疑也会增加代码测试难度。
二、当出现测试BUG时,为了对调试Bug,需要重复执行测试数据。需要说明的是,在代码测试阶段,通常会对已经测试过的测试数据进行打标,由此表示该测试数据已被测试,无需进行测试。但是,在调试BUG阶段,这些已经测试过的测试数据需要再次进行测试,因此需要对它们进行去标或是说重置,以使它们可再次被测试。显然,这一额外操作也会增加代码测试难度。
在此基础上,本发明实施例中阐述的代码测试方法是从内存数据库中读取测试数据,由于存储在任一测试系统内的内存数据库中的测试数据不会被其余测试系统的测试操作干扰到,从而可以避免出现测试数据被污染的情况,换言之,这里通过内存数据库实现了应用的测试数据与存储在磁盘数据库上的测试数据间的强隔离;而且,当需要重复测试那些已被打标的测试数据时,只需要重新执行一次上述代码测试方法即可,无需重置测试数据,这是因为内存数据库的性质决定自身在被重新启动时,其内的测试数据可以被自动清空并且重新加载。显然,本发明实施例中阐述的代码测试方法可以显著降低代码测试难度。
本发明实施例的技术方案,通过响应于代码测试指令,获取测试代码,并注册内存数据源,该内存数据源用于在内存数据库中进行数据读取;基于内存数据源从内存数据库中读取测试数据;基于读取到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。上述技术方案,通过内存数据源从内存数据库中读取测试数据进行代码测试,由此可以避免出现测试数据被污染或在调试BUG时需要重置测试数据的情况,从而降低了代码测试难度。
一种可选的技术方案,在响应于代码测试指令之后,上述代码测试方法,还可以包括:获取表结构,并基于表结构创建测试数据库表;获取结构化查询语言脚本,并通过执行结构化查询语言脚本来获取到结构化查询语言脚本中的测试数据;将获取到的测试数据填入测试数据库表中,根据填入结果更新测试数据库表,将测试数据库表加载到内存数据库中;基于内存数据源从内存数据库中读取测试数据,可包括:基于内存数据源,从加载到内存数据库中的测试数据库表中读取到测试数据。
其中,表结构可以用于描述待创建的测试数据库表的结构,在实际应用中,可选的,其可以从配置文件中获取到。基于表结构创建测试数据库表,该测试数据库表可以用于存储测试数据。获取结构化查询语言(Structured Query Language,SQL)脚本,并通过执行该SQL脚本来获取到自身中存储的测试数据。在实际应用中,可选的,可以先从配置文件中获取到测试数据所在的SQL脚本的脚本标识,进而通过脚本标识获取到该SQL脚本;再可选的,该SQL脚本也可以理解为测试数据的数据源。将获取到的测试数据填入测试数据库表中,并根据填入结果更新测试数据库表,然后将测试数据库表加载到内存数据库中,从而实现了测试数据库表或说测试数据库表中的测试数据的有效加载的效果。进一步,可以基于内存数据源从加载到内存数据库中的测试数据库表中读取到测试数据,从而实现了测试数据的有效读取的效果。
在此基础上,可选的,上述代码测试方法,还可包括:获取测试数据来源配置;获取结构化查询语言脚本,可包括:响应于根据测试数据来源配置确定从结构化查询语言脚本中获取测试数据,获取该结构化查询语言脚本。其中,测试数据来源配置可以表示是从SQL脚本中加载测试数据,还是从磁盘数据库中加载测试数据。在实际应用中,可选的,存储在磁盘数据库中的测试数据也可以认为是基于SQL脚本导入到磁盘数据库中的。如果根据测试数据来源配置确定从SQL脚本中加载测试数据,则获取该SQL脚本,以便实现测试数据的有效加载。实际应用中,考虑到有些测试数据需要从SQL脚本中获取,而有些测试数据需要从磁盘数据库中获取,可选的,上述代码测试方法,还可以包括:响应于根据测试数据来源配置确定从磁盘数据库中获取测试数据,从磁盘数据库中获取到测试数据,并将获取到的测试数据加载到内存数据库中,由此达到了允许通过多种方式实现测试数据加载的效果。
图2是本发明实施例中提供的另一种代码测试方法的流程图。本实施例以上述各技术方案为基础进行优化。在本实施例中,可选的,上述代码测试方法,还可以包括:基于内存数据源从内存数据库中,读取在基于读取到的测试数据运行测试代码的情况下的预期运行结果;以根据实际运行结果确定测试代码的测试结果,可以包括:对实际运行结果和预期运行结果进行核对,并根据核对结果得到测试代码的测试结果。其中,与上述各实施例相同或相应的术语的解释在此不再赘述。
参见图2,本实施例的方法具体可以包括如下步骤:
S210、响应于代码测试指令,获取测试代码,并且注册内存数据源,其中,内存数据源用于在内存数据库中进行数据读取。
S220、基于内存数据源从内存数据库中读取测试数据,并基于读取得到的测试数据运行测试代码,得到测试代码的实际运行结果。
S230、基于内存数据源从内存数据库中,读取在基于读取到的测试数据运行测试代码的情况下的预期运行结果。
其中,预期运行结果可以是在基于读取到的测试数据运行测试代码的情况下预期的运行结果,例如在测试加法代码时,假设测试数据包括作为加数的1以及作为被加数的2,那么此时的预期运行结果为3。由于预期运行结果存储在内存数据库中,因此可以基于内存数据源从内存数据库中读取到预期运行结果。
S240、对实际运行结果和预期运行结果进行核对,并根据核对结果得到测试代码的测试结果。
其中,对实际运行结果和预期运行结果进行核对,然后可以根据核对结果得到测试代码的测试结果,如在二者一致时,测试结果可以是测试代码在上述测试数据下正确;否则,测试结果可以是测试代码在上述测试数据下有误。
本发明实施例的技术方案,通过内存数据源从内存数据库中读取到在基于测试数据运行测试代码的情况下的预期运行结果,然后将实际运行结果和预期运行结果进行核对,从而根据核对结果得到测试代码的测试结果,这种自动化的运行结果核对方式,降低了人工核对成本并且提高了核对效率和准确率。
一种可选的技术方案,对实际运行结果和预期运行结果进行核对,可包括:获取已生成的运行结果核对脚本;通过执行运行结果核对脚本,以对实际运行结果和预期运行结果进行核对。其中,上述运行结果核对过程,可以通过执行运行结果核对脚本来实现,该运行结果核对脚本可以是在运行测试代码前或后自动生成的与测试代码紧密关联的脚本。因此,在需要核对运行结果时,可以先获取已生成的运行结果核对脚本,然后通过执行获取到的运行结果核对脚本来实现运行结果的核对功能,从而保证了运行结果的有效核对。
在此基础上,可选的,预期运行结果被存储在预期数据库表的预期业务字段下,预期数据库表被加载在内存数据库;上述代码测试方法,还可以包括:获取预期业务字段、以及预先配置的运行结果核对规则,并基于预期业务字段和运行结果核对规则,生成运行结果核对脚本;基于内存数据源从内存数据库中,读取在基于读取到的测试数据运行测试代码的情况下的预期运行结果,可包括:通过执行运行结果核对脚本,以基于内存数据源,从加载在内存数据库中的预期数据库表的预期业务字段下读取预期运行结果;通过执行运行结果核对脚本,以对实际运行结果和预期运行结果进行核对,可包括:通过执行运行结果核对脚本,以对实际运行结果及读取到的预期运行结果进行核对。
其中,预期业务字段可以是预期数据库表中用于存储预期运行结果的业务字段,该预期数据库表已被加载到内存数据库中。运行结果核对规则可以表示基于何种规则核对实际运行结果和预期运行结果,除此外,其还可以表示预期运行结果是从某某数据库表中的某某业务字段下查询得到,当然,这里的某某都是待确定的。需要说明的是,在基于测试数据运行测试代码之后得到的实际运行结果可以直接放在内存中,也可以通过实际数据库表加载在内存数据库中。对于后者,运行结果核对规则还可以表示出实际运行结果是从某某数据库表中的某某业务字段下查询得到,当然,这里的某某也是待确定的。上述运行结果核对规则可以是通过预先配置得到的默认规则,也可以是基于实际情况再通过接口自定义得到的实时规则,等等,在此未做具体限定;上述实际数据库表以及预期数据库表,可以是相同或是不同的数据库表,在此未做具体限定。基于预期业务字段和运行结果核对规则,生成运行结果核对脚本。
进一步,由于运行结果核对脚本中存储有从何处获取到预期运行结果相关的信息,因此可以通过执行运行结果核对脚本,以基于内存数据源,从加载在内存数据库中的预期数据库表的预期业务字段下读取预期运行结果;在此基础上,由于运行结果核对脚本中还存储有与如何核对运行结果相关的信息,因此可以通过执行运行结果核对脚本,以对实际运行结果及读取到的预期运行结果进行核对,从而达到了运行结果的有效核对的效果。
在此基础上,一可选的,获取预期业务字段,可以包括:获取预先配置的核对业务字段;读取结构化查询语言脚本中的脚本内容,并对读取到的脚本内容进行解析,得到至少一条结构化查询语言语句;针对于每条结构化查询语言语句,将结构化查询语言语句转换为结构化查询语言查询对象,并确定结构化查询语言查询对象中是否存在与核对业务字段对应的预期业务字段;如果是,则得到预期业务字段。其中,核对业务字段可以是预先配置的存在核对需求的业务字段,其可以与用于存储预期运行结果的预期业务字段相对应,也可以与用于存储实际运行结果的实际业务字段相对应,在此未做具体限定。这里以与预期业务字段对应的核对业务字段为例,读取SQL脚本中的脚本内容,然后对读取到的脚本内容进行解析,得到至少一条SQL语句;针对每条SQL语句,由于SQL语句中包含各种符号,而这些符号导致无法从SQL语句中快速得到有效信息,因此可以将SQL语句转换为更容易从中得到有效信息的SQL查询对象,进而确定SQL查询对象中是否存在与核对业务字段对应的预期业务字段,并在存在时,得到相应的预期业务字段,由此实现了预期业务字段的准确并且快速获取的效果。
另一可选的,在得到测试代码的实际运行结果之前,上述代码测试方法,还可以包括:获取预期运行结果、以及用于存储实际运行结果的实际数据库表;对实际数据库表进行重命名,生成预期数据库表;将预期运行结果存储到预期数据库表的预期业务字段下,并将存储有预期运行结果的预期数据库表加载到内存数据库中。其中,为了保证实际运行结果和预期运行结果读取的准确性,可以将这二者存储到不同的数据库表中,即实际数据库表和预期数据库表可以是不同的数据库表。那么,在实际数据库表先生成的情况下,可以通过对实际数据库表进行重命名的方式生成预期数据库表,然后实现预期运行结果的存储过程以及预期数据库表的加载过程,从而后续可以从内存数据库中读取到预期运行结果,由此保证了预期运行结果的有效读取的效果。
图3是本发明实施例中提供的另一种代码测试方法的流程图。本实施例以上述各技术方案为基础进行优化。在本实施例中,可选的,上述代码测试方法被封装为代码测试插件,代码测试插件被接入代码测试工具中,代码测试插件跟随代码测试工具的启动而启动。其中,与上述各实施例相同或相应的术语的解释在此不再赘述。
参见图3,本实施例的方法具体可以包括如下步骤:
S310、响应于代码测试指令,通过启动代码测试工具来启动代码测试插件,以使启动后的代码测试插件执行下述各个步骤,其中,代码测试插件被接入到代码测试工具中。
其中,代码测试工具可以是先前开发的用于进行代码测试的工具,将代码测试插件接入到代码测试工具中,从而可以跟随着代码测试工具的启动而自动启动代码测试插件,以使启动后的代码测试插件执行下述各个步骤。需要说明的是,代码测试插件可以认为是为了改进代码测试工具中的不足而开发的插件,这意味着代码测试插件可以在代码测试工具的基础上进行开发,无需从零开始开发,由此加快了代码测试插件的开发速度,而且由此开发出的代码测试插件具有更好的代码测试性能。
在此基础上,可选的,代码测试插件可以基于服务提供者接口(Service ProviderInterface,SPI)机制接入到代码测试工具中,这意味着无需将代码测试插件的相关代码复制到代码测试工具的相关代码中,降低了代码间的耦合度。再可选的,代码测试工具可以包括SpringBootTest工具,由于SpringBootTest工具可以覆盖测试系统中的全部业务场景,那么可与SpringBootTest工具配合使用的代码测试插件也可以覆盖全部业务场景,具有较好的扩展性。
S320、获取测试代码,并且注册内存数据源,其中,内存数据源用于在内存数据库中进行数据读取。
S330、基于内存数据源,从内存数据库中读取测试数据。
S340、基于读取得到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。
本发明实施例的技术方案,通过将在代码测试工具的基础上开发出的代码测试插件接入到代码测试工具中,由此可以跟随着代码测试工具的启动来自动启动代码测试插件,以使启动后的代码测试插件执行代码测试功能。上述代码测试插件无需从零开始开发,由此加快了代码测试插件的开发速度,而且由此开发出的代码测试插件具有更好的代码测试性能。
一种可选的技术方案,代码测试工具对应于用于从磁盘数据库中读取测试数据的磁盘数据源,上述代码测试方法,还可以包括:基于内存数据源替代磁盘数据源,以基于内存数据源从内存数据库中读取测试数据。其中,代码测试工具对应于磁盘数据源,这意味着代码测试工是从磁盘数据库中读取测试数据,该磁盘数据源也可以称为真实数据源。但是,正如上文所述,从磁盘数据库中读取测试数据时可能出现测试数据被污染或在调试BUG时需要重置测试数据的情况,代码测试难度较大。为此,在注册得到内存数据源后,可以基于内存数据源替代磁盘数据源,从而基于内存数据源从内存数据库中读取测试数据,由此降低了代码测试难度。
为了从整体上更好地理解上述各技术方案,下面结合具体示例对其示例性说明。示例性的,参见图4所示的代码测试插件执行的流程图,具体的:
第一步、代码测试插件发现:基于Spring Boot SPI方式接入代码测试插件(下文简称为插件),降低耦合性。在META-INF/spring.factories配置文件中配置插件的接口的实现类名称,SpringBootTest工具启动时,SpringBoot可自动读取这些配置文件并实例化,注册Spring容器初始化实现类来启动插件,以便由启动后的插件完成下述步骤。
第二步、解析配置文件:插件启动时,读取配置的环境变量以及插件提供的配置文件,该配置文件中存储有如下配置参数:
1)是否打开内存数据库H2控制台;
2)H2驱动版本、数据库名称、用户名、密码、以及数据库兼容模式;
3)是否打开自动对数功能,该对数功能即为运行结果核对功能;
4)是否打开预期运行结果解析功能;
5)需要使用H2的代理数据源进行代码测试的MyBatis Mapper配置目录,默认全部扫描,即默认全部测试数据都是从SQL脚本中获取。
第三步、自定义Bean初始化:
1)注册H2的代理数据源,H2的相关配置可在配置文件中定制化配置;
2)注册脚本执行器,用于执行DDL脚本(即用于创建表结构的脚本)以及SQL脚本(即存储有测试数据或是预期运行结果的脚本);
3)注册断言工具,用于运行结果核对;
4)注册数据源拦截器,用于基于代理数据源替代在测试系统中配置(即与SpringBootTest对应)的真实数据源。
第四步、数据初始化:加载SpringBoot项目resources下automation目录下的全部配置文件,初始化H2,加载依赖库表和数据(本步骤相当于基于第三步中注册好的工具实现表创建和数据填入等功能):
1)automation目录下配置详解:
①schema:执行代码测试所需(即依赖)的数据库表,即创建表结构,并基于表结构创建数据库表,例:结算佣金明细表;
②data:执行代码测试所需的数据源,即从数据源(亦可称为SQL脚本)中获取数据,例:结算佣金、结算日历;
③expect:执行代码测试后的预期运行结果,例:结算单表、结算单明细表、结算单佣金明细预期结果集;
④assert:核对业务字段,例:断言结算佣金明细表内推客ID、结算费用、实际入账金额、税费和结算月份;
2)使用ResourceDatabasePopulator工具,按照加载Schema、加载数据源、生成预期数据库表、以及生成并加载预期运行结果集顺序完成H2的数据库表以及数据的初始化。在加载过程中可以根据第二步中的配置参数选择是否执行解析操作或是加载操作,其中解析操作可以理解为对SQL文件进行解析,得到SQL语句,然后从SQL语句中得到数据的操作,加载操作可以理解为将数据库表或是数据加载到H2中、或是将数据填入到数据库表中;
加载预期运行结果集策略:使用jSQLparser读取预期运行结果Insert SQL,按照规则截取预期运行结果集表名,然后将预期运行结果SQL表名增加“_expect”后缀,生成新的SQL脚本保存到data_expect目录下,并使用ResourceDatabasePopulator工具将SQL数据加载到H2中。
第五步:根据已提供的核对业务字段SQL,并使用运行结果核对规则生成运行结果核对脚本:
1)遍历assert目录下的全部SQL脚本,即读取assert目录下的每个SQL脚本的脚本内容;
2)使用ScriptUtils从脚本内容中解析得到SQL语句;
3)使用CCJSQLParserUtil工具将2)中解析到SQL语句转换成SQL查询对象(PlainSelect),然后根据运行结果核对规则生成运行结果核对脚本,例如Select核对业务字段From(
Select核对业务字段From真实数据库表名
Union All(Select核对业务字段From预期运行结果集表名))
Group By核对业务字段Having count(*)<>2Order by核对业务字段。
第六步、核对实际运行结果和预期运行结果:
1)从H2中读取测试数据,并执行单元测试代码,若需要在单元测试代码中执行SQL,可以使AssertSQLTool.executeSQL工具;
2)调用AssertSQLTool.assertSQL工具运行结果核对脚本;
3)调用AssertSQLTool.exportAssertSQL工具执行运行结果核对脚本,然后导出核对结果,尤其是运行结果存在差异的核对结果到预设文件目录下。
综上可知,上述插件内嵌有内存数据库H2,以使单元测试中的测试数据的实际运行环境与外部环境完全隔离;提供了运行结果核对脚本的自动生成功能,从而实现了运行结果的自动核对;基于SPI机制实现了无耦合接入,只需引入Jar包和配置文件即可,对SpringBootTest工具的相关代码无侵入,由此实现了强隔离、低耦合以及高扩展的自动化代码测试效果。
图5为本发明实施例提供的代码测试装置的结构框图,该装置用于执行上述任意实施例所提供的代码测试方法。该装置与上述各实施例的代码测试方法属于同一个发明构思,在代码测试装置的实施例中未详尽描述的细节内容,可以参考上述代码测试方法的实施例。参见图5,该装置具体可包括:内存数据源注册模块410、测试数据读取模块420和测试结果得到模块430。其中,
内存数据源注册模块410,用于响应于代码测试指令,获取测试代码,并且注册内存数据源,其中,内存数据源用于在内存数据库中进行数据读取;
测试数据读取模块420,用于基于内存数据源,从内存数据库中读取测试数据;
测试结果得到模块430,用于基于读取到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。
可选的,在上述装置的基础上,该装置还可以包括:
测试数据库表创建模块,用于在响应于代码测试指令之后,获取表结构,并基于表结构创建测试数据库表;
测试数据获取模块,用于获取结构化查询语言脚本,并通过执行结构化查询语言脚本来获取到结构化查询语言脚本中的测试数据;
测试数据库表加载模块,用于将获取到的测试数据填入测试数据库表中,并根据填入结果更新测试数据库表,将测试数据库表加载到内存数据库中;
测试数据读取模块420,具体用于:
基于内存数据源,从加载到内存数据库中的测试数据库表中读取测试数据。
在此基础上,可选的,上述代码测试装置,还可以包括:
测试数据来源配置获取模块,用于获取测试数据来源配置;
测试数据获取模块,可以包括:
结构化查询语言脚本获取单元,用于响应于根据测试数据来源配置确定从结构化查询语言脚本中获取测试数据,获取结构化查询语言脚本。
可选的,上述代码测试装置,还可以包括:
预期运行结果读取模块,用于基于内存数据源从内存数据库中,读取在基于读取到的测试数据运行测试代码的情况下的预期运行结果;
测试结果得到模块430,可以包括:
测试结果得到单元,用于对实际运行结果和预期运行结果进行核对,根据核对结果得到测试代码的测试结果。
在此基础上,可选的,测试结果得到单元,可以包括:
运行结果核对脚本获取子单元,用于获取已生成的运行结果核对脚本;
运行结果核对子单元,用于通过执行运行结果核对脚本,以对实际运行结果和预期运行结果进行核对。
在此基础上,可选的,预期运行结果被存储在预期数据库表的预期业务字段下,预期数据库表被加载在内存数据库;
上述代码测试装置,还可以包括:
运行结果核对脚本生成模块,用于获取预期业务字段、及预先配置的运行结果核对规则,并基于预期业务字段和运行结果核对规则,生成运行结果核对脚本;
预期运行结果读取模块,可以包括:
预期运行结果读取单元,用于通过执行运行结果核对脚本以基于内存数据源,从加载在内存数据库中的预期数据库表的预期业务字段下读取到预期运行结果;
运行结果核对子单元,具体用于:
通过执行运行结果核对脚本,以对实际运行结果及读取到的预期运行结果进行核对。
在此基础上,一可选的,运行结果核对脚本生成模块,可以包括:
核对业务字段获取单元,用于获取预先配置的核对业务字段;
结构化查询语言语句得到单元,用于读取到结构化查询语言脚本中的脚本内容,并对读取到的脚本内容进行解析,得到至少一条结构化查询语言语句;
预期业务字段判断单元,用于针对于每条结构化查询语言语句,将结构化查询语言语句转换为结构化查询语言查询对象,确定结构化查询语言查询对象中是否存在与核对业务字段对应的预期业务字段;
预期业务字段得到单元,用于如果是,则得到预期业务字段。
另一可选的,上述代码测试装置,还可以包括:
实际数据库表获取模块,用于在得到测试代码的实际运行结果之前,获取预期运行结果、以及用于存储实际运行结果的实际数据库表;
预期数据库表生成模块,用于对实际数据库表进行重命名,生成预期数据库表;
预期数据库表加载模块,用于将预期运行结果存储到预期数据库表的预期业务字段下,并将存储有预期运行结果的预期数据库表加载到内存数据库中。
可选的,在上述任一装置的基础上,该装置的执行流程可以被封装为代码测试插件,代码测试插件被接入代码测试工具中,代码测试插件跟随代码测试工具的启动而启动。
在此基础上,一可选的,代码测试工具对应于用于从磁盘数据库中读取测试数据的磁盘数据源,上述代码测试装置,还可以包括:
数据源替代模块,用于基于内存数据源替代磁盘数据源,以基于内存数据源从内存数据库中读取测试数据。
另一可选的,代码测试插件可以基于服务提供者接口机制被接入代码测试工具中;和/或,代码测试工具包括SpringBootTest工具。
本发明实施例提供的代码测试装置,通过内存数据源注册模块响应于代码测试指令,获取测试代码,并注册内存数据源,其中,内存数据源用于在内存数据库中进行数据读取;通过测试数据读取模块基于内存数据源从内存数据库中读取测试数据;通过测试结果得到模块基于读取到的测试数据运行测试代码,得到测试代码的实际运行结果,以根据实际运行结果确定测试代码的测试结果。上述装置,通过内存数据源从内存数据库中读取测试数据进行代码测试,由此可以避免出现测试数据被污染或在调试BUG时需要重置测试数据的情况,从而降低了代码测试难度。
本发明实施例所提供的代码测试装置可执行本发明任意实施例所提供的代码测试方法,具备执行方法相应的功能模块和有益效果。
值得注意的是,上述代码测试装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
图6示出了可以用来实施本发明的实施例的电子设备10的结构示意图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备(如头盔、眼镜、手表等)和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本发明的实现。
如图6所示,电子设备10包括至少一个处理器11,以及与至少一个处理器11通信连接的存储器,如只读存储器(ROM)12、随机访问存储器(RAM)13等,其中,存储器存储有可被至少一个处理器执行的计算机程序,处理器11可以根据存储在只读存储器(ROM)12中的计算机程序或从存储单元18加载到随机访问存储器(RAM)13中的计算机程序,来执行各种适当的动作和处理。在RAM 13中,还可存储电子设备10操作所需的各种程序和数据。处理器11、ROM 12以及RAM 13通过总线14彼此相连。输入/输出(I/O)接口15也连接至总线14。
电子设备10中的多个部件连接至I/O接口15,包括:输入单元16,例如键盘、鼠标等;输出单元17,例如各种类型的显示器、扬声器等;存储单元18,如磁盘、光盘等;以及通信单元19,例如网卡、调制解调器、无线通信收发机等。通信单元19允许电子设备10通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
处理器11可以是各种具有处理和计算能力的通用和/或专用处理组件。处理器11的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的处理器、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。处理器11执行上文所描述的各个方法和处理,例如代码测试方法。
在一些实施例中,代码测试方法可被实现为计算机程序,其被有形地包含于计算机可读存储介质,例如存储单元18。在一些实施例中,计算机程序的部分或者全部可以经由ROM 12和/或通信单元19而被载入和/或安装到电子设备10上。当计算机程序加载到RAM 13并由处理器11执行时,可以执行上文描述的代码测试方法的一个或多个步骤。备选地,在其他实施例中,处理器11可通过其他任何适当的方式(例如,借助于固件)而被配置为执行代码测试方法。
本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、芯片上系统的系统(SOC)、负载可编程逻辑设备(CPLD)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、以及至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、以及该至少一个输出装置。
用于实施本发明的方法的计算机程序可以采用一个或多个编程语言的任何组合来编写。这些计算机程序可以提供给通用计算机、专用计算机或是其他可编程数据处理装置的处理器,使得计算机程序当由处理器执行时使流程图和/或框图中所规定的功能/操作被实施。计算机程序可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行并且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本发明的上下文中,计算机可读存储介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的计算机程序。计算机可读存储介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。备选地,计算机可读存储介质可以是机器可读信号介质。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
为了提供与用户的交互,可以在电子设备上实施此处描述的系统和技术,该电子设备具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给电子设备。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)、区块链网络和互联网。
计算系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,又称为云计算服务器或云主机,是云计算服务体系中的一项主机产品,以解决了传统物理主机与VPS服务中,存在的管理难度大,业务扩展性弱的缺陷。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本发明中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本发明的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。
Claims (14)
1.一种代码测试方法,其特征在于,包括:
响应于代码测试指令,获取测试代码,并且注册内存数据源,其中,所述内存数据源用于在内存数据库中进行数据读取;
基于所述内存数据源,从所述内存数据库中读取测试数据;
基于读取到的测试数据运行所述测试代码,得到所述测试代码的实际运行结果,以根据所述实际运行结果确定所述测试代码的测试结果。
2.根据权利要求1所述的方法,其特征在于,在所述响应于代码测试指令之后,还包括:
获取表结构,并基于所述表结构创建测试数据库表;
获取结构化查询语言脚本,并通过执行所述结构化查询语言脚本来获取到所述结构化查询语言脚本中的测试数据;
将获取到的测试数据填入所述测试数据库表中,并根据填入结果更新所述测试数据库表,将所述测试数据库表加载到所述内存数据库中;
所述基于所述内存数据源,从所述内存数据库中读取测试数据,包括:
基于所述内存数据源,从加载到所述内存数据库中的所述测试数据库表中读取到测试数据。
3.根据权利要求2所述的方法,其特征在于,还包括:
获取测试数据来源配置;
所述获取结构化查询语言脚本,包括:
响应于根据所述测试数据来源配置确定从结构化查询语言脚本中获取测试数据,获取所述结构化查询语言脚本。
4.根据权利要求1所述的方法,其特征在于,还包括:
基于所述内存数据源从所述内存数据库中,读取在所述基于读取到的测试数据运行所述测试代码的情况下的预期运行结果;
所述以根据所述实际运行结果确定所述测试代码的测试结果,包括:
对所述实际运行结果和所述预期运行结果进行核对,并根据核对结果得到所述测试代码的测试结果。
5.根据权利要求4所述的方法,其特征在于,所述对所述实际运行结果和所述预期运行结果进行核对,包括:
获取已生成的运行结果核对脚本;
通过执行所述运行结果核对脚本,以对所述实际运行结果和所述预期运行结果进行核对。
6.根据权利要求5所述的方法,其特征在于,所述预期运行结果被存储在预期数据库表的预期业务字段下,所述预期数据库表被加载在所述内存数据库;
所述方法还包括:
获取所述预期业务字段、以及预先配置的运行结果核对规则,并基于所述预期业务字段和所述运行结果核对规则,生成所述运行结果核对脚本;
所述基于所述内存数据源从所述内存数据库中,读取在所述基于读取到的测试数据运行所述测试代码的情况下的预期运行结果,包括:
通过执行所述运行结果核对脚本,以基于所述内存数据源,从加载在所述内存数据库中的所述预期数据库表的所述预期业务字段下读取预期运行结果;
所述通过执行所述运行结果核对脚本,以对所述实际运行结果和所述预期运行结果进行核对,包括:
通过执行所述运行结果核对脚本,以对所述实际运行结果及读取到的所述预期运行结果进行核对。
7.根据权利要求6所述的方法,其特征在于,获取预期业务字段,包括:
获取预先配置的核对业务字段;
读取结构化查询语言脚本中的脚本内容,并对读取到的所述脚本内容进行解析,得到至少一条结构化查询语言语句;
针对于每条所述结构化查询语言语句,将所述结构化查询语言语句转换为结构化查询语言查询对象,并确定所述结构化查询语言查询对象中是否存在与所述核对业务字段对应的预期业务字段;
如果是,则得到所述预期业务字段。
8.根据权利要求6所述的方法,其特征在于,在所述得到所述测试代码的实际运行结果之前,还包括:
获取所述预期运行结果、以及用于存储所述实际运行结果的实际数据库表;
对所述实际数据库表进行重命名,生成所述预期数据库表;
将所述预期运行结果存储到所述预期数据库表的预期业务字段下,并将存储有所述预期运行结果的所述预期数据库表加载到所述内存数据库中。
9.根据权利要求1-8中任一所述的方法,其特征在于,所述方法被封装为代码测试插件,所述代码测试插件被接入代码测试工具中,所述代码测试插件跟随所述代码测试工具的启动而启动。
10.根据权利要求9中所述的方法,其特征在于,所述代码测试工具对应于用于从磁盘数据库中读取测试数据的磁盘数据源,所述方法还包括:
基于所述内存数据源替代所述磁盘数据源,以基于所述内存数据源从所述内存数据库中读取测试数据。
11.根据权利要求9所述的方法,其特征在于,所述代码测试插件是基于服务提供者接口机制被接入所述代码测试工具中;和/或,
所述代码测试工具包括SpringBootTest工具。
12.一种代码测试装置,其特征在于,包括:
内存数据源注册模块,用于响应于代码测试指令,获取测试代码,并且注册内存数据源,其中,所述内存数据源用于在内存数据库中进行数据读取;
测试数据读取模块,用于基于所述内存数据源,从所述内存数据库中读取测试数据;
测试结果得到模块,用于基于读取到的测试数据运行所述测试代码,得到所述测试代码的实际运行结果,以根据所述实际运行结果确定所述测试代码的测试结果。
13.一种电子设备,其特征在于,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器执行如权利要求1-11中任一项所述的代码测试方法。
14.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使处理器执行时实现如权利要求1-11中任一所述的代码测试方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210939210.1A CN115309642A (zh) | 2022-08-05 | 2022-08-05 | 一种代码测试方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210939210.1A CN115309642A (zh) | 2022-08-05 | 2022-08-05 | 一种代码测试方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115309642A true CN115309642A (zh) | 2022-11-08 |
Family
ID=83861417
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210939210.1A Pending CN115309642A (zh) | 2022-08-05 | 2022-08-05 | 一种代码测试方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115309642A (zh) |
-
2022
- 2022-08-05 CN CN202210939210.1A patent/CN115309642A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109976761B (zh) | 软件开发工具包的生成方法、装置及终端设备 | |
US11550599B2 (en) | Method and apparatus for running applet | |
CN111090536B (zh) | 一种获取内存泄露信息的方法、装置、介质和电子设备 | |
US8954930B2 (en) | System and method for reducing test effort by object risk analysis | |
CN107451474B (zh) | 用于终端的软件漏洞修复方法和装置 | |
US11074154B2 (en) | Identifying a source file for use in debugging compiled code | |
CN109977670B (zh) | 基于插件加载的安卓应用安全监测方法、存储介质 | |
US20210073107A1 (en) | Testing source code changes | |
CN111158741B (zh) | 监控业务模块对第三方类库依赖关系变化的方法及装置 | |
CN110955409B (zh) | 在云平台上创建资源的方法和装置 | |
CN111078481B (zh) | 获取配置检查清单的方法、装置、电子设备及存储介质 | |
CN112799940A (zh) | 回归测试方法、装置、计算机系统和计算机可读存储介质 | |
CN110659210A (zh) | 一种信息获取方法、装置、电子设备及存储介质 | |
CN116089258A (zh) | 数据迁移测试方法、装置、设备、存储介质及程序产品 | |
CN115168130A (zh) | 一种芯片测试方法、装置、电子设备及存储介质 | |
US20210026756A1 (en) | Deriving software application dependency trees for white-box testing | |
CN112988578A (zh) | 一种自动化测试方法和装置 | |
CN109471799A (zh) | 一种需求环境的部署方法、装置、存储介质及终端 | |
CN115309642A (zh) | 一种代码测试方法、装置、电子设备及存储介质 | |
CN115269431A (zh) | 一种接口测试方法、装置、电子设备及存储介质 | |
CN113220586A (zh) | 一种自动化的接口压力测试执行方法、装置和系统 | |
JP5757167B2 (ja) | 判定作業支援システム、判定作業支援方法、及びプログラム | |
CN112346994A (zh) | 一种测试信息关联方法、装置、计算机设备及存储介质 | |
CN111694729A (zh) | 应用测试方法、装置、电子设备和计算机可读介质 | |
CN117251187A (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 |