一种单元测试中生成Mock库的方法和装置的制作方法

文档序号:6427581阅读:187来源:国知局
专利名称:一种单元测试中生成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类。优选的,对应一个组生成所述述Mock类的一个Mock方法,包括依据原始类的类名称和返回值类型生成Mock方法头;判断被Mock的原始类是否为接口,如果否,则在Mock方法体中声明所述Mock的原始类不是接口 ;并执行生成Mock方法体的流程,所述生成Mock方法体的流程包括针对所述集合中的一个组,创建原始类的一个实例,并对应于所述一个组中的各个原始方法生 成各个Mock方法;返回所述创建的原始实例;如果是,则直接执行所述生成Mock方法体的流程。优选的,在所述Mock方法需要抛出异常时,执行抛出异常的流程。优选的,还包括依据所述Mock库进行单元测试。本申请公开了一种单元测试中生成Mock库的装置,包括获取原始类模块,用于获取待测试源代码的各个需要被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库的方法实施例I的流程图;图2是在方法实施例I中步骤103的流程图;图3是在方法实施例I中步骤205的流程图;图4是本申请的一种单元测试中生成Mock库的方法实施例2的流程图;图5是本申请的一种单元测试中生成Mock库的装置实施例I的结构框图;图6是本申请装置实施例I中生成模块503的结构框图;图7是本申请装置实施例I中第二生成子模块605的结构框图;图8是本申请的一种单元测试中生成Mock库的装置实施例2的结构框图。
具体实施例方式下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。本申请可用于众多通用或专用的计算装置环境或配置中。例如个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器装置、包括以上任何装置或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。本申请的主要思想之一可以包括,通过反射原始类,以及通过对原始类是否为接口的判断,可以在原始类分别为接口或者不为接口的情况下进行不同的处理方式,从而实现Mock库的自动生成,依据反射得到的类参数就可以无需人工编写代码实现Mock的自动生成,也能够节省大量的人力物力成本。这里的反射指的是可以在不对一个类进行分析的前提下,可以直接获得类名称、类的方法返回值、方法名、成员变量名或者成员变量类型等参数,而所述原始类即是需要被Mock的类,为了与Mock类进行区分,在本申请实施例中将需要被Mock的类称为原始类。尤其是在对代码质量要求较高的情况下,就可以大大提高Mock库的形成效率,不仅如此,也提高了可靠性,同时还会使得用于单元测试的程序代码的可维护性较好。参考图I,示出了本申请一种单元测试中生成Mock库的方法实施例I的流程图,可以包括以下步骤步骤101 :获取待测试源代码的各个需要被Mock的原始类。因为Mock库是由很多的Mock类组成的,所以在本申请实施例中,需要先由原始类生成Mock类。首先在本步骤中获取待测试源代码的各个需要被Mock的原始类。
步骤102 :通过反射获得所述各个原始类的类参数,所述类参数包括方法名称、参数类型和返回值类型。在本步骤中就需要对各个原始类进行反射,通过反射需要被Mock的类,可以得到原始类所引用的类的类参数,包括引用的类中包括的各个方法的方法名称,参数类型和返回值类型,例如方法参数是整型(int)还是字符串型(string)等,或者返回值类型是int还是 string。步骤103 :依据所述类参数生成所述原始类对应的各个Mock类。依据原始类所引用的类的类参数,生成与原始类对应的各个Mock类。因为Mock类需要用到原始类所引用的类,所以需要根据步骤102中通过反射得到的类参数来生成各个Mock类。具体的,在生成Mock类的过程中,参考图2所示,可以包括以下步骤步骤201 :根据所述原始类的类参数生成所述Mock类的类头。首先将获取到的类参数在所述Mock类的类头中声明。即是在类头中声明原始类都引用了哪些类。步骤202 :将所述原始类包括的各个原始方法封装成方法对象类。生成类头之后,再将原始类所包括的各个原始方法封装成方法对象(Methodobject)类,即是将各个原始方法重新封装成Mock类中的方法对象,可以组成一个列表。步骤203 :将所述方法对象类按照所述返回值类型分为若干个组。把MethodObject类按照不同的返回值类型进行分成η个组,例如,返回值类型为int的方法对象类分为一个组。步骤204 :按照所述若干个组对应生成若干个集合,以过滤重复的原始方法。再以组为单位把前述的方法对象类放到一个新的集合(Set)中,并对其进行去重处理。具体可以采用把方法名称放进Set中进行去重处理,因为Set是不允许有重复的。分组后Set中的示意可以参考表I所示表I
权利要求
1.ー种单元测试中生成Mock库的方法,其特征在于,包括 获取待测试源代码的各个需要被Mock的原始类; 通过反射获得所述各个原始类的类參数,所述类參数包括方法名称、參数类型和返回值类型; 依据所述类參数生成所述原始类对应的各个Mock类; 将所述各个Mock类组成的集合作为Mock库。
2.根据权利要求I所述的方法,其特征在于,所述依据所述类參数生成所述原始类对应的ー个Mock类,包括 根据所述原始类的类參数生成所述Mock类的类头; 将所述原始类包括的各个原始方法封装成方法对象类; 将所述方法对象类按照所述返回值类型分为若干个组; 按照所述若干个组对应生成若干个集合,以过滤重复的原始方法; 对应所述集合中各个组生成所述Mock类的各个Mock方法;所述Mock方法的个数与所述组的个数相同; 依据所述类头和各个Mock方法生成ー个Mock类。
3.根据权利要求2所述的方法,其特征在干,对应ー个组生成所述述Mock类的ー个Mock方法,包括 依据原始类的类名称和返回值类型生成Mock方法头; 判断被Mock的原始类是否为接ロ,如果否,则在Mock方法体中声明所述Mock的原始类不是接ロ ;并执行生成Mock方法体的流程,所述生成Mock方法体的流程包括针对所述集合中的ー个组,创建原始类的ー个实例,并对应于所述一个组中的各个原始方法生成各个Mock方法;返回所述创建的原始实例; 如果是,则直接执行所述生成Mock方法体的流程。
4.根据权利要求I所述的方法,其特征在于,在所述Mock方法需要抛出异常时,执行抛出异常的流程。
5.根据权利要求I所述的方法,其特征在于,还包括 依据所述Mock库进行単元测试。
6.ー种单元测试中生成Mock库的装置,其特征在于,该装置包括 获取原始类模块,用于获取待测试源代码的各个需要被Mock的原始类; 获得类參数模块,用于通过反射获得所述各个原始类的类參数,所述类參数包括方法名称、參数类型和返回值类型; 生成模块,用于依据所述类參数生成所述原始类对应的各个Mock类; 组合模块,用于将所述各个Mock类组成的集合作为Mock库。
7.根据权利要求6所述的装置,其特征在于,所述生成模块,包括 第一生成子模块,用于根据所述原始类的类參数生成所述Mock类的类头; 封装子模块,用于将所述原始类包括的各个原始方法封装成方法对象类; 划分子模块,用于将所述方法对象类按照所述返回值类型分为若干个组; 过滤子模块,用于按照所述若干个组对应生成若干个集合,以过滤重复的原始方法; 第二生成子模块,用于对应所述集合中各个组生成所述Mock类的各个Mock方法;所述Mock方法的个数与所述组的个数相同; 第三生成子模块,用于依据所述类头和各个Mock方法生成一个Mock类。
8.根据权利要求7所述的装置,其特征在于,所述第二生成子模块,具体配置为 第四生成子模块,用于依据原始类的类名称和返回值类型生成Mock方法头; 判断模块,用于判断被Mock的原始类是否为接口 ; 声明子模块,用于在所述判断模块的结果为否时,在Mock方法体中声明所述Mock的原始类不是接口,并触发执行流程子模块; 执行流程子模块,用于在所述判断模块的结果为是时,执行生成Mock方法体的流程,所述生成Mock方法体的流程包括针对所述集合中的一个组,创建原始类的一个实例,并 对应于所述一个组中的各个原始方法生成各个Mock方法;返回所述创建的原始实例。
9.根据权利要求6所述的装置,其特征在于,还包括 抛出模块,用于在所述Mock方法需要抛出异常时,执行抛出异常的流程。
10.根据权利要求6所述的装置,其特征在于,还包括 测试模块,用于依据所述Mock库进行单元测试。
全文摘要
本申请提供了一种单元测试中生成Mock库的方法、装置和系统,所述方法包括获取待测试源代码的各个需要被Mock的原始类;通过反射获得所述各个原始类的类参数,所述类参数包括方法名称、参数类型和返回值类型;依据所述类参数生成所述原始类对应的各个Mock类;将所述各个Mock类组成的集合作为Mock库。本申请实施例实现Mock的自动生成,从而节省了大量的人力物力成本。尤其是在对代码质量要求较高的情况下,就可以大大提高Mock库的形成效率,不仅如此,也提高了可靠性。
文档编号G06F11/36GK102855178SQ201110181398
公开日2013年1月2日 申请日期2011年6月30日 优先权日2011年6月30日
发明者冯照临, 刘中胜 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1