背景技术
在软件开发过程中,开发人员需要对开发的功能进行单元测试,也称为白盒测试,通过构造各种数据输入,来验证相应的功能是否正常运行。
由于软件开发的复杂性,常常需要调用一些复杂的服务和接口,而这些接口可能配置麻烦,数据不易构造。故而在测试过程中,为了提升效率,构造复杂的输入数据,需要模拟构造(mock,即指如果测试代码依赖于某些服务对象,而这些服务对象在测试时又很难手动创建,那么就用一个虚拟的对象来模拟服务对象的行为进行测试)这些服务和接口来聚焦于核心功能代码的测试。
在模拟这些服务和接口的同时,现有的Mockito,easyMock等框架提供了很好的Mock实现;可以对接口、普通JAVA类进行任意的模拟。
在白盒测试中如果使用mock方式进行测试,现有的技术是通过生成mock服务对象,然后使用代码来构造测试数据。如图1所示。
但是这些框架无法实现自动化加载测试参数、Mock出来的服务无法被统一管理,以及通过spring注入到测试类等。如图2所示。
综上所述,现有技术中白盒测试存在如下缺点:
1、需要的测试数据无法配置化,需要通过编写代码来手动创建测试数据,测试数据的复用性不高;
2、在日常使用的Spring框架中,需要测试的业务类一般是通过注解的方式来进行自动装配的。通过现有技术,无法享用注解这一便捷高效的功能来完成;mock的对象及模拟的响应逻辑,亦无法在其他测试类中进行复用。
3、在我们进行测试的业务代码中,需要夹杂为了伪造外部接口及服务而编写新的代码,无法做到只聚焦测试相关功能,代码不够纯粹简洁。
发明内容
有鉴于此,本发明提供一种数据自动加载并复用模拟服务测试的方法和装置,能够在测试运行时自动加载测试数据;并将模拟构造的服务进行统一管理,以在测试过程中复用;此外,还能实现模拟构造代码和具体的测试代码分离,使测试代码更为简洁。
为实现上述目的,根据本发明的一个方面,提供了一种数据自动加载并复用模拟服务测试的方法。
本发明的数据自动加载并复用模拟服务测试的方法包括:用外部文件配置测试数据;在spring框架中初始化配置mock配置类列表;对所述mock配置类列表中的每个mock配置类进行处理,将用外部文件配置后的测试数据加载到mock配置类的成员变量和方法参数中,通过调用mock配置类中不同的方法生成不同的mock服务;将生成的mock服务注册到spring框架的上下文中进行统一管理以便根据测试需求进行复用。
可选地,所述用外部文件配置测试数据包括:将测试数据以json格式的文本文件进行存储。
可选地,所述将用外部文件配置后的测试数据加载到mock配置类的成员变量和方法参数中包括:通过注解的方式指定json格式文本文件id以读取测试数据文件的内容,并将文件内容转化为java对象加载到mock配置类的成员变量和方法参数中。
可选地,所述通过调用mock配置类中不同的方法生成不同的mock服务包括:通过调用mock配置类中不同的方法返回成员变量数据和/或对应的方法参数数据,从而生成不同的mock服务。
根据本发明的另一方面,提供一种数据自动加载并复用模拟服务测试的装置。
本发明的数据自动加载并复用模拟服务测试的装置包括:外部配置模块,用于用外部文件配置测试数据;初始化配置模块,用于在spring框架中初始化配置mock配置类列表;mock服务生成模块,用于对所述mock配置类列表中的每个mock配置类进行处理,将用外部文件配置后的测试数据加载到mock配置类的成员变量和方法参数中,通过调用mock配置类中不同的方法生成不同的mock服务;注册模块,用于将生成的mock服务注册到spring框架的上下文中进行统一管理以便根据测试需求进行复用。
可选地,所述外部配置模块还用于:将测试数据以json格式的文本文件进行存储。
可选地,所述mock服务生成模块还用于:通过注解的方式指定json格式文本文件id以读取测试数据文件的内容,并将文件内容转化为java对象加载到mock配置类的成员变量和方法参数中。
可选地,所述mock服务生成模块还用于:通过调用mock配置类中不同的方法返回成员变量数据和/或对应的方法参数数据,从而生成不同的mock服务。
根据本发明的技术方案,通过利用json格式的文本文件对测试数据进行存储,从而为测试数据的自动加载提供了可能,也有利于对测试数据的随时修改;通过在spring框架中初始化配置mock配置类列表,并对mock配置类列表中的每个mock配置类进行处理,从而能够向初始化配置的mock配置类中通过注解的方式自动加载测试数据;通过调用mock配置类中的不同方法,能够返回mock配置类中的成员变量数据和/或方法参数数据,从而能够生成不同的mock服务;通过将调用方法生成的不同mock服务注入到spring框架的上下文中,从而能够对生成的mock服务进行统一管理,也能够实现测试过程中从spring框架中提供mock服务,并复用mock服务;此外,测试用例只需要关注具体的业务逻辑,而无需在测试用例中进行参数配置及mock需要的模拟服务,从而使测试代码更加简洁。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图3是根据本发明实施例的数据自动加载并复用模拟服务测试的方法主要步骤的示意图。
如图3所示,本发明实施例的数据自动加载并复用模拟服务测试的方法主要包括如下步骤:
步骤S31:用外部文件配置测试数据。将测试数据进行用外部文件配置化,可以实现无需编写代码来手动创建测试数据,而是通过外部文件的形式进行数据的存储,无需编译,可随时进行编辑修改。
在本发明的具体实施例中,测试数据以独立的json格式的文本文件进行存储,方便的进行编辑及复制,也方便了数据的共用。
在本步骤的用外部文件配置之后,从步骤S32开始在spring框架中构造mock服务。
步骤S32:在spring框架中初始化配置mock配置类列表。在spring框架中构造mock服务,首先需要进行动态配置,即初始化配置用于生成mock服务的配置类列表。在mock配置类列表的每个mock配置类中含有很多方法用于生成不同的mock服务。
在本发明的具体实施例中,首先在spring配置文件中,配置本工具的入口类,如MockDataLoader,在mock配置列表中配置不同的mock配置类,如MockGenerator1,MockGenerator2等。
在本步骤的初始化配置mock配置类列表后,从步骤S33开始处理每一个mock配置类。
步骤S33:对所述mock配置类列表中的每个mock配置类进行处理,将用外部文件配置后的测试数据加载到mock配置类的成员变量和方法参数中,通过调用mock配置类中不同的方法生成不同的mock服务。该步骤中对每个mock配置类的处理逻辑如图5所示。自动加载mock配置类中成员变量的测试数据,读取mock配置类中的所有方法,自动封装方法参数,调用方法生产mock服务。
Mock配置类中的成员变量数据是所有方法可以共享的,而方法的方法参数变量,只有该方法可以使用。关于将用外部文件配置后的测试数据加载到mock配置类的成员变量和方法参数中的具体流程如图7a、7b所示。
在自动加载mock配置类中成员变量的测试数据的过程中,成员变量上添加了JsonFileData注解的才根据注解的fileId,去读取文件内容,然后转换为java对象。具体流程如图7a中所示:获取mock配置类中所有成员变量;对每个成员变量进行判断是否有JsonFileData注解:如果没有直接忽略;如果有注解,获取注解的fileId属性,读取文件内容;以测试数据中包括用户信息为例,配置类中注解代码可表示如下:
@JsonFileData(fileId=“user/list”,itemClass=User.class)
private List<User>userList;
其中,以fileId标示数据来源,对读取的文件内容使用FastJson,Jackson等工具进行转换,变为java对象;将生成的java对象设置到mock配置类的成员变量上。
对mock配置类中方法参数数据的加载如下所述。首先读取mock配置类中的所有方法。只对加了MockConfigBean注解的方法进行处理。
配置类中方法参数注解代码可表示如下:
对加了MockConfigBean注解的方法,获取方法参数,对加了JsonConfigData注解的参数,自动从json文件读取并转换为java对象。具体流程如图7b所示:读取mock配置类中的所有方法;遍历所有方法,对每个方法进行处理;看该方法是否有MockConfigBean注解,如果有该注解表示是用来生产mock服务的方法;如果没有,直接忽略该方法;对用来生产mock服务的方法,对其方法参数变量判断是否有JsonFileData注解,如果有,通过注解的fileId(测试数据的文件名id)属性读取文件内容;将读取的文件内容转换为java对象。
在对测试数据进行加载之后,调用mock配置类中的方法生产mock服务:方法中的代码可以读取mock配置类类中共享的成员变量数据,也可以读取本方法参数变量数据。方法中的代码,需要测试人员手动编写具体的业务逻辑来模拟原有真实的服务,将测试数据与方法代码中的业务逻辑打包组合成一个mock服务对象,以备具体的测试中进行调用。以上描述为对每个mock配置类的具体处理逻辑,每个mock配置类具体流程如图6所示。
步骤S34:将生成的mock服务注册到spring框架的上下文中进行统一管理以便根据测试需求进行复用。前述步骤的方法代码片段中beanId表示mock的服务注入到spring上下文的id。
本发明中,mock服务可自动发布到spring的上下文,实现了模拟构造服务的复用性和统一集中管理。并可通过spring的注入特性,自动注入服务到单元测试之中。
这样,就可以将mock对象的创建及测试数据的生成和真实的测试逻辑分离。因此,在本发明中可实现测试用例无需关注依赖的服务的模拟构造,而只需要使用spring框架的已有的依赖注入特性,将已经预先生产好的mock的服务自动注入到测试类中。
图8是利用本发明实施例的数据自动加载并复用模拟服务测试的方法进行单元测试的开发模式图。
图9是利用本发明实施例的数据自动加载并复用模拟服务测试的方法进行单元测试的关系图。
从图8、图9可以看出,测试数据外部文件配置,并可在测试运行时进行自动加载;构造mock服务的时候,和测试相关代码完全分离,实现了测试代码和开发代码的调用方式和简洁上保持一致;构造mock服务可自动发布到spring的上下文,实现了模拟构造服务的复用性和统一集中管理;并可通过spring的注入特性,自动注入服务到单元测试之中。
从以上描述可以看出,通过利用json格式的文本文件对测试数据进行存储,从而为测试数据的自动加载提供了可能,也有利于对测试数据的随时修改;通过在spring框架中初始化配置mock配置类列表,并对mock配置类列表中的每个mock配置类进行处理,从而能够向初始化配置的mock配置类中通过注解的方式自动加载测试数据;通过调用mock配置类中的不同方法,能够返回mock配置类中的成员变量数据和/或方法参数数据,从而能够生成不同的mock服务;通过将调用方法生成的不同mock服务注入到spring框架的上下文中,从而能够对生成的mock服务进行统一管理,也能够实现测试过程中从spring框架中提供mock服务,并复用mock服务;此外,测试用例只需要关注具体的业务逻辑,而无需在测试用例中进行参数配置及mock需要的模拟服务,从而使测试代码更加简洁。
图10是根据本发明实施例的数据自动加载并复用模拟服务测试的装置主要模块的示意图。
如图10所示,本发明实施例的数据自动加载并复用模拟测试的装置10主要包括如下模块:外部配置模块101、初始化配置模块102、mock服务生成模块103、注册模块104。
外部配置模块101用于用外部文件配置测试数据;初始化配置模块102用于在spring框架中初始化配置mock配置类列表;mock服务生成模块103用于对所述mock配置类列表中的每个mock配置类进行处理,将用外部文件配置后的测试数据加载到mock配置类的成员变量和方法参数中,通过调用mock配置类中不同的方法生成不同的mock服务;注册模块104用于将生成的mock服务注册到spring框架的上下文中进行统一管理以便根据测试需求进行复用。
外部配置模块101还用于将测试数据以json格式的文本文件进行存储。
mock服务生成模块103还用于:通过注解的方式指定json格式文本文件id以读取测试数据文件的内容,并将文件内容转化为java对象加载到mock配置类的成员变量和方法参数中。
mock服务生成模块103还用于:通过调用mock配置类中不同的方法返回成员变量数据和/或方法对应的方法参数数据从而生成不同的mock服务。
根据本发明的技术方案,通过利用json格式的文本文件对测试数据进行存储,从而为测试数据的自动加载提供了可能,也有利于对测试数据的随时修改;通过在spring框架中初始化配置mock配置类列表,并对mock配置类列表中的每个mock配置类进行处理,从而能够向初始化配置的mock配置类中通过注解的方式自动加载测试数据;通过调用mock配置类中的不同方法,能够返回mock配置类中的成员变量数据和/或方法参数数据,从而能够生成不同的mock服务;通过将调用方法生成的不同mock服务注入到spring框架的上下文中,从而能够对生成的mock服务进行统一管理,也能够实现测试过程中从spring框架中提供mock服务,并复用mock服务;此外,测试用例只需要关注具体的业务逻辑,而无需在测试用例中进行参数配置及mock需要的模拟服务,从而使测试代码更加简洁。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。