本发明涉及单元测试技术领域,特别涉及一种单元测试代码自动生成方法及装置。
背景技术
单元测试(unittesting),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
在编程人员进行系统开发的过程中,开发人员需要对编写的代码进行单元测试代码的编写,以测试开发代码的有效性及鲁棒性。而往往,在一个项目中会存在大量功能及结构相仿的代码。当针对该类代码进行测试样例编写时,由于工作量大,耗时多,重复性工作很大,会占用开发人员的大量精力,从而使得编码效率较低。
而且传统的人工编写单元测试代码时,容易在类命名、包路径以及方法名称、变量名称、变量类型的使用上出现不规范,导致出现编写出的单元测试代码疏漏及错误。
技术实现要素:
为了解决上述背景技术中提及的一个或多个现有技术的问题,本发明实施例提供了一种单元测试代码自动生成方法及装置,以克服传统人工编写单元测试代码导致的编码效率较低、代码容易出现疏漏及错误等问题。
为解决上述技术问题,本发明采用的技术方案是:
一方面,本发明实施例公开了一种单元测试代码自动生成方法,所述方法包括如下步骤:
s1:导入源代码文件,所述源代码文件包括至少一个功能模块的代码;
s2:读取并解析所述源代码文件,获取所述源代码文件对应的元数据信息和逻辑代码,将不同的元数据信息分别存储在不同的集合中;
s3:根据预先定义的单元测试代码生成规则以及所述元数据信息和逻辑代码,自动生成对应的单元测试代码;
其中,所述解析源代码文件的步骤包括:
将文本切分为字符串数组逐行进行解析,采用正则表达式匹配出所述源代码文件对应的元数据信息和逻辑代码。
进一步的,所述解析源代码文件的步骤具体包括:
将文本切分为字符串数组逐行进行解析采用正则表达式匹配出所述源代码文件对应的元数据信息和逻辑代码,将不同的元数据信息分别存储在不同的集合中;
判断匹配出的所述元数据信息是否完整,若完整,则将所述元数据信息直接存储到相对应的集合中,若不完整,则进行细粒度解析,将不完整的元数据信息补充完整后存储到相对应的集合中;
将所述元数据信息中的类文本按类之间的相互关系,通过文本容器进行依赖关联。其中,文本容器中的存储单元是类为单位的,一个类中有存解析的方法、实例变量、导入包等等不同的集合,这些集合是类私有的,彼此的类之间是不直接共享这些集合的。文本容器在刷新类之间的相互关系时,会用到相对应的集合进行关联。
进一步的,所述解析源代码文件的步骤具体还包括:
以公共方法为单位对方法类文本进行正则表达式匹配解析,解析出需要mock的方法。
进一步的,所述解析源代码文件的步骤具体还包括:
将所述元数据信息中的类文本解析为内部对象definition,并存储到文本容器中。进一步的,所述判断匹配出的所述元数据信息是否完整的步骤具体包括:
分别按标志“{}”、“()”判断所述元数据信息是否完整,若“{}”或“()”是完整的,则对应的所述元数据信息是完整的,若“{}”或“()”是不完整的,则对应的所述元数据信息也是不完整的。
进一步的,,所述补充元数据信息具体包括:
分别按标志“{}”、“()”对所述不完整的元数据信息进行补充,将元数据信息对应的文本内容从字符“{”补充到字符“}”,或从字符“(”补充到字符“)”,使对应的元数据信息完整。
进一步的,所述自动生成对应的单元测试代码的步骤具体包括:
针对pojo实体类,解析出实例字段和方法,按所述解析出的方法进行输出。
进一步的,所述自动生成对应的单元测试代码的步骤具体还包括:
针对普通类和/或枚举类,以方法为单位进行匹配解析,对需要mock的方法进行mock模拟;
对需要mock的变量进行mock模拟;
在相关文本中查找mock参数和返回值。
另一方面,本发明实施例还公开了一种单元测试代码自动生成装置,所述装置包括:
源代码文件导入模块,用于导入源代码文件,所述源代码文件包括至少一个功能模块的代码:
文本解析模块,用于读取并解析导入的所述源代码文件,获取所述源代码文件对应的元数据信息和逻辑代码;
文本容器,用于存储内部对象definition,所述内部对象definition为所述元数据信息中的类文本解析出来的;
生成规则获取模块,用于获取所述源代码文件所对应的单元测试代码生成规则,所述单元测试代码生成规则在配置文件中是预先定义的;
代码自动生成模块,用于根据预先定义的单元测试代码生成规则以及所述元数据信息和逻辑代码,自动生成对应的单元测试代码。
日志记录模块,用于查看生成的单元测试代码文件。
进一步的,所述代码自动生成模块包括:
文件生成子模块,用于根据所述源代码文件的目录结构,生成对应目录以及该目录下的空白目标文件;
代码生成子模块,用于根据所预先定义的单元测试代码生成规则以及所述元数据信息和逻辑代码,在所述空白目标文件中自动生成对应的单元测试代码。
本发明实施例提供的技术方案带来的有益效果是:
1、本发明实施例公开的单元测试代码自动生成方法及装置,通过解析需要测试的源代码,自动生成相应的单元测试代码,大幅度的节约开发人员时间,提高开发人员工作效率。
2、本发明实施例公开的单元测试代码自动生成方法及装置,通过解析需要测试的源代码,自动生成相应的单元测试代码,比传统人工编写单元测试代码更加准确,在类命名、包路径以及方法名称、变量名称、变量类型的使用会更加规范,避免人工编写上的疏漏及错误。
3、本发明实施例公开的单元测试代码自动生成方法及装置,能够以项目为单位进行解析源代码和批量生成单元测试代码,从而能够整体的提升指定项目的开发测试进度,缩短项目的开发周期。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的单元测试代码自动生成方法流程图;
图2是本发明实施例提供的单元测试代码自动生成装置的模块示意图;
图3是本发明实施例提供的单元测试代码自动生成装置的用户界面示意图;
图4是本发明实施例提供的单元测试代码自动生成装置的软件架构图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面结合说明书附图对本发明作进一步阐述。
如图1所示,本发明实施例公开了一种单元测试代码自动生成方法,所述方法包括如下步骤:
s1:导入源代码文件,所述源代码文件包括至少一个功能模块的代码。
具体的,所述源代码文件可以是实现某一个功能的功能模块的代码,也可以是多个功能或结构相仿的功能模块的代码,也就是说本发明实施例提供的单元测试代码自动生成方法不仅适用于生成单个单元测试代码,而且适用于批量生成单元测试代码,大幅度的节约开发人员时间,提高开发人员工作效率。
s2:读取并解析所述源代码文件,获取所述源代码文件对应的元数据信息和逻辑代码,将不同的元数据信息分别存储在不同的集合中。
具体的,所述解析源代码文件的步骤具体包括:
将文本切分为字符串数组逐行进行解析,采用正则表达式匹配出所述源代码文件对应的元数据信息和逻辑代码,将不同的元数据信息分别存储在不同的集合中。其中,所述元数据信息包括包路径、导入包、类信息、内部类信息、构造器、公共方法、实例属性等信息。将不同的元数据信息分别存储在不同的集合中,可以方便区分各元数据信息所对应的内容,方便后续在生成单元测试文件时从这些集合中取用解析出的数据等。判断匹配出的所述元数据信息是否完整,若完整,则将所述元数据信息直接存储到相对应的集合中,若不完整,则进行细粒度解析,将不完整的元数据信息补充完整后存储到相对应的集合中。
进一步的,所述判断匹配出的所述元数据信息是否完整的步骤具体包括:
分别按标志“{}”、“()”判断所述元数据信息是否完整,若“{}”或“()”是完整的,则对应的所述元数据信息是完整的,若“{}”或“()”是不完整的,则对应的所述元数据信息也是不完整的。
具体的,按标志“{}”判断所述元数据信息是否完整的具体实施方式为:如果只查询到字符“{”或“}”,则表示对应的元数据信息不完整,如果字符“{”和“}”都查询到,则表示对应的元数据信息是完整的。同样的,按标志“()”判断所述元数据信息是否完整的具体实施方式为:如果只查询到字符“(”或“)”,则表示对应的元数据信息不完整,如果字符“(”和“)”都查询到,则表示对应的元数据信息是完整的。
进一步的,所述补充元数据信息具体包括:
分别按标志“{}”、“()”对所述不完整的元数据信息进行补充,将元数据信息对应的文本内容从字符“{”补充到字符“}”,或从字符“(”补充到字符“)”,使对应的元数据信息完整。
具体的,按标志“{}”进行细粒度解析,取元数据信息中的主类、内部类、公共方法等信息的文本内容,按标志“()”进行细粒度解析,取元数据信息中的构造方法、公共方法等信息的文本内容。具体实施时,取元数据信息相对应集合中的文本内容中字符“{”到字符“}”的所有内容,或者取元数据信息相对应集合中的文本内容中字符“(”到字符“)”的所有内容,将对应的元数据信息补充完整。
以公共方法为单位对方法类文本进行正则表达式匹配解析,解析出需要mock的方法。具体的,需要mock的方法包括以service、dao、support、process、processor、impl等结尾的方法。
将所述元数据信息中的类文本解析为内部对象definition,并存储到文本容器中。
将所述元数据信息中的类文本按类之间的相互关系,通过所述文本容器进行依赖关联。
进一步的,所述类之间的相互关系至少包括:继承、接口和聚合。
具体的,按类的继承、接口、聚合等关系,通过所述文本容器及类文本的名称对类文本进行依赖关联,将类文本中引用的内容补充完整。
s3:根据预先定义的单元测试代码生成规则以及所述元数据信息和逻辑代码,自动生成对应的单元测试代码。
进一步的,所述自动生成对应的单元测试代码的步骤具体包括:
针对pojo实体类,解析出实例字段和方法,按所述解析出的方法(大部分为get/set方法)进行输出。
进一步的,所述自动生成对应的单元测试代码的步骤具体还包括:
针对普通类和/或枚举类,以方法为单位进行匹配解析,对需要mock的方法进行mock模拟。其中,需要mock的方法包括以service、dao、support、process、processor、impl等结尾的方法。
对需要mock的变量进行mock模拟。
具体的,需要mock的变量包括:以request、response、client、resultset、multipartfile、binder等结尾的变量。其中,常见的java基础类、集合类不需要进行mock模拟。
在相关文本中查找mock参数和返回值。其中,相关文本包括:方法行、方法体、类体、文本容器等。
具体的,对于mock参数和返回值,会依次在方法行、方法体、类体、文本容器等文本中查找,如果查找不到,会给出预先设置的默认的返回值。
进一步的,所述自动生成对应的单元测试代码的步骤具体还包括:
针对抽象类和/或接口类,不生成单元测试代码。
这边需要注意的是,单元测试代码的生成规则可通过正则表达式的修改而改变,对不同的单元测试框架进行针对性变化。
如图2和图3所示,本发明实施例公开了一种单元测试代码自动生成装置,所述单元测试代码自动生成装置使用了本发明实施例提供的单元测试代码自动生成方法。所述单元测试代码自动生成装置包括:
源代码文件导入模块,用于导入源代码文件,所述源代码文件包括至少一个功能模块的代码。所述源代码文件包括java文件。
文本解析模块,用于读取并解析导入的所述源代码文件,获取所述源代码文件对应的元数据信息和逻辑代码。
文本容器,用于存储内部对象definition,所述内部对象definition为所述元数据信息中的类文本解析出来的。
生成规则获取模块,用于获取所述源代码文件所对应的单元测试代码生成规则,所述单元测试代码生成规则在配置文件中是预先定义的。
代码自动生成模块,用于根据预先定义的单元测试代码生成规则以及所述元数据信息和逻辑代码,自动生成对应的单元测试代码。
日志记录模块,用于查看生成的单元测试代码文件。进一步的,所述代码自动生成模块包括:
文件生成子模块,用于根据所述源代码文件的目录结构,生成对应目录以及该目录下的空白目标文件。
代码生成子模块,用于根据所预先定义的单元测试代码生成规则以及所述元数据信息和逻辑代码,在所述空白目标文件中自动生成对应的单元测试代码。
进一步的,日志记录模块包括回滚单元,如果生成的单元测试代码文件存在错误,可以通过所述回滚单元,删除生成的单元测试代码文件。
具体的,所述源代码文件导入模块的输出端与文本解析模块的输入端相连接,所述文本解析模块的输出端与所述生成规则获取模块相连接,所述文本解析模块的输出端和所述生成规则获取模块的输出端均与所述代码自动生成模块的输入端相连接,所述代码自动生成模块与所述日志记录模块相连接。
如图4所示,本发明实施例公开的单元测试代码自动生成装置的软件架构包括:
视图部分(即用户界面),用于用户导入源代码文件以及显示生成的单元测试代码或者批量生成单元测试代码时的批量生成信息。发明实施例公开的单元测试代码自动生成工具的视图部分(即用户界面)通过swing开发工具包实现。
核心部分,其包括:
文本解析,用于读取并解析导入的所述源代码文件,获取所述源代码文件对应的元数据信息和逻辑代码。
容器缓存(即文本容器),用于存储解析后获得的所述源代码文件对应的元数据信息和逻辑代码,以及用于存储内部对象definition,所述内部对象definition为所述元数据信息中的类文本解析出来的。
单元测试生成,用于根据预先定义的单元测试代码生成规则以及所述元数据信息和逻辑代码,自动生成对应的单元测试代码。
基础部分,其包括:
批量文件读取工具,用于读取导入的批量源代码文件,即多个功能或结构相仿的功能模块的代码。
批量文件创建工具,用于创建批量的单元测试代码文件。
日志记录(回滚使用),用于查看生成的单元测试代码文件,如果生成的单元测试代码文件存在错误,可以通过“回滚”功能,删除生成的单元测试代码文件。
综上所述,本发明实施例提供的技术方案带来的有益效果是:
1、本发明实施例公开的单元测试代码自动生成方法及装置,通过解析需要测试的源代码,自动生成相应的单元测试代码,大幅度的节约开发人员时间,提高开发人员工作效率。
2、本发明实施例公开的单元测试代码自动生成方法及装置,通过解析需要测试的源代码,自动生成相应的单元测试代码,比传统人工编写单元测试代码更加准确,在类命名、包路径以及方法名称、变量名称、变量类型的使用会更加规范,避免人工编写上的疏漏及错误。
3、本发明实施例公开的单元测试代码自动生成方法及装置,能够以项目为单位进行解析源代码和批量生成单元测试代码,从而能够整体的提升指定项目的开发测试进度,缩短项目的开发周期。
需要说明的是:上述实施例提供的单元测试代码自动生成装置在触发生成单元测试代码业务时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将单元测试代码自动生成装置的软件结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的单元测试代码自动生成装置与单元测试代码自动生成方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。