一种单元测试的方法和装置的制作方法

文档序号:6427572阅读:193来源:国知局
专利名称:一种单元测试的方法和装置的制作方法
技术领域
本申请涉及软件测试领域,特别涉及一种单元测试的方法和装置。
背景技术
単元测试是在软件开发过程中要进行的最低级别的测试活动,在単元测试过程中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。因此,単元测试不仅仅是作为无错编码的ー种辅助手段应用于一次性的开发过程,単元测试也必须是可重复的,无论是在软件修改过程中,还是移植到新的运行环境之后。而在单元测试过程中,对于某些不容易构造或者不容易获取的对象,可以采用创建ー个虚拟的对象来进行测试的方式,这个虚拟的对象就称为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是本申请的ー种单元测试的方法实施例I的流程图;图2是在方法实施例I中步骤103的流程图;图3是本申请的ー种单元测试的方法实施例2的流程图;图4是方法实施例2中步骤301的流程图;
图5是方法实施例2中步骤302的流程图;图6是方法实施例2中步骤304的流程图;图7是本申请的ー种单元测试的装置实施例I的结构框图;图8是装置实施例I中生成模块703的结构框图;图9是本申请的ー种单元测试的装置实施例2的结构框图;图10是装置实施例2中生成Mock库模块901的结构框图;图11是装置实施例2中构建模块902的结构框图;图12是装置实施例2中加载模块903的结构框图。
具体实施例方式下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。本申请可用于众多通用或专用的计算装置环境或配置中。例如个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器装置、包括以上任何装置或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。本申请的主要思想之一可以包括,通过直接从预先生成的领域对象模型库获取相关的领域对象,以及从预先生成的Mock库中获取对应的Mock类,从而可以在进行単元测试的时候,能够不再需要人工编写代码,提高单元测试的效率,并且,因为不再需要人工编写代码,因此,単元测试的程序代码的可维护性也较好。另外,単元测试的代码通过本申请实施例的方案自动生成,生成的代码再运行时,通过直接从预先生成的领域对象模型库获取相关的领域对象,以及调用预先生成的Mock库中获取对应的Mock类完成単元测试,能够不再需要人工编写代码,提高单元测试的效率。參考图1,示出了本申请ー种単元测试的方法实施例I的流程图,可以包括以下步骤步骤101 :接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型。在本实施例中,所述期望字段即是待测试的类中的被测方法的返回值类型或其属性的类型,単元测试的目的即是测试所述期望字段的值是否与测试值相同。可以由用户在输入界面来输入期望字段和测试值,例如,用户可以依次选择测试领域中的ー个包,并选择该包中的某ー个原始类,这个原始类包括了很多方法,因此可以针对需要测试的各个方法都输入相应的期望字段和期望值。步骤102 :依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类。其中,所述Mock库为预先生成的Mock类的集合,各个Mock类都包括若干个Mock方法,这些Mock方法在运行时都可以模拟原始方法的行为。所述领域对象模型库中的领域对象模型是被测系统中引用到的领域对象,包括具体的和抽象的业务模型。例如数据对象、值对象、实体、枚挙、基本类型及其封装类,等等。
需要说明的是,在得到被测方法之后,在本步骤中就可以通过反射和静态代码分析得到被测方法所引用到的领域对象和引用类,再根据被测方法引用的领域对象去领域对象模型库中查找对应的源代码,井根据被测方法的引用类去调用Mock库中的Mock类。步骤103 :使用所述领域对象和/或Mock类生成所述被测方法的测试方法。根据查找到的领域对象和/或Mock类生成所述被测方法的测试方法。需要说明的是,在实际应用中,因为各个被测方法所引用的领域对象或者引用类不同,因此,可以需要根据查找到的领域对象获取属于当前被测方法所引用的领域对象以及模拟当前被测方法的引用类的行为的Mock类,这样就能根据查找到的领域对象以及Mock类组合生成被测方法。在实际应用中,參考图2所示,所述步骤103具体可以包括步骤201 :获取所述被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的參数和返回值类型。本步骤可以获取到被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的返回值类型。例如,被测方法为A,该方法引用了原始类D,而D又引用了引用类E,在E类下调用了方法B,那么本步骤即是获取E类的类型,以及方法B的返回值类型。这里的返回值类型可以理解为整型(int)或者字符串型(string)或自定义的复杂类型等。所述原始类即是需要被Mock的类,为了与Mock类进行区分,在本申请实施例中将需要被Mock的类称为原始类。步骤202 :根据所述原始类的引用类的类型生成测试方法的方法头。在测试方法中的方法头中声明所述弓丨用类的类型。步骤203 :根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表。根据引用类的类型及其调用的方法的返回值类型,生成ー个引用类列表,其中,參考表I所示,第一列表示引用类的名称,第二列表示其所调用方法的返回值类型。表I引用类r该引用类所调用的方法的返回值类型
CcrCreditCardInfoDAOccrCreditCardlnfoDO
CcrCreditCardBankInfoDAOList<CcrCreditCardBankInfoDO>步骤204 :遍历所述引用类列表,以生成模拟引用类对象行为的代码。针对该引用类列表中的每ー个引用类,都对应生成一段模拟行为的代码。首先,判断本次是否需要该引用类对象调用的方法抛出异常,如果需要则可以设置參数“true”来表示测试方法需要抛出异常,如果不需要则可以设置參数“false”;然后判断引用类是否有返回值,如果有,则从领域对象模型库中取出Mock类的返回值;最后调用Mock库中的相应Mock方法,返回被Mock的引用类实例并将其注入被测类的对象。步骤205 :从所述领域对象模型库中获取所述引用类的方法參数值,以生成测试 方法的方法体。再从领域对象模型库中获取所述引用类的方法參数值,井根据步骤204中的模拟结果,可以生成测试方法的方法体部分。步骤206 :将固定的方法尾、所述方法头以及方法体组成测试方法。本步骤即是将固定格式的方法尾,以及前述的方法头和方法体,组成测试方法。步骤104 :按照所述测试方法对所述选择的原始类进行単元测试。生成测试方法之后,就可以根据测试方法对所选择的原始类进行単元测试。采用本申请实施例,単元测试程序运行时可以直接从预先生成的领域对象模型库以及Mock库中获取相关的领域对象以及Mock类,从而可以在进行单元测试的时候,能够提高单元测试的效率,并且,因为不再需要人工编写代码,因此,単元测试的程序代码的可维护性也较好。參考图3,示出了本申请ー种単元测试的方法实施例2的流程图,可以包括以下步骤步骤301 :针对所述被测方法的源代码进行静态分析,以生成Mock库。本步骤即是对被测方法的源代码进行静态分析,最終生成Mock库的步骤。静态分析具体可以包括分析该被测方法是否需要抛出异常;分析该被测方法引用到的引用类的类型;分析该被测方法的參数名(并非类型);以及,分析该被测方法引用到的引用类对象调用的方法。再对上述信息利用反射做进ー步分析,可以得到该被测方法引用到的引用类所调用的方法的返回值类型等。这里的反射指的是可以在不对ー个类进行分析的前提下,可以直接获得类名称、类的方法返回值、方法名、成员变量名或者成员变量类型等參数在实际应用中,參考图4所示,所述步骤301具体可以包括步骤401 :获取待测试源代码中各个需要被Mock的原始类。步骤402 :通过反射获得所述各个原始类的类中被测方法的參数,所述类參数包括被测方法名称、參数类型和返回值类型。步骤403 :依据所述类參数生成所述原始类对应的各个Mock类。
步骤404 :将所述各个Mock类组成的集合作为Mock库。关于生成Mock库的详细内容可以參考另ー篇专利“ー种単元测试中生成Mock库的方法和装置”。步骤302 :构建领域对象模型库。在本步骤还需要构建领域对象模型库,该领域对象模型库用于保存被测方法中所引用到的领域对象,该领域对象以属性信息为主。领域对象模型库可以采用文件的方式进行存储,每一行数据为ー个领域对象模型信息。在其中需要存储两部分内容该领域对象的全路径和领域对象各属性的名称和初始值。在实际应用中,參考图5所示,所述步骤302具体可以包括步骤501 :获取待测试源代码中被引用的领域对象。
首先获取到待测试源代码中都引用了哪些领域对象。步骤502 :按照所述被引用的领域对象之间的引用关系对其进行排序。然后再找出这些领域对象之间是什么样的引用关系,也称为依赖关系,并按照引用关系对领域对象进行排序,将被引用的对象排在前面,将引用的对象排在后面。例如,领域对象A引用B,B又引用C,因此如果初始化A,必须先初始化B,而如果需要初始化B,必须先初始化C,因此可以通过对象之间的引用关系将其顺序排好C、B和A。这样在后续进行初始化的时候就可以先初始化C。假设C的属性都是简单类型,通过默认初值进行赋值即可,再放到领域对象模型库里。接着在需要初始化B时要用到C,就从领域对象模型库里将C取出来,赋值后再把B放到领域对象模型库里,最后初始化A时再把B从领域对象模型库里取出来。步骤503 :通过反射获取所述被引用的领域对象的属性信息,所述属性信息包括类型及其名称,所述类型包括基本类型和复杂类型。通过反射获取所述被引用的领域对象的属性信息,即是领域对象的类型及其名称,类型可以分为基本类型和复杂类型。步骤504 :将所述属性信息和被引用的领域对象的完整路径按照引用关系顺序存储至所述领域对象模型库中,所述领域对象模型库中的一行数据为ー个领域对象的信息。将引用到的领域对象的全名和属性信息按照引用顺序存储在领域对象模型库中,在存储的时候将一个领域对象的信息存储为一行数据,这样就生成了领域对象模型库。步骤303 :接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型。接着在人机交互界面可以接收用户的期望字段和测试值,并在用户触发了单元测试程序之后,开始进行単元测试。步骤304 :加载所述领域对象模型库的步骤。在进行单元测试的时候,因为领域对象模型库是以文件的形式存在硬盘上,因此生成的単元测试程序要想运行,必须先加载到内存中。在实际应用中,參考图6所示,所述步骤304具体可以包括步骤601 :从所述领域对象模型库中获取单条数据,所述单条数据包括领域对象的完整路径、类型及其初始值。从领域对象模型库中依次取出单条数据,就是读出其中的一行数据,里边包含领域模型的完整路径,及其类型和类型的初始值。步骤602 :依据所述领域对象的完整路径通过反射调用无參构造方法,以创建所述领域对象的实例。有了领域对象的全名,就可以通过反射的方式调用其无參构造方法,然后再通过反射调用,获取各个属性的赋值方法进行赋值。步骤603 :依据所述类型及其名称调用属性的赋值方法对所述类型进行赋值。利用步骤602中获取的初始值对类型进行初始化。另外,不管是初始化简单类型还是复杂类型,都要调用属性的赋值方法进行赋值。步骤604 :将所述领域对象的完整路径和所述赋值后的领域对象的实例作为映射关系对保存至内存中。 由于映射关系(Map)可以以key-value对的形式存放对象,方便查找,因此,key存领域对象的完整路径,value就是初始化好的对象,即是赋值后的领域对象的实例。步骤305 :依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类。加载了所述领域对象模型库之后,再从内存中的领域对象模型库直接查找领域对象,以及从预先生成的Mock库中查找Mock类,这里的Mock类是被测方法所引用的类的模拟行为。步骤306 :按照所述领域对象和/或Mock类生成所述被测方法的测试方法。步骤307 :按照所述测试方法对所述选择的原始类进行単元测试。本实施例中与实施例I相同的步骤就不再赘述,參考实施例I中的详细记载即可。在本实施例中,因为预先将领域对象模型库加载到内存中,这样在查找领域对象的时候,就可以直接从内存中进行查找,从而能够提高单元测试的效率,并且节省大量的人力物カ资源。对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。与上述本申请ー种单元测试的方法实施例I所提供的方法相对应,參见图7,本申请还提供了一种单元测试的装置实施例1,在本实施例中,该装置可以包括接收模块701,用于接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型。查找模块702,用于依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类。生成模块703,用于使用所述领域对象和/或Mock类生成所述被测方法的测试方法。其中,在实际应用中,參考图8所示,所述生成模块703具体可以包括第四获取子模块801,用于获取所述被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的參数和返回值类型;第二生成子模块802,用于根据所述原始类的引用类的类型生成测试方法的方法头;第三生成子模块803,用于根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表;遍历子模块804,用于遍历所述引用类列表,以生成模拟引用类对象行为的代码;第四生成子模块805,用于从所述领域对象模型库中获取所述引用类的方法參数值,以生成测试方法的方法体; 组成子模块806,用于将固定的方法尾、所述方法头以及方法体组成所述测试方法。测试模块704,用于按照所述测试方法对所述选择的原始类进行単元测试。采用本申请实施例,可以直接从预先生成的领域对象模型库以及Mock库中获取相关的领域对象以及Mock类,从而可以在进行单元测试的时候,能够提高单元测试的效率,并且,因为不再需要人工编写代码,因此,単元测试的程序代码的可维护性也较好。与上述本申请ー种单元测试的方法实施例2所提供的方法相对应,參见图9,本申请还提供了一种单元测试的装置实施例2,在本实施例中,该装置可以包括生成Mock库模块901,用于生成Mock库。參考图10所示,在实际应用中,所述生成Mock库模块901具体可以包括第一获取子模块1001,用于获取待测试源代码中各个需要被Mock的原始类。第一反射子模块1002,用于通过反射获得所述各个原始类的类中被测方法的參数,所述类參数包括被测方法名称、參数类型和返回值类型。第一生成子模块1003,用于依据所述类參数生成所述原始类对应的各个Mock类。组合子模块1004,用于将所述各个Mock类组成的集合作为Mock库。构建模块902,用于构建领域对象模型库。參考图11所示,在实际应用中,所述构建模块902具体可以包括第二获取子模块1101,用于获取待测试源代码中被引用的领域对象;排序子模块1102,用于按照所述被引用的领域对象之间的引用关系对其进行排序;第二反射子模块1103,用于通过反射获取所述被引用的领域对象的属性信息,所述属性信息包括类型及其名称,所述类型包括基本类型和复杂类型。存储子模块1104,用于将所述属性信息和被引用的领域对象的完整路径按照引用关系顺序存储至所述领域对象模型库中,所述领域对象模型库中的一行数据为ー个领域对象的信息。接收模块701,用于接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型。加载模块903,用于加载所述领域对象模型库。參考图12所示,在实际应用中,所述加载模块903具体可以包括第三获取子模块1201,用于从所述领域对象模型库中获取单条数据,所述单条数据包括领域对象的完整路径、类型及其初始值;创建子模块1202,用于依据所述领域对象的完整路径通过反射调用无參构造方法,以创建所述领域对象的实例;
赋值子模块1203,用于依据所述类型及其初始值调用属性的赋值方法对所述类型进行赋值;保存子模块1204,用于将所述领域对象的完整路径和所述赋值后的领域对象的实例作为映射关系对保存至内存中。查找模块702,用于依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类。生成模块703,用于按照所述领域对象和/或Mock类生成所述被测方法的测试方法。测试模块704,用于按照所述测试方法对所述原始类进行単元测试。在本实施例中,因为预先将领域对象模型库加载到内存中,这样在查找领域对象 的时候,就可以直接从内存中进行查找,从而能够提高单元测试的效率,并且节省大量的人力物カ资源。本实施例所述的装置可以集成到第三方交易平台的服务器上,也可以单独作为ー个实体与第三方交易平台的服务器相连,另外,需要说明的是,当本申请所述的方法采用软件实现时,可以作为第三方交易平台的服务器新增的ー个功能,也可以单独编写相应的程序,本申请不限定所述方法或装置的实现方式。需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相參见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处參见方法实施例的部分说明即可。最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另ー个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。以上对本申请所提供的一种单元测试的方法和装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
权利要求
1.一种单元测试的方法,其特征在于,该方法包括 接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型; 依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类; 使用所述领域对象和/或Mock类生成所述被测方法的测试方法; 按照所述测试方法对所述原始类进行単元测试。
2.根据权利要求I所述的方法,其特征在于,还包括针对所述被测方法的源代码进行静态分析,以生成Mock库的步骤,具体为 获取待测试源代码中各个需要被Mock的原始类; 通过反射获得所述各个原始类的类中被测方法的參数,所述类參数包括被测方法名称、參数类型和返回值类型; 依据所述类參数生成所述原始类对应的各个Mock类; 将所述各个Mock类组成的集合作为Mock库。
3.根据权利要求I所述的方法,其特征在于,还包括构建领域对象模型库的步骤,具体为 获取待测试源代码中被引用的领域对象; 按照所述被引用的领域对象之间的引用关系对其进行排序; 通过反射获取所述被引用的领域对象的属性信息,所述属性信息包括类型及其名称,所述类型包括基本类型和复杂类型; 将所述属性信息和被引用的领域对象的完整路径按照引用关系顺序存储至所述领域对象模型库中,所述领域对象模型库中的一行数据为ー个领域对象的信息。
4.根据权利要求3所述的方法,其特征在干,还包括加载所述领域对象模型库的步骤,具体为 从所述领域对象模型库中获取单条数据,所述单条数据包括领域对象的完整路径及其初始值; 依据所述领域对象的完整路径通过反射调用无參构造方法,以创建所述领域对象的实例; 依据所述类型及其初始值调用属性的赋值方法对所述类型进行赋值; 将所述领域对象的完整路径和所述赋值后的领域对象的实例作为映射关系对保存至内存中。
5.根据权利要求I所述的方法,其特征在于,所述按照所述领域对象和/或Mock类生成所述被测方法的测试方法,包括 获取所述被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的參数和返回值类型; 根据所述引用类的类型生成测试方法的方法头; 根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表; 遍历所述引用类列表,以生成模拟引用类对象行为的代码; 从所述领域对象模型库中获取所述引用类的方法參数值,以生成测试方法的方法体;将固定的方法尾、所述方法头以及方法体组成所述测试方法。
6.一种单元测试的装置,其特征在于,该装置包括 接收模块,用于接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型; 查找模块,用于依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类; 生成模块,用于使用所述领域对象和/或Mock类生成所述被测方法的测试方法; 测试模块,用于按照所述测试方法对所述原始类进行単元测试。
7.根据权利要求6所述的装置,其特征在于,还包括生成Mock库模块,具体包括 第一获取子模块,用于获取待测试源代码中各个需要被Mock的原始类; 第一反射子模块,用于通过反射获得所述各个原始类的类中被测方法的參数,所述类參数包括被测方法名称、參数类型和返回值类型; 第一生成子模块,用于依据所述类參数生成所述原始类对应的各个Mock类; 组合子模块,用于将所述各个Mock类组成的集合作为Mock库。
8.根据权利要求7所述的装置,其特征在于,还包括构建模块,所述构建模块具体包括 第二获取子模块,用于获取待测试源代码中被引用的领域对象; 排序子模块,用于按照所述被引用的领域对象之间的引用关系对其进行排序; 第二反射子模块,用于通过反射获取所述被引用的领域对象的属性信息,所述属性信息包括类型及其名称,所述类型包括基本类型和复杂类型; 存储子模块,用于将所述属性信息和被引用的领域对象的完整路径按照引用关系顺序存储至所述领域对象模型库中,所述领域对象模型库中的一行数据为ー个领域对象的信息。
9.根据权利要求8所述的装置,其特征在于,还包括加载模块,所述加载模块具体包括 第三获取子模块,用于从所述领域对象模型库中获取单条数据,所述单条数据包括领域对象的完整路径及其初始值; 创建子模块,用于依据所述领域对象的完整路径通过反射调用无參构造方法,以创建所述领域对象的实例; 赋值子模块,用于依据所述类型及其初始值调用属性的赋值方法对所述类型进行赋值; 保存子模块,用于将所述领域对象的完整路径和所述赋值后的领域对象的实例作为映射关系对保存至内存中。
10.根据权利要求6所述的装置,其特征在于,所述生成模块包括 第四获取子模块,用于获取所述被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的參数和返回值类型; 第二生成子模块,用于根据所述引用类的类型生成测试方法的方法头; 第三生成子模块,用于根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表;遍历子模块,用于遍历所述引用类列表,以生成模拟引用类对象行为的代码; 第四生成子模块,用于从所述领域对象模型库中获取所述引用类的方法參数值,以生成测试方法的方法体; 组成子模块,用于将固定的方法尾、所述方法头以及方法体组成所述测试方法。
全文摘要
本发明提供了一种单元测试的方法及装置,所述方法包括接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型;依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类;使用所述领域对象和/或Mock类生成所述被测方法的测试方法;按照所述测试方法对所述原始类进行单元测试。本发明实施例可以解决现有技术中单元测试的效率低下以及可维护性较差的问题。
文档编号G06F11/36GK102855177SQ20111018107
公开日2013年1月2日 申请日期2011年6月30日 优先权日2011年6月30日
发明者冯照临, 刘中胜 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1