单元测试方法和装置与流程

文档序号:15557736发布日期:2018-09-29 01:31阅读:214来源:国知局

本发明涉及软件测试技术领域,尤其涉及一种单元测试方法和装置。



背景技术:

单元测试是一种白盒测试,旨在检测软件代码中的错误和漏洞,从源头上保证软件的质量,是对软件每一行代码或代码块进行覆盖测试以判断其正确与否。在软件开发过程中发挥了重要的作用,是非常有效的代码质量保证手段。在现有技术中,单元测试方法主要是结合开源的一些测试框架(如junit、testng等)由开发人员进行手工编码,再通过人工编写大量的测试用例代码去覆盖代码各个分支逻辑,以对源程序代码进行测试验证,并通过编译生成测试报告,再通过解读测试报告中令人费解的测试数据,最终才能判断出源程序代码中的错误和漏洞。

上述现有技术存在的技术缺陷在于:在编写测试用例的过程中,需要投入较多精力,甚至投入比业务代码开发更多的时间精力来编写覆盖各个场景的单元测试代码,时间成本较高;而且存在过多的人工干预,存在人为因素导致的测试错误,故使源程序遗留或多或少的漏洞未能及时发现,降低测试效率。



技术实现要素:

本发明的目的是提供一种单元测试方法和装置,不仅实现自动生成单元测试代码,极大提高了单元测试代码的开发效率;而且通过组合引索键信息从数据库中加载关联的配置列表能够实现单元测试的自动化,避免人为因素导致的测试错误,提高测试效率和准确率。

本发明提供了一种单元测试方法,包括以下步骤;

获取当前单元测试下输入的测试对象,通过反射机制获取与所述测试对象对应的每个类信息和方法信息,依次根据每个所述类信息和方法信息依据预设规则和预设代码模板生成单元测试代码;所述单元测试代码包括组合引索键信息;

根据所述组合引索键信息从数据库中加载关联的配置列表,并对所述配置列表进行解析,得到测试用例数据;

依次读取所有的所述测试用例数据,并执行所述单元测试代码,根据执行结果生成测试报告。

作为一种可实施方式,所述根据所述组合引索键信息从数据库中加载关联的配置列表,包括以下步骤;

根据所述组合引索键信息从本地数据库中加载关联的本地配置列表和本地版本信息;

获取测试用例的当前版本信息,将所述本地版本信息与所述当前版本信息进行比对判断;

若所述本地版本信息与所述当前版本信息的版本一致,则将本地配置列表变更为配置列表;

若所述本地版本信息与所述当前版本信息的版本不一致,则根据所述组合引索键信息从云服务器的数据库中加载关联的云端配置列表和云端版本信息,并将所述云端配置列表和云端版本信息进行存储,分别替换本地数据库中所述本地配置列表和本地版本信息。

作为一种可实施方式,所述依次根据每个所述类信息和方法信息依据预设规则和预设代码模板生成单元测试代码,包括以下步骤;

依据所述预设规则对每个类信息进行后缀限定处理,同时,依据所述预设规则对每个方法信息进行前缀限定处理;

依次将限定处理后的每个类信息和与类信息对应的方法信息依据预设代码模板进行执行处理,生成单元测试代码;所述预设代码模板包括入参转换组装模板、执行测试方法模板以及结果预期对比模板。

作为一种可实施方式,所述依次读取所有的所述测试用例数据,并执行所述单元测试代码,根据执行结果和测试用例数据中的预期结果生成测试报告,包括以下步骤;

依次读取所有的所述测试用例数据,每个所述测试用例数据包括用例入参数据、外部调用模拟数据以及执行预期结果;

根据每个所述用例入参数据和外部调用模拟数据对所述单元测试代码进行执行处理,根据执行结果和执行预期结果进行比对,根据比对结果生成测试报告。

作为一种可实施方式,本发明提供的单元测试方法还包括以下步骤;

在获取当前单元测试下输入的测试对象之前,获取与各类待测试对象的类信息和对应的方法信息,及获取与所述方法信息对应的用例入参数据和外部调用模拟数据;

将各类所述类信息及对应的方法信息录入云服务器中;在录入时,添加与所述方法信息对应的所述用例入参数据、外部调用模拟数据以及执行预期结果,生成包括测试用例数据的配置列表、配置列表与组合引索键信息关联的键值对信息以及当前版本信息。

相应的,本发明还提供一种单元测试装置,包括生成模块、加载解析模块以及执行模块;

