CN111797006B - 一种线程测试的方法、装置、设备以及存储介质 - Google Patents
一种线程测试的方法、装置、设备以及存储介质 Download PDFInfo
- Publication number
- CN111797006B CN111797006B CN202010532001.6A CN202010532001A CN111797006B CN 111797006 B CN111797006 B CN 111797006B CN 202010532001 A CN202010532001 A CN 202010532001A CN 111797006 B CN111797006 B CN 111797006B
- Authority
- CN
- China
- Prior art keywords
- test
- thread
- tested
- script data
- 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.)
- Active
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/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)
Abstract
本申请提供了一种线程测试的方法、装置、设备以及存储介质,涉及软件测试技术领域。提供了利用脚本文件,高效、简便地对被测软件进行单线程测试,或多线程进行测试的方法。根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据;解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;根据所述测试消息编码,获取测试消息;根据所述第一被测线程编码,将所述测试消息发送给第一被测线程;接收所述第一被测线程对所述测试消息的运行结果;在所述运行结果验证正确时,确定所述第一被测线程通过测试。在所述运行结果验证错误时,返回所述被测线程的运行结果与预期值的差异值,便于定位查找问题。
Description
技术领域
本申请涉及软件测试技术领域,特别是涉及一种线程测试的方法、装置、设备以及存储介质。
背景技术
开发人员在软件产品编写完成后,会对编写完成的软件进行测试,以鉴定该软件的正确性、完整性、安全性和质量。软件测试一般包括集成测试和单元测试。单元测试是以软件中执行不同功能的线程为依据,将整个待测软件分为多个运行在不同线程,并且执行不同功能的单元,随后对单元进行测试。单元测试的优点在于所需分析数据较少,且针对性较强。
现有技术下,一般通过“打桩”的方式进行单元测试。软件运行时,软件中的各个单元相互配合,完成软件的整体功能;当前单元只能执行该单元自身的程序,为了配合其他单元的功能,当前单元会调用其上级单元或下级单元的程序。通过“打桩”进行单元测试指的是,结合“桩函数”模拟上述软件内部单元运行的过程,“打桩”的具体过程是:在被测单元进行单元测试之前,由开发人员手工编写“桩函数”,以代替被测单元开始运行时调用的其上级单元的程序,以及被测单元运行结束后调用的其下级单元的程序。
然而软件测试中,通常会使用多个测试用例对被测单元进行多次测试,以尽可能地发现被测单元具有的漏洞,因此通过“打桩”进行单元测试,必须由开发人员编写足够多的“桩函数”,以满足利用不同的测试用例测试不同的单元的需求,极大地耗费开发人员的人力和物力,导致软件测试的效率较低。
发明内容
本申请实施例公开了一种线程测试的方法、装置、设备以及存储介质,提供利用脚本文件,高效、简便地对软件的单线程或多线程进行测试的方法,并且通过修改脚本文件可以修改测试线程的测试用例,进而使得本申请对单线程或多线程的测试更加灵活。本申请实施例第一方面提供一种线程测试的方法,所述方法包括:
根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据;
解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
根据所述测试消息编码,获取测试消息;
根据所述第一被测线程编码,将所述测试消息发送给第一被测线程;
接收所述第一被测线程对所述测试消息的运行结果;
在所述运行结果验证正确时,确定所述第一被测线程通过测试。
可选地,所述方法应用于测试模块,所述方法还包括:
编译本地的通用代码和被测代码得到测试可执行文件;
解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码,包括:
利用所述测试可执行文件,解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
根据所述测试消息编码,获取测试消息,包括:
根据所述测试消息编码,得到源线程的执行内容;所述源线程为所述第一被测线程的逻辑输入线程;
利用所述测试可执行文件,运行所述执行内容,生成所述测试消息。
可选地,所述方法还包括:
利用所述测试可执行文件读取所述目标测试脚本数据,获取全局变量;
将所述全局变量赋值给所述测试消息;
根据所述第一被测线程编码,将所述测试消息发送给第一被测线程,包括:
将赋值后的所述测试消息发送给所述第一被测线程;
利用所述测试可执行文件,运行所述执行内容,生成所述测试消息,包括:
利用所述测试可执行文件运行赋值后的所述执行内容,得到所述测试消息。
可选地,在确定所述第一被测线程通过测试前,所述方法还包括:
利用所述测试可执行文件,从所述目标测试脚本数据中提取验证测试消息编码第二被测线程编码;
根据所述验证测试消息编码,获取验证测试消息;
将所述全局变量赋值给所述验证测试消息;
利用所述测试可执行文件,运行赋值后的所述验证测试消息,得到验证结果;
接收所述第一被测线程对所述测试消息的运行结果,包括:
根据所述第二被测线程编码,接收第二被测线程对所述测试消息的运行结果;
确定所述第一被测线程通过测试,包括:
利用所述测试可执行文件,比较所述运行结果和所述验证结果;
在所述运行结果和所述验证结果一致时,确定所述第二被测线程通过所述目标测试脚本数据的测试;
在所述运行结果和所述验证结果不一致时,返回所述第二被测线程的运行结果与预期值的差异值。
可选地,根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据,包括:
根据所述测试指令中的线程标识,启动待测软件中的至少一个线程;所述第一被测线程为所述至少一个线程中的任意线程;
根据所述测试指令中的测试用例标识和所述线程标识,在预先存储的多个测试脚本数据中获取至少一个测试脚本数据;
在读取到所述至少一个测试脚本数据中的任意测试脚本数据的第一关键词时,将所述第一关键词对应的测试脚本数据确定为所述目标测试脚本数据;或,
在读取到所述至少一个测试脚本数据中的任意测试脚本数据的第二关键词时,将所述第二关键词对应的测试脚本数据确定为所述目标测试脚本数据。
可选地,所述方法还包括:
接收输入的测试脚本数据,将所述输入的测试脚本数据存储于所述测试模块的测试用例头文件中;所述测试脚本数据是用于测试待测软件中单个线程的测试用例;
根据编辑指令,修改存储于所述测试用例头文件的所述测试脚本数据;
根据调取指令,显示测试记录;所述测试记录包括所述测试模块根据所述测试脚本数据生成的所述可执行测试文件和测试日志。
本申请实施例第二方面提供一种线程测试的装置,所述装置包括:
第一接收模块,用于根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据;
解析模块,用于解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
获取测试消息模块,用于根据所述测试消息编码,获取测试消息;
发送模块,用于根据所述第一被测线程编码,将所述测试消息发送给第一被测线程;
第二接收模块,用于接收所述第一被测线程对所述测试消息的运行结果;
验证模块,用于在所述运行结果验证正确时,确定所述第一被测线程通过测试。
本申请实施例第三方面提供一种可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时,实现如本申请第一方面所述的方法中的步骤。
本申请实施例第四方面提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现本申请第一方面所述的方法的步骤。
本申请实施例通过测试脚本数据,以参数的形式表示具体的测试用例,再将测试脚本数据存储在测试模块的测试用例头文件中,以在接收到测试指令时,可以直接在测试模块本地调取测试指令指定的测试脚本数据,进而实现以测试脚本数据对测试指令指定的被测线程进行测试的目的。利用测试脚本数据进行线程测试,测试人员不用根据测试用例编写输入程序,只需要输入测试指令即可,简便快捷。
本申请实施例利用编译通用代码和被测代码生成的测试可执行文件,读取测试脚本数据中的参数,提取得到测试消息编码、被测线程编码、全局变量、验证测试消息编码等内容,再进一步利用测试可执行文件,得到测试消息和验证测试消息,将测试消息发送给被测线程,以使被测线程将测试消息作为输入,并基于测试消息运行其本地功能函数,再接收被测线程返回的运行结果,由于被测代码是可以运行测试消息的代码,测试模块再将验证测试消息作为输入,利用测试可执行文件基于验证测试消息生成验证结果,作为被测线程运行测试脚本数据表示的测试用例的预期结果,在运行结果和验证结果一致时,通过利用测试脚本数据对被测线程的测试。利用测试脚本数据进行测试的整个过程,只需要测试模块读取测试脚本数据,不再需要编写开发人员人工编写“桩函数”,简便快捷。并且测试模块根据测试指令启动多个线程后,可以根据第一关键词和第二关键词,选择当前读取的测试脚本数据,再根据当前读取的测试脚本数据的参数生成验证结果,以完成对多个线程同时测试的目的。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是软件测试的基本流程图;
图2是本申请实施例提出的线程测试的方法的步骤流程图;
图3是本申请实施例提出的验证运行结果的步骤流程图;
图4是本申请实施例测试模块基于测试脚本数据进行线程测试的流程图;
图5是本申请实施例提出的线程测试的装置的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
开发人员在软件产品编写完成后,会对编写完成的软件进行测试。图1是软件测试的基本流程图。如图1所示,软件测试包括根据软件中的漏洞挖掘测试需求,基于测试需求提出测试计划,根据测试计划设计测试用例,以测试用例对软件进行测试实施和测试执行,并得出对软件测试的测试报告,最终结合测试执行、测试设计、测试执行对软件做测试评估,通过测试评估鉴定被测软件的正确性、完整性、安全性和质量。
本申请实施例具体应用的阶段是:利用测试用例对软件进行测试。软件测试一般包括集成测试和单元测试。单元测试是以软件中执行不同功能的线程为依据,将整个被测软件分为多个运行在不同线程,并且执行不同功能的单元,随后对单元进行测试。单元测试的优点在于所需分析数据较少,且针对性较强。
现有技术下,一般通过“打桩”的方式进行单元测试。“打桩”涉及手工编写测试集、指定输入数据以及为缺少的函数提供“桩函数”,以及给“桩函数”提供返回值。“桩函数”是单元测试中,该项目缺少的函数,例如:SDK、MFC等提供给用户使用的API函数,或者低层的接口函数。
被测单元作为驱动单元,与之直接相连的单元用“桩模块”代替。在集成测试前要为被测单元编制一些模拟其下级单元功能的“替身”单元,以代替被测单元的接口,接受或传递被测单元的数据,这些专供测试用的“假”单元为被测单元的“桩模块”。如果被测试的单元需要调用其他单元中的功能或者函数(method),由开发人员设计并编写与被调用单元名称相同的“桩模块(Stub)”来模拟被调用单元。
开发人员设计并编写的过程十分复杂,并且即使在测试过程中发现“桩模块(Stub)”或“桩函数”不适用,却难以修改编写完成的“桩模块(Stub)”或“桩函数”,导致测试不够灵活,进一步地导致测试效率较低。
本申请将运行待测软件不同功能的线程作为测试单元,进行单元测试。应用于测试模块。测试模块中包含了可以运行测试消息的被测代码和通用代码,通用代码包括:读取测试脚本数据的相关代码、生成测试消息和验证测试消息的相关代码、验证被测线程发送的运行结果的相关代码。
编译本地的通用代码和被测代码得到测试可执行文件;
确定被测软件后,测试模块会编译通用代码和被测代码,得到测试可执行文件,并使测试可执行文件运行在被测软件的单线程中,运行可执行文件的单线程是被测软件中不执行其他功能的空闲线程,进而使测试可执行文件可以与被测软件的其他被测线程通过收发消息的方式,来进行黑盒测试,达到对被测软件进行单线程和多线程测试的目的。
接收输入的测试脚本数据,将所述输入的测试脚本数据存储于所述测试模块的测试用例头文件中;所述测试脚本数据是用于测试待测软件中单个线程的测试用例;
根据编辑指令,修改存储于所述测试用例头文件的所述测试脚本数据;
根据调取指令,显示测试记录;所述测试记录包括所述测试模块根据所述测试脚本数据生成的所述可执行测试文件和测试日志。
测试模块包括公共文件夹、子系统文件夹、目标文件夹、编译文件夹、脚本文件夹和日志文件夹。
公共文件夹同于存放测试可执行文件和主函数。测试可执行文件用于执行读取测试脚本数据以及发送测试消息给被侧线程等主要的测试步骤,主函数用于执行启动被测线程的步骤,以开始单线程的单元测试和多线程的系统测试。
子系统文件夹用于存放测试用例头文件,测试用例头文件中存放了测试脚本数据。测试脚本数据是测试人员输入的,用于测试软件的测试用例的参数文件。测试脚本数据记载的是参数数据,可以直接修改,便于测试人员在测试过程对测试脚本数据进行修改,提高了测试的灵活性。
假设待测软件有N个线程,那么测试模块的子系统文件夹对应存储有N个测试用例头文件,每个测试用例头文件对应存放其对应线程的测试脚本数据。测试用例头文件标明了软件名和线程名,以使测试脚本数据可以对应存放至测试用例头文件。假设待测软件是计算器,计算器的线程包括减法计算、加法计算、乘法计算、除法计算,测试用例头文件的命名是“计算器,乘法计算”,在接收到测试人员输入的用于测试乘法计算的测试脚本数据时,测试模块可以对应将该测试脚本数据存储到测试用例头文件“计算器,乘法计算”的路径下,以便于启动乘法计算线程的测试时,测试模块直接从测试用例头文件“计算器,乘法计算”提取到测试乘法计算线程的测试脚本数据,也便于测试模块根据接收到编辑指令,对对应的测试脚本数据进行修改。
脚本文件夹用于存储执行文件和运行文件,执行文件和运行文件用于编译通用代码和被测代码,得到测试可执行文件,执行文件可以是shell执行文件,运行文件可以是run_test.sh文件。
编译文件夹用于存储编译文件。目标文件夹用于存储编译文件编译通用代码和被测代码得到的测试可执行文件。
日志文件夹用于存储运行文件,运行文件在测试模块利用各个测试脚本数据进行测试的过程中,生成测试日志。测试日志可以是log信息,运行文件可以是run_test.sh文件
测试模块根据调取指令,可以在目标文件夹查找并确定测试可执行文件,可以在日志文件夹查找并确定测试日志。
本申请实施例还会统一待测软件中的所有线程在测试模块的入口函数,以保证测试模块发送给每个线程的测试消息的格式相同,并且对待测软件中的每个线程设置单独的消息队列,以使线程可以存储单位时间其他线程或者测试模块发送的消息。线程的执行函数以lib库(静态库)的形式运行,以保证能够编译得到可执行测试文件和可执行验证结果。
图2是本申请实施例提出的线程测试的方法的步骤流程图。如图2所示,线程测试的方法包括以下步骤:
S21:根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据;
测试模块接收到测试指令可以是测试人员输入的参数,包括被测线程标识和测试用例标识。被测线程标识可以是单个线程的标识也可以是多个线程的标识,测试用例标识可以指代单个线程的标识也可以是指代多个线程的标识。
具体地,测试模块会根据所述测试指令中的线程标识,启动待测软件中的至少一个线程;启动的线程都可以接收测试模块中测试可执行文件发送的测试消息。也会根据所述测试指令中的测试用例标识和所述线程标识,在预先存储的多个测试脚本数据中获取至少一个测试脚本数据;
测试模块根据接收的测试指令中的线程标识,选择启动一个线程或者多个线程,来进行单线程或者多线程的测试。线程标识代表的是当前的待测线程,即测试模块启动的一个线程或者多个线程是当前测试任务待测试的线程。
测试模块依据线程标识可以在子系统文件夹的测试用例头文件确定具体的测试用例头文件,再依据测试用例标识,在具体的测试用例头文件存储的多个测试脚本数据中选取具体的测试脚本数据。假设待测软件是计算器,线程标识是乘法计算和加法计算,测试用例标识是乘法用例1、乘法用例2和加法用例3,测试模块依据线程标识是乘法计算和加法计算确定两个测试用例头文件“计算器,乘法计算”和“计算器,加法计算”,再从测试用例头文件“计算器,乘法计算”和“计算器,加法计算”中选取得到乘法用例1、乘法用例2和加法用例3。
因此通过本申请实施例的方法进行测试软件,只需要输入测线程标识和测试用例标识,就可以进行相应线程的线程测试,输入简单,不用再通过开发人员根据测试用例编写用于输入被测单元(被测线程)的“桩函数”。
在读取到所述至少一个测试脚本数据中的任意测试脚本数据的第一关键词时,将所述第一关键词对应的测试脚本数据确定为所述目标测试脚本数据;
目标测试脚本数据是测试可执行文件当前正在读取并解析的测试脚本数据。若根据测试指令中的线程标识只启动了一个线程,在预先存储的多个测试脚本数据中也只获取了一个测试脚本数据,那目标测试脚本数据就是该获取的测试脚本数据,若根据测试指令中的线程标识启动了三个线程,在预先存储的多个测试脚本数据中也获取了三个测试脚本数据,测试可执行文件在读取到三个测试脚本数据中的测试脚本数据A的第一关键字或第二关键字时,测试脚本数据A则是目标测试脚本数据。
第一关键词是测试模块解析测试脚本数据后续参数,并且准备发送测试消息给被测模块的标识。一般地以“sand msg(发送消息)”作为第一关键词。在测试可执行文件读取到“sand msg(发送消息)”时,开始解析“sand msg(发送消息)”所在的测试脚本数据的参数,包括从该测试脚本数据获取测线程编码和测试消息编码等。
若测试模块进行的是单线程的测试,测试可执行文件只需要读取一个测试脚本数据,依次读取第一关键词以及第一关键词后续的参数即可。若测试模块进行的是多线程的测试,测试模块可以顺序读取获取的多个测试脚本数据,也可以以任意的次序读取获取的多个测试脚本数据,在读取到某个测试脚本数据的第一关键词时,准备开始对第一关键词所在的测试脚本数据中指定的线程发送测试消息。
首先对单线程测试进行详细说明。单线程测试只需逐条读取一个测试脚本数据中的参数,根据参数解析出来的信息,发送消息至被测线程,或接收被测线程返回的消息,再将被测线程返回的运行结果与本地生成的验证结果进行比较,即可以完成被测线程的测试。
步骤S22:解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码,包括:
利用所述测试可执行文件,解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
第一被测线程编码是第一关键词后的线程编码。在根据测试指令中的线程标识,启动待测软件中的一个线程时,第一被测线程编码与第二被测线程编码相同,第一被测线程也与第二被测线程相同。
具体解析测试脚本数据,可以由测试可执行文件进行,由于通用代码包括读取测试脚本数据的相关代码,所以编译通用代码生成的测试可执行文件进行,可以读取并解析测试脚本数据。
步骤S23:根据所述测试消息编码,获取测试消息;
通过测试消息编码,可以在测试用例头文件对应查找得到测试消息编码对应的执行内容。在读取到第一关键词后,测试可执行文件获得的执行内容的对应编码是测试消息编码。测试消息编码对应的执行内容是被测线程的逻辑输入线程的执行内容。
具体可以通过以下方式获得测试消息。
根据所述测试消息编码,获取测试消息,包括:
根据所述测试消息编码,得到源线程的执行内容;所述源线程为所述第一被测线程的逻辑输入线程;
利用所述测试可执行文件,运行所述执行内容,生成所述测试消息。
源线程是被测线程的上级线程。完整的测试用例是测试计算器是否能够正确执行(a×b)+c的计算,而测试的线程是加法计算线程,那么加法计算线程的逻辑输入线程就是执行(a×b)的乘法计算线程。(a×b)是源线程的执行内容。
由于通用代码包括生成测试消息和验证测试消息的相关代码,所以利用编译通用代码得到的测试可执行文件,可以得到测试消息。
假设待测软件计算器有4个独立的线程,分别执行加法计算1、减法计算2、乘法计算3和除法计算4,若测试脚本数据中的被测线程编码是参数4,可以确定被测线程是除法运算。执行内容是具体的测试条件,可以存储在测试用例头文件,例如测试用例头文件存储的执行内容是(a+b)11、(a-b)12、(a×b)13和(a÷b)14,目标测试脚本数据中的测试消息编码的是参数14,可以确定源线程的执行内容是(a÷b)。
测试可执行文件运行源线程的执行内容,得到测试消息。测试消息和执行内容的内容相同,执行内容是以参数的形式存储,测试可执行文件运行源线程的执行内容生成的测试消息可以直接作为其他线程(独立的程序)的输入,是完整的程序。因此在目标测试脚本数据中的测试消息编码是14时,测试消息是(a÷b)的程序。
步骤S24:根据所述第一被测线程编码,将所述测试消息发送给第一被测线程;
第一被测线程是测试可执行文件发送测试消息的被测线程。根据测试指令中的线程标识,只启动待测软件中一个线程时,第一被测线程和第二被测线程相同。
本申请实施例通过测试可执行文件,读取目标测试脚本数据,获取目标测试脚本数据中的第一关键词和其他参数,解析获取的第一关键词和第一被测线程编码,准确开始发送测试消息至被测线程,以使被测线程以测试消息作为输入,对可测试消息执行被测线程本地的函数计算等任务。
步骤S25:收所述第一被测线程对所述测试消息的运行结果;
步骤S26:在所述运行结果验证正确时,确定所述第一被测线程通过测试。
测试模块通过发送测试消息给被测线程,以及接收被测线程发送的运行结果,进行黑盒测试。在被测线程发送的运行结果,与测试可执行文件根据测试脚本数据中的参数得到的验证结果时,证明被测线程可以准确地执行其本地的功能函数。
本申请实施例以直接验证被测线程发送的运算结果的方式,检验被测线程运行测试消息的准确性,不用开发人员编写“桩函数”,模拟被调用的被测单元(被测线程)的下级线程或单元,进而使整个线程的测试过程简单快捷,并且测试模块的测试用例的输入和输出都是测试脚本数据的形式,易于修改。
具体在验证时,可以将被测线程的运行结果和测试脚本数据中的测试用例期望的结果进行比较。测试用例期望的结果可以直接是测试脚本数据中的参数,也可以是测试模块的测试可执行文件根据测试脚本数据的生成验证结果。
在本申请的另一个实施例中,测试脚本数据还包括全局变量。
利用所述测试可执行文件读取所述目标测试脚本数据,获取全局变量;
全局变量和表示测试条件的执行内容是测试用例的主要内容,是将软件测试需求具体量化后得到。假设完成一个完整的计算器的加法线程的线程测试需要3个变量:a+b=c,那么全局变量是a、b、c具体的值。
将所述全局变量赋值给所述测试消息;
将全局变量赋值给测试消息指的是:将全局变量中与测试消息相关的变量的具体取值赋值给测试消息相关的变量的过程。
以上述示例说明将全局变量赋值给测试消息的含义,假设测试消息是(a÷b),全局变量是1、2、4,读取测试脚本数据,得到a的值是1,b的值是2,进而令a=1,b=2。
根据所述第一被测线程编码,将所述测试消息发送给第一被测线程,包括:
将赋值后的所述测试消息发送给所述第一被测线程;
利用所述测试可执行文件,运行所述执行内容,生成所述测试消息,包括:
利用所述测试可执行文件运行赋值后的所述执行内容,得到所述测试消息。
测试可执行文件运行赋值后的执行内容得到的测试消息,是完整地带有具体取值的被测线程的输入程序。
在读取到所述至少一个测试脚本数据中的任意测试脚本数据的第二关键词时,将所述第二关键词对应的测试脚本数据确定为所述目标测试脚本数据。
第二关键词是测试模块解析测试脚本数据在第二关键词后的后续参数,并且准备验证被测检测发送的消息(运行结果)的标识。例如第二关键词:“expect msg(验证消息)”。
如图3所示,图3是本申请实施例提出的验证运行结果的步骤流程图。
步骤S31:利用所述测试可执行文件,从所述目标测试脚本数据中提取验证测试消息编码第二被测线程编码;
第二被测线程是测试可执行文件接收运行结果的被测线程。根据测试指令中的线程标识,只启动待测软件中一个线程时,第一被测线程和第二被测线程相同。
验证测试消息与测试消息相似,也是测试可执行文件根据执行内容生成的。不同的是验证测试消息是测试可执行文件根据被测线程的执行内容生成的。
被测线程的执行内容同样存储于测试用例头文件,例如测试用例头文件存储的验证测试消息是(a+b)11、(a-b)12、(a×b)13和(a÷b)14,测试脚本数据中代表验证测试消息编码的是参数13,可以确定被测线程的执行内容是(a×b)。
步骤S32:根据所述验证测试消息编码,获取验证测试消息;
步骤S33:将所述全局变量赋值给所述验证测试消息;
测试模块将全局变量赋值给验证测试消息的步骤,与测试模块将全局变量赋值给测试消息的步骤相同,在此不多做赘述。
步骤S34:利用所述测试可执行文件,运行赋值后的所述验证测试消息,得到验证结果;
验证结果是被测线程的逻辑输出程序。测试模块可以使用测试可执行文件运行被测线程的执行内容,进行与被测线程相同中的功能函数相同的函数处理,直接生成模拟对测试脚本数据中的参数进行处理后的预期结果,再利用预期结果验证被测线程发送的运行结果,在运行结果与预期结果相同时,证明被测线程可以准确地执行其自身的功能函数。
步骤S35:根据所述第二被测线程编码,接收第二被测线程对所述测试消息的运行结果;
步骤S36:利用所述测试可执行文件,比较所述运行结果和所述验证结果;
步骤S37:在所述运行结果和所述验证结果一致时,确定所述第二被测线程通过所述目标测试脚本数据的测试;
步骤S38:在所述运行结果和所述验证结果不一致时,返回所述第二被测线程的运行结果与所述验证结果的差异值。
本申请实施例通过测试脚本数据,以参数的形式表示具体的测试用例,再将测试脚本数据存储在测试模块的测试用例头文件中,以在接收到测试指令时,可以直接在测试模块本地调取测试指令指定的测试脚本数据,进而实现以测试脚本数据对测试指令指定的被测线程进行测试的目的。利用测试脚本数据进行线程测试,测试人员不用根据测试用例编写输入程序,只需要输入测试指令即可,简便快捷。
本申请实施例利用编译通用代码和被测代码生成的测试可执行文件,读取测试脚本数据中的参数,提取得到测试消息编码、被测线程编码、全局变量、验证测试消息编码等内容,再进一步利用测试可执行文件,得到测试消息和验证测试消息,将测试消息发送给被测线程,以使被测线程将测试消息作为输入,并基于测试消息运行其本地功能函数,再接收被测线程返回的运行结果,由于被测代码是可以运行测试消息的代码,测试模块再将验证测试消息作为输入,利用测试可执行文件基于验证测试消息生成验证结果,作为被测线程运行测试脚本数据表示的测试用例的预期结果,在运行结果和验证结果一致时,通过利用测试脚本数据对被测线程的测试。利用测试脚本数据进行测试的整个过程,只需要测试模块读取测试脚本数据,不再需要编写开发人员人工编写“桩函数”,简便快捷。
测试模块根据测试指令启动多个线程后,可以根据第一关键词和第二关键词,选择当前读取的测试脚本数据,再根据当前读取的测试脚本数据的参数生成验证结果,以完成对多个线程同时测试的目的。
例如,测试模块的测试可执行文件在测试用例头文件中选择了测试脚本数据1,测试脚本数据2和测试脚本数据3,完成测试指令指定的测试。测试可执行文件读取到测试脚本数据1的第一关键词(发送消息时),开始准备解析测试脚本数据1中的测试消息编码、被测线程编码等内容,并将全局变量赋值给基于测试脚本数据1得到的测试消息,将赋值后的测试消息发送给测试脚本数据1对应的目标被测线程,以对测试脚本数据1对应的第一被测线程进行测试。
测试模块从测试用例头文件中选择了测试脚本数据1,测试脚本数据2和测试脚本数据3,完成测试指令指定的测试。测试模块读取到测试脚本数据2的第二关键词(验证消息时),开始准备接收测试脚本数据2中的被测线程编码标识的被测线程发送的运行结果。并读取测试脚本数据2中的验证测试消息编码,基于测试脚本数据2的验证测试消息得到验证结果。
本申请实施例通过在测试脚本数据中添加第一关键词和第二关键词的方式,根据第一关键词所在的测试脚本数据,在启动的多个线程中确定当前发送消息(可执行测试文件)的第一被测线程,进而有序地将可执行测试文件发送给启动的多个线程,根据第二关键词所在的测试脚本数据,在已经得到运行结果的被测线程中,选择当前验证的运行结果的发送线程,接收发送线程的运行结果进行验证,进而有序地验证多个线程的运行结果。
具体地,测试模块在接收多个线程发送的运行结果时,可以选择自身队列来接收不同线程的消息。假设被测线程1、被测线程2和被测线程3都基于之前发送的可执行测试文件得到了运行结果,当前时刻测试模块读取的第二关键词属于测试脚本数据2,测试模块解析测试脚本数据2的内容,得到第二被测线程,接收第二被测线程发送的运行结果进行验证。
如图4所示,图4是本申请实施例测试模块基于测试脚本数据进行线程测试的流程图。
测试脚本数据包括的参数有:发送消息;源线程编码;测试消息编码;被测线程编码;全局变量;验证测试消息编码;源线程编码;被测线程编码。
测试在某个测试脚本数据读取到等待的关键词时,会等待预设时间,再进一步读取该测试脚本数据的其他参数内容。图4中的测试模块和被测线程运行在待测软件的不同线程。在被测线程是多个时,被测线程可以根据第一关键词和第二关键词选取自身队列处理当前处理的线程。预设时间根据测试脚本数据对应的测试用例确定。
基于同一发明构思,本申请实施例提供一种线程测试的装置。参考图5,图5是本申请实施例提出的线程测试的装置的结构示意图。如图5所示,该装置包括:
第一接收模块51,用于根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据;解析模块52,用于解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;获取测试消息模块53,用于根据所述测试消息编码,获取测试消息;发送模块54,用于根据所述第一被测线程编码,将所述测试消息发送给第一被测线程;第二接收模块55,用于接收所述第一被测线程对所述测试消息的运行结果;验证模块56,用于在所述运行结果验证正确时,确定所述第一被测线程通过测试。
可选地,所述装置还包括:编译模块,用于编译本地的通用代码和被测代码得到测试可执行文件;所述解析模块包括:解析子模块,用于利用所述测试可执行文件,解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;所述获取测试消息模块包括:执行内容获得子模块,用于根据所述测试消息编码,得到源线程的执行内容;所述源线程为所述第一被测线程的逻辑输入线程;运行子模块,用于利用所述测试可执行文件,运行所述执行内容,生成所述测试消息。
可选地,所述装置还包括:全局变量获取模块,用于利用所述测试可执行文件读取所述目标测试脚本数据,获取全局变量;第一赋值模块,用于将所述全局变量赋值给所述测试消息;所述发送模块包括:发送子模块,用于将赋值后的所述测试消息发送给所述第一被测线程;所述运行子模块包括:运行子单元,用于利用所述测试可执行文件运行赋值后的所述执行内容,得到所述测试消息。
可选地,所述装置还包括:提取模块,用于利用所述测试可执行文件,从所述目标测试脚本数据中提取验证测试消息编码和第二被测线程编码;获取验证测试消息模块,用于根据所述验证测试消息编码,获取验证测试消息;第二赋值模块,用于将所述全局变量赋值给所述验证测试消息;运行模块,用于利用所述测试可执行文件,运行赋值后的所述验证测试消息,得到验证结果;所述第二接收模块包括:接收子模块,用于根据所述第二被测线程编码,接收第二被测线程对所述测试消息的运行结果;所述验证模块包括:比较子模块,用于利用所述测试可执行文件,比较所述运行结果和所述验证结果;验证通过子模块,在所述运行结果和所述验证结果一致时,确定所述第二被测线程通过所述目标测试脚本数据的测试;返回验证值子模块,用于在所述运行结果和所述验证结果不一致时,返回所述第二被测线程的运行结果与所述验证结果的差异值。
可选地,所述第一接收模块包括:启动子模块,用于根据所述测试指令中的线程标识,启动待测软件中的至少一个线程;所述第一被测线程为所述至少一个线程中的任意线程;获取子模块,用于根据所述测试指令中的测试用例标识和所述线程标识,在预先存储的多个测试脚本数据中获取至少一个测试脚本数据;第一确定子模块,用于在读取到所述至少一个测试脚本数据中的任意测试脚本数据的第一关键词时,将所述第一关键词对应的测试脚本数据确定为所述目标测试脚本数据;第二确定子模块,用于在读取到所述至少一个测试脚本数据中的任意测试脚本数据的第二关键词时,将所述第二关键词对应的测试脚本数据确定为所述目标测试脚本数据。
所述装置还包括:存储模块,用于接收输入的测试脚本数据,将所述输入的测试脚本数据存储于所述测试模块的测试用例头文件中;所述测试脚本数据是用于测试待测软件中单个线程的测试用例;编辑模块,用于根据编辑指令,修改存储于所述测试用例头文件的所述测试脚本数据;查看模块,用于根据调取指令,显示测试记录;所述测试记录包括所述测试模块根据所述测试脚本数据生成的所述可执行测试文件和测试日志。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
基于同一发明构思,本申请另一实施例提供一种可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本申请上述任一实施例所述的线程测试的方法中的步骤。
基于同一发明构思,本申请另一实施例提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行时实现本申请上述任一实施例所述的线程测试的方法中的步骤。
本说明书中的各个实施例均采用递进或说明的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本申请实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请实施例是参照根据本申请实施例的方法、装置、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本申请所提供的一种线程测试的方法、装置、设备以及存储介质,进行了详细介绍,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (8)
1.一种线程测试的方法,其特征在于,所述方法包括:
根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据;
解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
根据所述测试消息编码,获取测试消息;
根据所述第一被测线程编码,将所述测试消息发送给第一被测线程;
接收所述第一被测线程对所述测试消息的运行结果;
在所述运行结果验证正确时,确定所述第一被测线程通过测试;所述方法应用于测试模块,所述方法还包括:
编译本地的通用代码和被测代码得到测试可执行文件;
解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码,包括:
利用所述测试可执行文件,解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
根据所述测试消息编码,获取测试消息,包括:
根据所述测试消息编码,得到源线程的执行内容;所述源线程为所述第一被测线程的逻辑输入线程;
利用所述测试可执行文件,运行所述执行内容,生成所述测试消息。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
利用所述测试可执行文件读取所述目标测试脚本数据,获取全局变量;
将所述全局变量赋值给所述测试消息;
根据所述第一被测线程编码,将所述测试消息发送给第一被测线程,包括:
将赋值后的所述测试消息发送给所述第一被测线程;
利用所述测试可执行文件,运行所述执行内容,生成所述测试消息,包括:
利用所述测试可执行文件运行赋值后的所述执行内容,得到所述测试消息。
3.根据权利要求2所述的方法,其特征在于,在确定所述第一被测线程通过测试前,所述方法还包括:
利用所述测试可执行文件,从所述目标测试脚本数据中提取验证测试消息编码第二被测线程编码;
根据所述验证测试消息编码,获取验证测试消息;
将所述全局变量赋值给所述验证测试消息;
利用所述测试可执行文件,运行赋值后的所述验证测试消息,得到验证结果;
接收所述第一被测线程对所述测试消息的运行结果,包括:
根据所述第二被测线程编码,接收第二被测线程对所述测试消息的运行结果;
确定所述第一被测线程通过测试,包括:
利用所述测试可执行文件,比较所述运行结果和所述验证结果;
在所述运行结果和所述验证结果一致时,确定所述第二被测线程通过所述目标测试脚本数据的测试;
在所述运行结果和所述验证结果不一致时,返回所述第二被测线程的运行结果与所述验证结果的差异值。
4.根据权利要求3所述的方法,其特征在于,根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据,包括:
根据所述测试指令中的线程标识,启动待测软件中的至少一个线程;所述第一被测线程为所述至少一个线程中的任意线程;
根据所述测试指令中的测试用例标识和所述线程标识,在预先存储的多个测试脚本数据中获取至少一个测试脚本数据;
在读取到所述至少一个测试脚本数据中的任意测试脚本数据的第一关键词时,将所述第一关键词对应的测试脚本数据确定为所述目标测试脚本数据;或,
在读取到所述至少一个测试脚本数据中的任意测试脚本数据的第二关键词时,将所述第二关键词对应的测试脚本数据确定为所述目标测试脚本数据。
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:
接收输入的测试脚本数据,将所述输入的测试脚本数据存储于所述测试模块的测试用例头文件中;所述测试脚本数据是用于测试待测软件中单个线程的测试用例;
根据编辑指令,修改存储于所述测试用例头文件的所述测试脚本数据;
根据调取指令,显示测试记录;所述测试记录包括所述测试模块根据所述测试脚本数据生成的测试日志和所述测试可执行文件。
6.一种线程测试的装置,其特征在于,所述装置包括:
第一接收模块,用于根据接收的测试指令,在预先存储的测试脚本数据中确定目标测试脚本数据;
解析模块,用于解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
获取测试消息模块,用于根据所述测试消息编码,获取测试消息;
发送模块,用于根据所述第一被测线程编码,将所述测试消息发送给第一被测线程;
第二接收模块,用于接收所述第一被测线程对所述测试消息的运行结果;
验证模块,用于在所述运行结果验证正确时,确定所述第一被测线程通过测试
所述装置还包括:
编译模块,用于编译本地的通用代码和被测代码得到测试可执行文件;
所述解析模块包括:解析子模块,用于利用所述测试可执行文件,解析所述目标测试脚本数据,获得第一被测线程编码和测试消息编码;
所述获取测试消息模块包括:
执行内容获得子模块,用于根据所述测试消息编码,得到源线程的执行内容;所述源线程为所述第一被测线程的逻辑输入线程;
运行子模块,用于利用所述测试可执行文件,运行所述执行内容,生成所述测试消息。
7.一种可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-5任一所述的方法中的步骤。
8.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行时实现如权利要求1-5任一所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010532001.6A CN111797006B (zh) | 2020-06-11 | 2020-06-11 | 一种线程测试的方法、装置、设备以及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010532001.6A CN111797006B (zh) | 2020-06-11 | 2020-06-11 | 一种线程测试的方法、装置、设备以及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111797006A CN111797006A (zh) | 2020-10-20 |
CN111797006B true CN111797006B (zh) | 2022-06-21 |
Family
ID=72803242
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010532001.6A Active CN111797006B (zh) | 2020-06-11 | 2020-06-11 | 一种线程测试的方法、装置、设备以及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111797006B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112181851B (zh) * | 2020-10-27 | 2023-07-28 | 北京字跳网络技术有限公司 | 软件测试方法、设备及存储介质 |
CN112231235B (zh) * | 2020-12-10 | 2021-03-30 | 广东睿江云计算股份有限公司 | 基于多方协作的测试用例编写及测试方法及其系统 |
CN112711406A (zh) * | 2020-12-30 | 2021-04-27 | 西安精密机械研究所 | 一种基于LabVIEW的测试流程编辑解析和线程交互的方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8375350B1 (en) * | 2006-06-02 | 2013-02-12 | Cadence Design Systems, Inc. | Methods for reduced test case generation |
CN106776312A (zh) * | 2016-12-12 | 2017-05-31 | 北京蓝海讯通科技股份有限公司 | 云压力测试数据分配的方法、装置、计算设备及压力测试系统 |
CN109313601A (zh) * | 2016-05-09 | 2019-02-05 | 甲骨文国际公司 | 用于编码栈踪迹信息的压缩技术 |
-
2020
- 2020-06-11 CN CN202010532001.6A patent/CN111797006B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8375350B1 (en) * | 2006-06-02 | 2013-02-12 | Cadence Design Systems, Inc. | Methods for reduced test case generation |
CN109313601A (zh) * | 2016-05-09 | 2019-02-05 | 甲骨文国际公司 | 用于编码栈踪迹信息的压缩技术 |
CN106776312A (zh) * | 2016-12-12 | 2017-05-31 | 北京蓝海讯通科技股份有限公司 | 云压力测试数据分配的方法、装置、计算设备及压力测试系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111797006A (zh) | 2020-10-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111797006B (zh) | 一种线程测试的方法、装置、设备以及存储介质 | |
CN109871326B (zh) | 一种脚本录制的方法和装置 | |
US20210011840A1 (en) | Software testing method, system, apparatus, device medium, and computer program product | |
US6986125B2 (en) | Method and apparatus for testing and evaluating a software component using an abstraction matrix | |
CN111832236B (zh) | 一种芯片回归测试方法、系统、电子设备及存储介质 | |
US7895575B2 (en) | Apparatus and method for generating test driver | |
US9274930B2 (en) | Debugging system using static analysis | |
CN106776338B (zh) | 一种测试方法、装置及服务器 | |
US10049031B2 (en) | Correlation of violating change sets in regression testing of computer software | |
CN112597028A (zh) | 一种用例测试结果的展示方法、装置及可读存储介质 | |
CN114546738B (zh) | 服务器通用测试方法、系统、终端及存储介质 | |
CN107329889B (zh) | 一种c编译器自动化测试的方法 | |
JP2014021982A (ja) | オブジェクト指向言語のための記号テストドライバの反復生成 | |
US10592703B1 (en) | Method and system for processing verification tests for testing a design under test | |
CN110928777B (zh) | 测试用例的处理方法、装置、设备及存储介质 | |
CN114996127A (zh) | 固态硬盘固件模块智能化测试方法及系统 | |
CN103365772B (zh) | 软件测试自动评价装置以及方法 | |
CN111400171B (zh) | 一种接口测试方法、系统、装置及可读存储介质 | |
CN110908903B (zh) | 一种基于可编辑yaml文件的测试方法 | |
CN109101355B (zh) | 一种提取错误现场特征测试激励的处理器调试方法 | |
KR100777103B1 (ko) | 테스트 드라이버 생성 장치 및 방법 | |
CN115934503A (zh) | 程序测试方法、装置、设备及存储介质 | |
JP4957521B2 (ja) | ソフトウェア部分テストシステム、それに用いる方法およびプログラム | |
CN111008140B (zh) | 一种跨平台的ui自动化测试方法及装置 | |
CN113326193A (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 |