CN102855177A - 一种单元测试的方法和装置 - Google Patents

一种单元测试的方法和装置 Download PDF

Info

Publication number
CN102855177A
CN102855177A CN2011101810765A CN201110181076A CN102855177A CN 102855177 A CN102855177 A CN 102855177A CN 2011101810765 A CN2011101810765 A CN 2011101810765A CN 201110181076 A CN201110181076 A CN 201110181076A CN 102855177 A CN102855177 A CN 102855177A
Authority
CN
China
Prior art keywords
domain object
type
class
mock
tested
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN2011101810765A
Other languages
English (en)
Other versions
CN102855177B (zh
Inventor
冯照临
刘中胜
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Advanced New Technologies Co Ltd
Original Assignee
Alibaba Group Holding Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201110181076.5A priority Critical patent/CN102855177B/zh
Publication of CN102855177A publication Critical patent/CN102855177A/zh
Priority to HK13102822.5A priority patent/HK1175554A1/zh
Application granted granted Critical
Publication of CN102855177B publication Critical patent/CN102855177B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Abstract

本发明提供了一种单元测试的方法及装置,所述方法包括:接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型;依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类;使用所述领域对象和/或Mock类生成所述被测方法的测试方法;按照所述测试方法对所述原始类进行单元测试。本发明实施例可以解决现有技术中单元测试的效率低下以及可维护性较差的问题。

Description

一种单元测试的方法和装置
技术领域
本申请涉及软件测试领域,特别涉及一种单元测试的方法和装置。
背景技术
单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试过程中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。因此,单元测试不仅仅是作为无错编码的一种辅助手段应用于一次性的开发过程,单元测试也必须是可重复的,无论是在软件修改过程中,还是移植到新的运行环境之后。而在单元测试过程中,对于某些不容易构造或者不容易获取的对象,可以采用创建一个虚拟的对象来进行测试的方式,这个虚拟的对象就称为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类完成单元测试,能够不再需要人工编写代码,提高单元测试的效率。因此,单元测试的程序代码的可维护性也较好。同时,在加载领域对象模型库的时候,将领域对象模型库放到内存中,可以从内存中直接获取,省去了人工编写的工作量。当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本申请的一种单元测试的方法实施例1的流程图;
图2是在方法实施例1中步骤103的流程图;
图3是本申请的一种单元测试的方法实施例2的流程图;
图4是方法实施例2中步骤301的流程图;
图5是方法实施例2中步骤302的流程图;
图6是方法实施例2中步骤304的流程图;
图7是本申请的一种单元测试的装置实施例1的结构框图;
图8是装置实施例1中生成模块703的结构框图;
图9是本申请的一种单元测试的装置实施例2的结构框图;
图10是装置实施例2中生成Mock库模块901的结构框图;
图11是装置实施例2中构建模块902的结构框图;
图12是装置实施例2中加载模块903的结构框图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请可用于众多通用或专用的计算装置环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器装置、包括以上任何装置或设备的分布式计算环境等等。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本申请的主要思想之一可以包括,通过直接从预先生成的领域对象模型库获取相关的领域对象,以及从预先生成的Mock库中获取对应的Mock类,从而可以在进行单元测试的时候,能够不再需要人工编写代码,提高单元测试的效率,并且,因为不再需要人工编写代码,因此,单元测试的程序代码的可维护性也较好。另外,单元测试的代码通过本申请实施例的方案自动生成,生成的代码再运行时,通过直接从预先生成的领域对象模型库获取相关的领域对象,以及调用预先生成的Mock库中获取对应的Mock类完成单元测试,能够不再需要人工编写代码,提高单元测试的效率。
参考图1,示出了本申请一种单元测试的方法实施例1的流程图,可以包括以下步骤:
步骤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:根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表。
根据引用类的类型及其调用的方法的返回值类型,生成一个引用类列表,其中,参考表1所示,第一列表示引用类的名称,第二列表示其所调用方法的返回值类型。
表1
  引用类   该引用类所调用的方法的返回值类型
  CcrCreditCardInfoDAO   ccrCreditCardInfoDO
  CcrCreditCardBankInfoDAO   List<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:按照所述测试方法对所述选择的原始类进行单元测试。
本实施例中与实施例1相同的步骤就不再赘述,参考实施例1中的详细记载即可。在本实施例中,因为预先将领域对象模型库加载到内存中,这样在查找领域对象的时候,就可以直接从内存中进行查找,从而能够提高单元测试的效率,并且节省大量的人力物力资源。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
与上述本申请一种单元测试的方法实施例1所提供的方法相对应,参见图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,用于按照所述测试方法对所述原始类进行单元测试。
在本实施例中,因为预先将领域对象模型库加载到内存中,这样在查找领域对象的时候,就可以直接从内存中进行查找,从而能够提高单元测试的效率,并且节省大量的人力物力资源。
本实施例所述的装置可以集成到第三方交易平台的服务器上,也可以单独作为一个实体与第三方交易平台的服务器相连,另外,需要说明的是,当本申请所述的方法采用软件实现时,可以作为第三方交易平台的服务器新增的一个功能,也可以单独编写相应的程序,本申请不限定所述方法或装置的实现方式。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本申请所提供的一种单元测试的方法和装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

Claims (10)

1.一种单元测试的方法,其特征在于,该方法包括:
接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型;
依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类;
使用所述领域对象和/或Mock类生成所述被测方法的测试方法;
按照所述测试方法对所述原始类进行单元测试。
2.根据权利要求1所述的方法,其特征在于,还包括:针对所述被测方法的源代码进行静态分析,以生成Mock库的步骤,具体为:
获取待测试源代码中各个需要被Mock的原始类;
通过反射获得所述各个原始类的类中被测方法的参数,所述类参数包括:被测方法名称、参数类型和返回值类型;
依据所述类参数生成所述原始类对应的各个Mock类;
将所述各个Mock类组成的集合作为Mock库。
3.根据权利要求1所述的方法,其特征在于,还包括:构建领域对象模型库的步骤,具体为:
获取待测试源代码中被引用的领域对象;
按照所述被引用的领域对象之间的引用关系对其进行排序;
通过反射获取所述被引用的领域对象的属性信息,所述属性信息包括:类型及其名称,所述类型包括基本类型和复杂类型;
将所述属性信息和被引用的领域对象的完整路径按照引用关系顺序存储至所述领域对象模型库中,所述领域对象模型库中的一行数据为一个领域对象的信息。
4.根据权利要求3所述的方法,其特征在于,还包括:加载所述领域对象模型库的步骤,具体为:
从所述领域对象模型库中获取单条数据,所述单条数据包括领域对象的完整路径及其初始值;
依据所述领域对象的完整路径通过反射调用无参构造方法,以创建所述领域对象的实例;
依据所述类型及其初始值调用属性的赋值方法对所述类型进行赋值;
将所述领域对象的完整路径和所述赋值后的领域对象的实例作为映射关系对保存至内存中。
5.根据权利要求1所述的方法,其特征在于,所述按照所述领域对象和/或Mock类生成所述被测方法的测试方法,包括:
获取所述被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的参数和返回值类型;
根据所述引用类的类型生成测试方法的方法头;
根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表;
遍历所述引用类列表,以生成模拟引用类对象行为的代码;
从所述领域对象模型库中获取所述引用类的方法参数值,以生成测试方法的方法体;
将固定的方法尾、所述方法头以及方法体组成所述测试方法。
6.一种单元测试的装置,其特征在于,该装置包括:
接收模块,用于接收输入的期望字段和测试值;所述期望字段为用户所选择的原始类中的被测方法的返回值类型或其属性的类型;
查找模块,用于依据所述被测方法从所述预先构建的领域对象模型库查找领域对象,和/或从预先生成的Mock库中查找Mock类;
生成模块,用于使用所述领域对象和/或Mock类生成所述被测方法的测试方法;
测试模块,用于按照所述测试方法对所述原始类进行单元测试。
7.根据权利要求6所述的装置,其特征在于,还包括:生成Mock库模块,具体包括:
第一获取子模块,用于获取待测试源代码中各个需要被Mock的原始类;
第一反射子模块,用于通过反射获得所述各个原始类的类中被测方法的参数,所述类参数包括:被测方法名称、参数类型和返回值类型;
第一生成子模块,用于依据所述类参数生成所述原始类对应的各个Mock类;
组合子模块,用于将所述各个Mock类组成的集合作为Mock库。
8.根据权利要求7所述的装置,其特征在于,还包括:构建模块,所述构建模块具体包括:
第二获取子模块,用于获取待测试源代码中被引用的领域对象;
排序子模块,用于按照所述被引用的领域对象之间的引用关系对其进行排序;
第二反射子模块,用于通过反射获取所述被引用的领域对象的属性信息,所述属性信息包括:类型及其名称,所述类型包括基本类型和复杂类型;
存储子模块,用于将所述属性信息和被引用的领域对象的完整路径按照引用关系顺序存储至所述领域对象模型库中,所述领域对象模型库中的一行数据为一个领域对象的信息。
9.根据权利要求8所述的装置,其特征在于,还包括:加载模块,所述加载模块具体包括:
第三获取子模块,用于从所述领域对象模型库中获取单条数据,所述单条数据包括领域对象的完整路径及其初始值;
创建子模块,用于依据所述领域对象的完整路径通过反射调用无参构造方法,以创建所述领域对象的实例;
赋值子模块,用于依据所述类型及其初始值调用属性的赋值方法对所述类型进行赋值;
保存子模块,用于将所述领域对象的完整路径和所述赋值后的领域对象的实例作为映射关系对保存至内存中。
10.根据权利要求6所述的装置,其特征在于,所述生成模块包括
第四获取子模块,用于获取所述被测方法所引用的原始类的引用类的类型,以及该引用类所调用的方法的参数和返回值类型;
第二生成子模块,用于根据所述引用类的类型生成测试方法的方法头;
第三生成子模块,用于根据所述引用类的类型及其所调用的方法的返回值类型生成引用类列表;
遍历子模块,用于遍历所述引用类列表,以生成模拟引用类对象行为的代码;
第四生成子模块,用于从所述领域对象模型库中获取所述引用类的方法参数值,以生成测试方法的方法体;
组成子模块,用于将固定的方法尾、所述方法头以及方法体组成所述测试方法。
CN201110181076.5A 2011-06-30 2011-06-30 一种单元测试的方法和装置 Expired - Fee Related CN102855177B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201110181076.5A CN102855177B (zh) 2011-06-30 2011-06-30 一种单元测试的方法和装置
HK13102822.5A HK1175554A1 (zh) 2011-06-30 2013-03-07 種單元測試的方法和裝置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201110181076.5A CN102855177B (zh) 2011-06-30 2011-06-30 一种单元测试的方法和装置

Publications (2)

Publication Number Publication Date
CN102855177A true CN102855177A (zh) 2013-01-02
CN102855177B CN102855177B (zh) 2015-08-26

Family

ID=47401781

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110181076.5A Expired - Fee Related CN102855177B (zh) 2011-06-30 2011-06-30 一种单元测试的方法和装置

Country Status (2)

Country Link
CN (1) CN102855177B (zh)
HK (1) HK1175554A1 (zh)

Cited By (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103593291A (zh) * 2013-11-18 2014-02-19 北京邮电大学 用于包括多个函数测试模块的单元测试方法及装置
CN105335281A (zh) * 2014-07-30 2016-02-17 阿里巴巴集团控股有限公司 一种自动mock外部依赖的方法及装置
WO2016201995A1 (zh) * 2015-06-16 2016-12-22 中兴通讯股份有限公司 实现构建测试对象的方法、装置及业务配置测试的装置
CN107301039A (zh) * 2016-04-15 2017-10-27 习得智交互软件开发公司 原型制作方法及其装置
CN107659455A (zh) * 2017-10-16 2018-02-02 武汉斗鱼网络科技有限公司 一种iOS端Mock数据的方法、存储介质、设备及系统
CN107784047A (zh) * 2016-11-14 2018-03-09 平安科技(深圳)有限公司 存储过程的实现方法及装置
CN107992425A (zh) * 2017-12-25 2018-05-04 携程旅游网络技术(上海)有限公司 单元测试Mock代码的自动生成方法及系统
CN108572911A (zh) * 2017-03-14 2018-09-25 北京京东尚科信息技术有限公司 自动化安全测试方法、装置、电子设备和可读存储介质
CN108694124A (zh) * 2018-06-19 2018-10-23 链家网(北京)科技有限公司 一种基于Mock的房产交易系统测试数据构造方法及系统
CN109739526A (zh) * 2017-10-30 2019-05-10 北京京东尚科信息技术有限公司 代码更新方法和装置
CN110688295A (zh) * 2018-07-06 2020-01-14 北京京东尚科信息技术有限公司 数据测试方法和装置
CN110737576A (zh) * 2018-07-20 2020-01-31 北京奇虎科技有限公司 对应用进行鲁棒性测试的方法和装置
CN110874322A (zh) * 2018-09-04 2020-03-10 阿里巴巴集团控股有限公司 一种用于应用程序的测试方法及测试服务器
CN111625442A (zh) * 2019-02-28 2020-09-04 顺丰科技有限公司 一种mock测试的方法和装置
CN112783759A (zh) * 2019-11-11 2021-05-11 腾讯科技(深圳)有限公司 白盒测试任务执行方法、装置、存储介质和计算机设备
US11010283B2 (en) 2016-11-08 2021-05-18 Microsoft Technology Licensing, Llc Mock-based unit test(s) for an end-to-end test of a code snippet
CN114265776A (zh) * 2021-12-22 2022-04-01 浙江时空道宇科技有限公司 单元测试代码生成方法、装置、设备、介质及程序产品

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101026503A (zh) * 2006-02-24 2007-08-29 国际商业机器公司 Web服务业务流程的单元测试的方法和设备
US20080256517A1 (en) * 2006-10-18 2008-10-16 International Business Machines Corporation Method and System for Automatically Generating Unit Test Cases Which Can Reproduce Runtime Problems

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101026503A (zh) * 2006-02-24 2007-08-29 国际商业机器公司 Web服务业务流程的单元测试的方法和设备
US20080256517A1 (en) * 2006-10-18 2008-10-16 International Business Machines Corporation Method and System for Automatically Generating Unit Test Cases Which Can Reproduce Runtime Problems

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
伍向前: "单元测试中mock技术的研究和创新", 《中国优秀硕士学位论文全文数据库信息科技辑》, no. 4, 15 April 2010 (2010-04-15), pages 9 - 20 *

Cited By (28)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103593291B (zh) * 2013-11-18 2016-03-09 北京邮电大学 用于包括多个函数测试模块的单元测试方法及装置
CN103593291A (zh) * 2013-11-18 2014-02-19 北京邮电大学 用于包括多个函数测试模块的单元测试方法及装置
CN105335281A (zh) * 2014-07-30 2016-02-17 阿里巴巴集团控股有限公司 一种自动mock外部依赖的方法及装置
CN105335281B (zh) * 2014-07-30 2018-03-20 阿里巴巴集团控股有限公司 一种自动mock外部依赖的方法及装置
CN106326088B (zh) * 2015-06-16 2021-03-23 中兴通讯股份有限公司 实现构建测试对象的方法、装置及业务配置测试的装置
WO2016201995A1 (zh) * 2015-06-16 2016-12-22 中兴通讯股份有限公司 实现构建测试对象的方法、装置及业务配置测试的装置
CN106326088A (zh) * 2015-06-16 2017-01-11 中兴通讯股份有限公司 实现构建测试对象的方法、装置及业务配置测试的装置
CN107301039A (zh) * 2016-04-15 2017-10-27 习得智交互软件开发公司 原型制作方法及其装置
US11010283B2 (en) 2016-11-08 2021-05-18 Microsoft Technology Licensing, Llc Mock-based unit test(s) for an end-to-end test of a code snippet
CN107784047A (zh) * 2016-11-14 2018-03-09 平安科技(深圳)有限公司 存储过程的实现方法及装置
CN107784047B (zh) * 2016-11-14 2020-09-11 平安科技(深圳)有限公司 存储过程的实现方法及装置
CN108572911A (zh) * 2017-03-14 2018-09-25 北京京东尚科信息技术有限公司 自动化安全测试方法、装置、电子设备和可读存储介质
CN107659455A (zh) * 2017-10-16 2018-02-02 武汉斗鱼网络科技有限公司 一种iOS端Mock数据的方法、存储介质、设备及系统
CN109739526A (zh) * 2017-10-30 2019-05-10 北京京东尚科信息技术有限公司 代码更新方法和装置
CN107992425B (zh) * 2017-12-25 2020-09-22 携程旅游网络技术(上海)有限公司 单元测试Mock代码的自动生成方法及系统
CN107992425A (zh) * 2017-12-25 2018-05-04 携程旅游网络技术(上海)有限公司 单元测试Mock代码的自动生成方法及系统
CN108694124A (zh) * 2018-06-19 2018-10-23 链家网(北京)科技有限公司 一种基于Mock的房产交易系统测试数据构造方法及系统
CN110688295A (zh) * 2018-07-06 2020-01-14 北京京东尚科信息技术有限公司 数据测试方法和装置
CN110737576A (zh) * 2018-07-20 2020-01-31 北京奇虎科技有限公司 对应用进行鲁棒性测试的方法和装置
CN110737576B (zh) * 2018-07-20 2023-02-17 北京奇虎科技有限公司 对应用进行鲁棒性测试的方法和装置
CN110874322A (zh) * 2018-09-04 2020-03-10 阿里巴巴集团控股有限公司 一种用于应用程序的测试方法及测试服务器
CN110874322B (zh) * 2018-09-04 2023-05-26 阿里巴巴集团控股有限公司 一种用于应用程序的测试方法及测试服务器
CN111625442A (zh) * 2019-02-28 2020-09-04 顺丰科技有限公司 一种mock测试的方法和装置
CN111625442B (zh) * 2019-02-28 2024-03-26 顺丰科技有限公司 一种mock测试的方法和装置
CN112783759A (zh) * 2019-11-11 2021-05-11 腾讯科技(深圳)有限公司 白盒测试任务执行方法、装置、存储介质和计算机设备
CN112783759B (zh) * 2019-11-11 2023-10-03 腾讯科技(深圳)有限公司 白盒测试任务执行方法、装置、存储介质和计算机设备
CN114265776A (zh) * 2021-12-22 2022-04-01 浙江时空道宇科技有限公司 单元测试代码生成方法、装置、设备、介质及程序产品
CN114265776B (zh) * 2021-12-22 2023-03-14 浙江时空道宇科技有限公司 单元测试代码生成方法、装置、设备、介质

Also Published As

Publication number Publication date
CN102855177B (zh) 2015-08-26
HK1175554A1 (zh) 2013-07-05

Similar Documents

Publication Publication Date Title
CN102855177B (zh) 一种单元测试的方法和装置
Greff et al. The Sacred Infrastructure for Computational Research.
AU2016216684B2 (en) Flow analysis instrumentation
Balci Requirements for model development environments
Le Traon et al. Efficient object-oriented integration and regression testing
CN102855178B (zh) 一种单元测试中生成Mock库的方法和装置
WO2018217745A1 (en) Automated dependency analyzer for heterogeneously programmed data processing system
CN110287097A (zh) 批量测试方法、装置及计算机可读存储介质
Benhamou et al. Trends in constraint programming
CN107644286A (zh) 工作流处理方法及装置
CN105808428A (zh) 一种对分布式文件系统进行统一性能测试的方法
Li et al. Dynamic symbolic database application testing.
CN101609473A (zh) 一种重构报表查询的结构化查询语言的方法及装置
Gurevich Abstract state machines: An overview of the project
CN107220171A (zh) 一种虚拟机的测试方法及装置
CN108089982A (zh) 测试方法、装置、电子设备及计算机可读存储介质
Hesse et al. Formal concept analysis used for software analysis and modelling
Guo et al. Pergo: an ontology towards model driven pervasive game development
Brahimi et al. More transparency in testing results: Towards an open collective knowledge base
Baloukas et al. Optimization methodology of dynamic data structures based on genetic algorithms for multimedia embedded systems
US11740875B2 (en) Type inference in dynamic languages
CN115248780A (zh) 接口测试用例的生成方法以及装置
CN104850494B (zh) 一种用于存储系统测试的方法与设备
CN113900956A (zh) 测试用例的生成方法、装置、计算机设备及存储介质
Burgueño et al. LinTraP: Primitive Operators for the Execution of Model Transformations with LinTra.

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 1175554

Country of ref document: HK

C14 Grant of patent or utility model
GR01 Patent grant
REG Reference to a national code

Ref country code: HK

Ref legal event code: GR

Ref document number: 1175554

Country of ref document: HK

TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20191216

Address after: P.O. Box 31119, grand exhibition hall, hibiscus street, 802 West Bay Road, Grand Cayman, British Cayman Islands

Patentee after: Innovative advanced technology Co.,Ltd.

Address before: Cayman Islands Grand Cayman capital building, a four storey No. 847 mailbox

Patentee before: ALIBABA GROUP HOLDING Ltd.

CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20150826