所述生成模块,用于获取当前单元测试下输入的测试对象,通过反射机制获取与所述测试对象对应的每个类信息和方法信息,依次根据每个所述类信息和方法信息依据预设规则和预设代码模板生成单元测试代码;所述单元测试代码包括组合引索键信息;

所述加载解析模块,用于根据所述组合引索键信息从数据库中加载关联的配置列表,并对所述配置列表进行解析,得到测试用例数据;

所述执行模块,用于依次读取所有的所述测试用例数据,并执行所述单元测试代码,根据执行结果生成测试报告。

作为一种可实施方式,所述加载解析模块包括加载单元、判断单元、变更单元以及替换单元;

所述加载单元,用于根据所述组合引索键信息从本地数据库中加载关联的本地配置列表和本地版本信息;

所述判断单元,用于获取测试用例的当前版本信息,将所述本地版本信息与所述当前版本信息进行比对判断;

所述变更单元,用于若所述本地版本信息与所述当前版本信息的版本一致,则将本地配置列表变更为配置列表;

所述替换单元,用于若所述本地版本信息与所述当前版本信息的版本不一致,则根据所述组合引索键信息从云服务器的数据库中加载关联的云端配置列表和云端版本信息,并将所述云端配置列表和云端版本信息进行存储,分别替换本地数据库中所述本地配置列表和本地版本信息。

作为一种可实施方式,所述生成模块包括限定单元和生成单元;

所述限定单元,用于依据所述预设规则对每个类信息进行后缀限定处理,同时,依据所述预设规则对每个方法信息进行前缀限定处理;

所述生成单元,用于依次将限定处理后的每个类信息和与类信息对应的方法信息依据预设代码模板进行执行处理,生成单元测试代码;所述预设代码模板包括入参转换组装模板、执行测试方法模板以及结果预期对比模板。

作为一种可实施方式,所述执行模块包括读取单元和执行单元;

所述读取单元,用于依次读取所有的所述测试用例数据,每个所述测试用例数据包括用例入参数据、外部调用模拟数据以及执行预期结果;

所述执行单元,用于根据每个所述用例入参数据和外部调用模拟数据对所述单元测试代码进行执行处理,根据执行结果和执行预期结果进行比对,根据比对结果生成测试报告。

作为一种可实施方式,本发明提供的单元测试装置还包括录入管理模块;

所述录入管理模块,用于在获取当前单元测试下输入的测试对象之前,获取与各类待测试对象的类信息和对应的方法信息,及获取与所述方法信息对应的用例入参数据和外部调用模拟数据;

将各类所述类信息及对应的方法信息录入云服务器中;在录入时,添加与所述方法信息对应的所述用例入参数据、外部调用模拟数据以及执行预期结果,生成包括测试用例数据的配置列表、配置列表与组合引索键信息关联的键值对信息以及当前版本信息。

与现有技术相比,本技术方案具有以下优点:

本发明提供的单元测试方法和装置,只需要用户在当前单元测试中输入的测试对象,就能自动通过反射机制获取与测试对象对应的每个类信息和方法信息,进而依次根据每个类信息和方法信息依据预设规则和预设代码模板生成单元测试代码;再根据单元测试代码中的组合引索键信息从数据库中加载关联的配置列表,并对配置列表进行解析;最后依次读取所有解析得到的测试用例数据,并执行单元测试代码,根据执行结果生成测试报告;从而不仅实现自动生成单元测试代码,极大提高了单元测试代码的开发效率;而且通过组合引索键信息从数据库中加载关联的配置列表能够实现单元测试的自动化,避免人为因素导致的测试错误,提高测试效率和准确率。

附图说明

图1为本发明实施例一提供的单元测试方法的流程示意图;

图2为本发明实施例三提供的单元测试装置的结构示意图;

图3为图2中加载解析模块的结构示意图。

图中:100、生成模块;110、限定单元;120、生成单元;200、加载解析模块;210、加载单元;220、判断单元;230、变更单元;240、替换单元;300、执行模块;310、读取单元;320、执行单元;400、录入管理模块。

具体实施方式

以下结合附图,对本发明上述的和另外的技术特征和优点进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明的部分实施例,而不是全部实施例。

请参阅图1,本发明实施例一提供的单元测试方法,包括以下步骤;

