本发明专利技术提供了一种单元测试的方法及装置,所述方法包括:接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型;依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类;使用所述领域对象和/或Mock类生成所述被测方法的测试方法;按照所述测试方法对所述原始类进行单元测试。本发明专利技术实施例可以解决现有技术中单元测试的效率低下以及可维护性较差的问题。
【技术实现步骤摘要】
本申请涉及软件测试领域,特别涉及一种单元测试的方法和装置。
技术介绍
単元测试是在软件开发过程中要进行的最低级别的测试活动,在単元测试过程中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。因此,単元测试不仅仅是作为无错编码的ー种辅助手段应用于一次性的开发过程,単元测试也必须是可重复的,无论是在软件修改过程中,还是移植到新的运行环境之后。而在单元测试过程中,对于某些不容易构造或者不容易获取的对象,可以采用创建ー个虚拟的对象来进行测试的方式,这个虚拟的对象就称为Mock对象。Mock对象就是实际中的对象在单元测试期间的代替品OMock对象是Mock类的实例化,在现有技术中,单元测试中Mock类的代码编写,主 要依赖于人工,所有的Mock类的代码编写完毕,就组成了 Mock库。但是这种人工编写代码的效率很低,进行单元测试时的效率也非常低下;尤其是在对代码质量要求较高的情况下,就会因为低效的単元测试程序编写而浪费了大量的人力物カ资源。不仅如此,还会使得単元测试的程序代码的可维护性较差。总之,目前需要本领域技术人员迫切解决的ー个技术问题就是如何能够创新的提出ー种自动进行単元测试的方法,以解决现有技术中单元测试的效率低下以及可维护性较差的问题。
技术实现思路
本申请所要解决的技术问题是提供一种单元测试的方法,用以解决现有技术中编写単元测试程序的效率低下以及可维护性较差的问题。本申请还提供了一种单元测试的装置,用以保证上述方法在实际中的实现及应用。为了解决上述问题,本申请公开了一种单元测试的方法,包括接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型;依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类;使用所述领域对象和/或Mock类生成所述被测方法的测试方法;按照所述测试方法对所述原始类进行単元测试。优选的,还包括针对所述被测方法的源代码进行静态分析,以生成Mock库的步骤,具体为获取待测试源代码中各个需要被Mock的原始类;通过反射获得所述各个原始类的类中被测方法的參数,所述类參数包括被测方法名称、參数类型和返回值类型;依据所述类參数生成所述原始类对应的各个Mock类;将所述各个Mock类组成的集合作为Mock库。优选的,还包括构 建领域对象模型库的步骤,具体为获取待测试源代码中被引用的领域对象;按照所述被引用的领域对象之间的引用关系对其进行排序;通过反射获取所述被引用的领域对象的属性信息,所述属性信息包括类型及其名称,所述类型包括基本类型和复杂类型;将所述属性信息和被引用的领域对象的完整路径按照引用关系顺序存储至所述领域对象模型库中,所述领域对象模型库中的一行数据为ー个领域对象的信息。优选的,还包括加载所述领域对象模型库的步骤,具体为从所述领域对象模型库中获取单条数据,所述单条数据包括领域对象的完整路径及其初始值;依据所述领域对象的完整路径通过反射调用无參构造方法,以创建所述领域对象的实例;依据所述类型及其初始值调用属性的赋值方法对所述类型进行赋值;将所述领域对象的完整路径和所述赋值后的领域对象的实例作为映射关系对保存至内存中。优选的,所述按照所述领域对象和/或Mock类生成所述被测方法的测试方法,包括获取所述被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的參数和返回值类型;根据所述引用类的类型生成测试方法的方法头;根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表;遍历所述引用类列表,以生成模拟引用类对象行为的代码;从所述领域对象模型库中获取所述引用类的方法參数值,以生成测试方法的方法体;将固定的方法尾、所述方法头以及方法体组成所述测试方法。本申请公开了一种单元测试的装置,包括接收模块,用于接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型;查找模块,用于依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类;生成模块,用于使用所述领域对象和/或Mock类生成所述被测方法的测试方法;测试模块,用于按照所述测试方法对所述原始类进行単元测试。优选的,还包括生成Mock库模块,具体包括第一获取子模块,用于获取待测试源代码中各个需要被Mock的原始类;第一反射子模块,用于通过反射获得所述各个原始类的类中被测方法的參数,所述类參数包括被测方法名称、參数类型和返回值类型;第一生成子模块,用于依据所述类參数生成所述原始类对应的各个Mock类;组合子模块,用于将所述各个Mock类组成的集合作为Mock库。优选的,还包括构建模块,所述构建模块具体包括第二获取子模块,用于获取待测试源代码中被引用的领域对象;排序子模块,用于按照所述被引用的领域对象之间的引用关系对其进行排序;第二反射子模块,用于通过反射获取所述被引用的领域对象的属性信息,所述属性信息包括类型及其名称,所述类型包括基本类型和复杂类型。存储子模块,用于将所述属性信息和被引用的领域对象的完整路径按照引用关系 顺序存储至所述领域对象模型库中,所述领域对象模型库中的一行数据为ー个领域对象的信息。优选的,还包括加载模块,所述加载模块具体包括第三获取子模块,用于从所述领域对象模型库中获取单条数据,所述单条数据包括领域对象的完整路径及其初始值;创建子模块,用于依据所述领域对象的完整路径通过反射调用无參构造方法,以创建所述领域对象的实例;赋值子模块,用于依据所述类型及其初始值调用属性的赋值方法对所述类型进行赋值;保存子模块,用于将所述领域对象的完整路径和所述赋值后的领域对象的实例作为映射关系对保存至内存中。优选的,所述生成模块包括第四获取子模块,用于获取所述被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的參数和返回值类型;第二生成子模块,用于根据所述引用类的类型生成测试方法的方法头;第三生成子模块,用于根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表;遍历子模块,用于遍历所述引用类列表,以生成模拟引用类对象行为的代码;第四生成子模块,用于从所述领域对象模型库中获取所述引用类的方法參数值,以生成测试方法的方法体;组成子模块,用于将固定的方法尾、所述方法头以及方法体组成所述测试方法。与现有技术相比,本申请包括以下优点在本申请中,単元测试的代码通过本实施例的方案自动生成,生成的代码再运行时,通过直接从预先生成的领域对象模型库获取相关的领域对象,以及调用预先生成的Mock库中获取对应的Mock类完成単元测试,能够不再需要人工编写代码,提高単元测试的效率。因此,単元测试的程序代码的可维护性也较好。同时,在加载领域对象模型库的时候,将领域对象模型库放到内存中,可以从内存中直接获取,省去了人工编写的工作量。当然,实施本申请的任ー产品并不一定需要同时达到以上所述的所有优点。附图说明为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的ー些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图I本文档来自技高网...
【技术保护点】
一种单元测试的方法,其特征在于,该方法包括:接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型;依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类;使用所述领域对象和/或Mock类生成所述被测方法的测试方法;按照所述测试方法对所述原始类进行单元测试。
【技术特征摘要】
【专利技术属性】
技术研发人员:冯照临,刘中胜,
申请(专利权)人:阿里巴巴集团控股有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。