s100、获取当前单元测试下输入的测试对象,通过反射机制获取与测试对象对应的每个类信息和方法信息,依次根据每个类信息和方法信息依据预设规则和预设代码模板生成单元测试代码;单元测试代码包括组合引索键信息;

s200、根据组合引索键信息从数据库中加载关联的配置列表,并对配置列表进行解析,得到测试用例数据;

s300、依次读取所有的测试用例数据,并执行单元测试代码,根据执行结果生成测试报告。

需要说明的是,测试对象包括不限于类名、包名或者类名和包名;在每次进行单元测试时,依据当前单元测试的不同,输入的测试对象会存在差别。也就是说在对一个工程进行单元测试,根据工程当前单元测试的内容确定。如果一个类在包里,则测试对象可以为类名和其该类所在的包名。即测试对象依据当前单元测试的实际工程中包含的数据为准。在测试对象为包名时,通过反射机制获取每个包名对应的每个类信息和方法信息,类信息与方法信息对应,一个类信息可以对应多个方法信息,而类信息的种类包括类和接口。

于本实施例中,配置列表和组合引索键信息是以键值对(key-valuelist)的关联形式存储于数据库中,组合引索键信息作为一个键值key,可以是以“工程名+类名+方法名”的组合形式实现。在一个工程中组合引索键信息具有唯一性。而配置列表(valuelist)是个链表或者数组,代表的是这个key对应会有一个或多个测试用例数据,每个测试用例数据可以包括用例入参数据、外部调用模拟数据以及执行预期结果。在执行单元测试代码的时候这些数据会优先加载到内存里面,也会保持同样的key-valuelist结构,这样一来,每次执行单元测试代码的时候只要通过“工程名+类名+方法名”的组合引索键信息就可以取出对应的这些测试用例数据。

而在执行单元测试代码进行测试时,依次读取所有的测试用例数据,再按照读取的先后顺序进行执行。比如,一个类中具有两个方法,login和query。在读取时是先读取login对应的测试用例数据,再读取query对应的测试用例数据;那么在依次读取所有的测试用例数据后,先执行与login对应的单元测试代码,再执行与query对应的单元测试代码。于其他实施例中,也可以是方法信息为一个循环,读取完一个方法信息对应的测试用例数据,执行一次对于的单元测试代码。当然为了提高运行效率,也可以同时进行。

本发明提供的单元测试方法和装置,只需要用户在当前单元测试中输入的测试对象,就能自动通过反射机制获取与测试对象对应的每个类信息和方法信息,进而依次根据每个类信息和方法信息依据预设规则和预设代码模板生成单元测试代码;再根据单元测试代码中的组合引索键信息从数据库中加载关联的配置列表,并对配置列表进行解析;最后依次读取所有解析得到的测试用例数据,并执行单元测试代码,根据执行结果生成测试报告;从而不仅实现自动生成单元测试代码,极大提高了单元测试代码的开发效率;而且通过组合引索键信息从数据库中加载关联的配置列表能够实现单元测试的自动化,避免人为因素导致的测试错误,提高测试效率和准确率。

为了提高测试准确率,在加载关联的配置列表时需要确定配置列表为最新的配置列表。一般来说,每次更新配置列表及其中的测试用例数据时,都会在完成更新后上传至云服务器中保存。而在本地进行单元测试时,需要先判断本地的配置列表是否为最新的,如果不是就需要到云服务器中下载最新的配置列表,这样就避免过期测试用例数据引起的测试错误。当然于其他实施例中,也可以直接将最新的配置列表及其中的测试用例数据直接更新至本地。

于本实施例中,是采用在更新后将配置列表及其中的测试用例数据上传至云服务器中保存的方式,下面对这种方式的步骤进行详细说明。根据组合引索键信息从数据库中加载关联的配置列表,包括以下步骤;

s210、根据组合引索键信息从本地数据库中加载关联的本地配置列表和本地版本信息;

s220、获取测试用例的当前版本信息,将本地版本信息与当前版本信息进行比对判断;

s230、若本地版本信息与当前版本信息的版本一致,则将本地配置列表变更为配置列表;

s240、若本地版本信息与当前版本信息的版本不一致,则根据组合引索键信息从云服务器的数据库中加载关联的云端配置列表和云端版本信息,并将云端配置列表和云端版本信息进行存储,分别替换本地数据库中本地配置列表和本地版本信息。

在每次更新后,都会将更新的数据上传至云服务器,并且将当前更新的版本信息作为云端版本信息。也就是说以云服务器存储的数据为准,只要本地版本信息与当前版本信息的版本不一致,就从云服务器下载云端配置列表和云端版本信息。即本地的数据是云服务器的一个备份副本。从而保证配置列表是最新的,避免由于版本更新引起的测试错误。

进一步的,依次根据每个类信息和方法信息依据预设规则和预设代码模板生成单元测试代码,包括以下步骤;

s110、依据预设规则对每个类信息进行后缀限定处理,同时,依据预设规则对每个方法信息进行前缀限定处理;

s120、依次将限定处理后的每个类信息和与类信息对应的方法信息依据预设代码模板进行执行处理,生成单元测试代码;预设代码模板包括入参转换组装模板、执行测试方法模板以及结果预期对比模板。

类信息和方法信息的限定规则不同,于本实施例中,类信息的预设规则为在每个类信息后面增加后缀限定,而方法信息的预设规则为在每个方法信息前面增加前缀限定。在限定后,再依据预设的入参转换组装模板、执行测试方法模板以及结果预期对比模板来实现单元测试代码的生成。

下面举例对上述单元测试代码生成过程进行详细说明。

比如:假设一个工程account,这个工程中userservice这个类里面的包括两个方法(login和query),并且userservice这个类所在的包名为com.xx.service。

则测试对象为userservice。通过java的反射机制获取类信息(userservice)以及方法信息(login和query),然后依次根据每个类信息和方法信息依据预设规则和预设代码模板生成单元测试代码。具体预设规则如下:预设规则1、测试类类名以原类名+"test"后缀来命名;主要对类信息加以限定。预设规则2、测试类中的测试方法以"test"前缀+原方法名来命名,并且传入request(map形式)入参以及expectedresult预期结果;主要对方法信息加以限定,同时传入的request形式的用例入参数据以及执行预期结果。执行预期结果是需要依据测试用例数据测试得到的。

预设规则3、单元测试代码的实现依次依据入参转换组装模板、执行测试方法模板、结果预期对比模板这3个步骤的代码模板来实现。入参转换组装模板:会通过java反射机制获取类信息和方法信息(包括不限于参数类型、参数名信息以及返回值类型),根据参数类型和参数名信息从map<string,object>request自动转化出单元测试代码需要的入参列表,如上述单元测试代码login的方法信息的用例入参数据是两个string类型的参数,就会自动从map<string,object>request中获取这两个string用例入参数据。执行测试方法模板:根据当前传入的用例入参数据执行单元测试代码并得到执行结果,执行结果的返回值类型也是根据java反射机制获取得到的。结果预期对比模板:将单元测试代码执行得到的结果和预期结果进行对比,默认会采用对象序列化为字符串之后进行全值匹配比对,也支持自定义比对。

上述的是针对测试对象是单个类自动生成单元测试代码的流程,如果要测试对象是一个包下面具有多个类。则会循环依次生成这个包下面所有类的单元测试代码。

根据上述规则,针对待测试对象类userservice,生成的单元测试代码如下;

进一步的,依次读取所有的测试用例数据,并执行单元测试代码,根据执行结果和测试用例数据中的预期结果生成测试报告,包括以下步骤;

依次读取所有的测试用例数据,每个测试用例数据包括用例入参数据、外部调用模拟数据以及执行预期结果;

根据每个用例入参数据和外部调用模拟数据对单元测试代码进行执行处理,根据执行结果和执行预期结果进行比对,根据比对结果生成测试报告。

测试报告包括比对结果、错误信息以及版本信息等。直接可以从测试报告获得测试结果,提高了测试效率。在将单元测试代码执行得到的结果和预期结果进行对比时,默认会采用对象序列化为字符串之后进行全值匹配比对,也支持自定义比对。如果是自定义比对则需要预设自定义的值。

进一步的,本发明实施例二提供的单元测试方法,与实施例一相比,还包括以下步骤;

在获取当前单元测试下输入的测试对象之前,获取与各类待测试对象的类信息和对应的方法信息,及获取与方法信息对应的用例入参数据和外部调用模拟数据;将各类类信息及对应的方法信息录入云服务器中;在录入时,添加与方法信息对应的用例入参数据、外部调用模拟数据以及执行预期结果,生成包括测试用例数据的配置列表、配置列表与组合引索键信息关联的键值对信息以及当前版本信息。

在云服务器中的录入也可以是在云服务器中的用例管理平台中进行。如果是在用例管理平台中进行录入,在第一次录制时需要进行注册,注册完成之后就可以往管理平台里面添加测试用例数据,过程可以为,录入需要测试的类信息以及相应的方法信息;类信息为类或接口。添加单元测试代码的用例入参数据;关联单元测试代码需要的外部调用模拟数据;判断是否已有外部调用模拟数据;若没有,则重复执行上述步骤,即录入待模拟测试的类信息以及相应的方法信息,并添加外部调用模拟数据,最后执行预期结果。若有,则直接添加外部调用模拟数据,然后进行添加执行预期结果。录制后的测试数据同样可以通过“工程名+类名+方法名”为key检索到,并且可以随时在该平台上查看测试代码目前已经覆盖的测试用例数据的情况,非常直观。通过对单元测试代码的测试用例数据统一管理和维护,可以非常直观的看到目前已经覆盖的场景有哪些,并且极大提高了后续单元测试的可维护性。

基于同一发明构思,本发明实施例还提供一种单元测试装置,该装置的实施可参照上述方法的过程实现,重复之处不再冗述。

如图2所示,是本发明实施例三提供的单元测试装置的结构示意图,包括生成模块100、加载解析模块200以及执行模块300;生成模块100用于获取当前单元测试下输入的测试对象,通过反射机制获取与测试对象对应的每个类信息和方法信息,依次根据每个类信息和方法信息依据预设规则和预设代码模板生成单元120测试代码;单元测试代码包括组合引索键信息;加载解析模块200用于根据组合引索键信息从数据库中加载关联的配置列表,并对配置列表进行解析,得到测试用例数据;执行模块300用于依次读取所有的测试用例数据,并执行单元320测试代码,根据执行结果生成测试报告。

本发明不仅实现自动生成单元120测试代码,极大提高了单元测试代码的开发效率;而且通过组合引索键信息从数据库中加载关联的配置列表能够实现单元测试的自动化,避免人为因素导致的测试错误,提高测试效率和准确率。

如图3所示,为加载解析模块200的结构示意图;加载解析模块200包括加载单元210、判断单元220、变更单元230以及替换单元240;加载单元210用于根据组合引索键信息从本地数据库中加载关联的本地配置列表和本地版本信息;判断单元220用于获取测试用例的当前版本信息,将本地版本信息与当前版本信息进行比对判断;变更单元230用于若本地版本信息与当前版本信息的版本一致,则将本地配置列表变更为配置列表;替换单元240用于若本地版本信息与当前版本信息的版本不一致,则根据组合引索键信息从云服务器的数据库中加载关联的云端配置列表和云端版本信息,并将云端配置列表和云端版本信息进行存储,分别替换本地数据库中本地配置列表和本地版本信息。

为了提高运行效率,生成模块100包括限定单元110和生成单元120;限定单元110用于依据预设规则对每个类信息进行后缀限定处理,同时,依据预设规则对每个方法信息进行前缀限定处理;生成单元120用于依次将限定处理后的每个类信息和与类信息对应的方法信息依据预设代码模板进行执行处理,生成单元120测试代码;预设代码模板包括入参转换组装模板、执行测试方法模板以及结果预期对比模板。

进一步的,执行模块300包括读取单元310和执行单元320;读取单元310用于依次读取所有的测试用例数据,每个测试用例数据包括用例入参数据、外部调用模拟数据以及执行预期结果;执行单元320用于根据每个用例入参数据和外部调用模拟数据对单元测试代码进行执行处理,根据执行结果和执行预期结果进行比对,根据比对结果生成测试报告。

为了实现统一管理,便于维护,本发明实施例四提供的单元测试装置,与实施例三相比,还包括录入管理模块400;录入管理模块400用于在获取当前单元测试下输入的测试对象之前,获取与各类待测试对象的类信息和对应的方法信息,及获取与方法信息对应的用例入参数据和外部调用模拟数据;将各类类信息及对应的方法信息录入云服务器中;在录入时,添加与方法信息对应的用例入参数据、外部调用模拟数据以及执行预期结果,生成包括测试用例数据的配置列表、配置列表与组合引索键信息关联的键值对信息以及当前版本信息。

本发明虽然已以较佳实施例公开如上,但其并不是用来限定本发明,任何本领域技术人员在不脱离本发明的精神和范围内,都可以利用上述揭示的方法和技术内容对本发明技术方案做出可能的变动和修改,因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化及修饰,均属于本发明技术方案的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1