一种单元测试代码生成方法及装置的制作方法

文档序号:6362880阅读:174来源:国知局
专利名称:一种单元测试代码生成方法及装置的制作方法
技术领域
本发明涉及单元测试技术,尤其涉及一种单元测试代码生成方法及装置。
背景技术
单元测试是集中对源代码实现的每一个程序单元进行测试,检测各个程序单元否正确地实现了规定的功能,以及检查各程序模块的返回值是否正确。单元测试检测每一个控制结构的分支以确保完全覆盖和最大可能的错误检查。JUnit单元测试代码则是指按一定规范进行编写的单元测试代码,对应的JUnit测试工具需要根据该JUnit单元测试代码, 才能统计出覆盖率、正确性、数据校验等信息。单元测试是为了尽可能多的发现程序的错误。而发现错误,是为了修正错误,是需要对程序代码进行修改的。每当程序代码被修改的时候,程序配置的某些方面,例如文档或者数据,也会被修改。目前,当程序员编写完项目代码后,需要在源代码中手动添加单元测试代码来检验源代码的正确性。这种方法需要修改大量的程序代码,从而工作量大,耗时、重复性工作很大,从而使得编码效率较低。

发明内容
本发明实施例所要解决的技术问题在于,提供一种单元测试代码生成方法及装置,能够自动生成模版化的单元测试代码,降低程序员编写代码的工作量,提高了工作效率。为了解决上述技术问题,本发明实施例提供了一种单元测试代码生成方法,包括
导入源代码集,所述源代码集包括至少一个源代码文件;
根据所述源代码集的目录规则,依次获取各个源代码文件所包含的操作单元,以及与该操作单元对应的参数属性;
当每获取一个源代码文件的操作单元以及对应的参数属性后,获取预先定义的配置文件中的单元测试代码编写规则;并根据所述单元测试代码编写规则和所述源代码文件的操作单元和对应的参数属性,生成对应的单元测试代码。其中,所述源代码文件为Java文件,所述单元测试代码编写规则为JUnit单元测试代码编写规则。其中,所述根据所述单元测试代码编写规则和所述源代码文件的操作单元和对应的参数属性,生成对应的单元测试代码的步骤,具体包括
根据所述源代码文件的目录结构,生成对应目录以及该目录下的空白目标文件;
根据所述单元测试代码编写规则和所述源代码文件的操作单元和对应的参数属性,在所述空白的目标文件中生成单元测试代码。其中,所述依次获取各个源代码文件所包含的操作单元,以及与操作单元对应的参数属性具体包括
依次分析各个所述源代码文件的结构,并根据Java语言反射机制对所述源代码文件从上至下进行解释,得到所述源代码文件的多个操作单元,以及与每一个操作单元对应的参数属性。其中,所述操作单元对应的参数属性包括输入参数、参数类型及返回值。其中,所述JUnit单元测试代码编写规则包括类名后置名词为“Test”;操作单元名的前置名词为“test” ;对应于该操作单元的测试函数无返回值。本发明还提供了一种单元测试代码生成装置,包括
源代码集导入模块,用于导入源代码集,所述源代码集包括至少一个源代码文件;
源代码文件属性获取模块,用于根据所述源代码集的目录规则,依次获取各个所述源代码文件的操作单元,以及对应于所述操作单元的参数属性;
代码编写规则获取模块,用于在所述源代码文件属性获取模块每获取到一个源代码文件的操作单元和对应的参数属性时,获取预先定义的配置文件中的单元测试代码编写规则;
代码自动生成模块,用于根据所述源代码文件的操作单元、参数属性和所述单元测试代码编写规则,生成对应的单元测试代码。其中,所述源代码文件为Java文件,所述单元测试代码编写规则为JUnit单元测试代码编写规则。其中,所述代码自动生成模块包括
文件生成子模块,用于根据所述源代码文件的目录结构,生成对应目录以及该目录下的空白目标文件;
代码生成子模块,用于根据所述单元测试代码编写规则和所述源代码文件的操作单元和对应的参数属性,在所述空白的目标文件中生成单元测试代码。其中,所述源代码文件属性获取模块包括
结构分析子模块,用于分析所述源代码文件的结构;
属性获取子模块,用于根据Java语言反射机制对所述源代码文件从上至下进行解释, 得到所述源代码文件的多个操作单元,以及每一个操作单元的参数属性。实施本发明实施例,具有如下有益效果
本发明的单元测试代码生成方法通过从预先定义的配置文件中获取单元测试代码编写规则,再结合所获取的源代码文件的操作单元和对应的参数属性,自动生成对应于该源代码文件的单元测试代码,使得当需要进行测试时,可直接将该单元测试代码在JUnit软件中执行即可,从而不需要程序员手动来编写单元测试代码,使得程序员只需根据方法的实际要求,修改参数即可,进而降低了程序员的工作量;并且通过本发明实施例的方法及装置生成的代码,用JUnit软件统计覆盖正确性能够达到20%左右,剩下的代码自行做出小的参数修改就能正确执行。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图I是本发明的单元测试代码生成方法的一实施例的流程图2是本发明的单元测试代码生成方法的一实施例中的配置文件的示意图3是本发明的单元测试代码生成方法的一实施例中源代码的示意图4是本发明的单元测试代码生成方法的一实施例中生成的单元测试代码的示意图; 图5是本发明的单元测试代码生成装置的一实施例的功能模块图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。参见图1,为本发明的单元测试代码生成方法的一实施例的流程图。具体实施时, 本发明实施例的单元测试代码生成方法包括
S101,导入源代码集,该源代码集包括至少一个源代码文件。具体实施时,首先在JUnit软件中,创建一个项目工程,其次再将由多个源代码文件组成的源代码集导入该项目工程内。在一具体实施例中,该源代码文件为Java文件。S102,根据源代码集的目录规则,依次获取各个源代码文件的操作单元以及与该操作单元对应的参数属性。具体实施时,由于被测试的源代码集包括多个源代码文件,即该源代码集所在子目录中包括了多个源代码文件,从而可根据该子目录中个存储的源代码文件的顺序依次获取各个源代码文件的多个操作单元以及与操作单元对应的参数属性。本实施例中“依次获取”是指获取到一个源代码文件的操作单元和对应的参数属性,并结合获取的单元测试代码编写规则生成对应该源代码文件的单元测试代码后,递归到该源代码文件所在子目录, 再获取下一个源代码文件的操作单元和对应的参数属性,并结合再次获取的单元测试代码编写规则生成对应该下一个源代码文件的单元测试代码,直至生成对应于所有源代码文件的单元测试代码。本实施例中的“目录规则”可以是实验员根据项目需要进行设定的各个源代码文件排列顺序,也可以是按照各个源代码文件的大小、修改时间等排列的顺序。具体实施时,获取各个源代码文件的操作单元以及与该操作单元对应的参数属性时,需要分析该源代码文件的结构,并利用Java语言的反射机制自对该源代码文件从上至下进行解释,得到该源代码文件包括的多个操作单元,以及每个操作单元的输入参数、参数类型、返回值等参数属性。本实施例中各该源代码文件的操作单元是指该源代码文件中实现一个功能的一段程序单元,参数属性是指该程序单元包括的输入参数/参数类型/返回值等,例如,一个源代码文件中包括实现“加法”功能的一个程序单元,且该程序单元包括类型为整数的输入参数,并返回相加的结果,其中,该实现“加法”的程序单元即为操作单元。而由多个操作单元组成的集合为类,其对应的参数属性即为类属性,例如一个人为一个类,则该类的参数属性包括高度、年龄等类属性,而这个人执行的“打电话”、“跑步”等操作即为一个操作单元 (或者方法)。S103,每当获取一个源代码文件的操作单元和对应的参数属性后,获取预先定义的配置文件中的单元测试代码编写规则。具体实施时,需要预先定义配置文件,该配置文件包括JUnit单元测试代码编写规则,即在步骤SlOl之前,需要预先定义配置文件,即将在 JUnit软件中进行单元测试代码编写的规则统一归纳到该配置文件中;然后获取该单元测试代码编写规则时再加载该配置文件,并获取其中的JUnit单元测试代码编写规则。在一具体实施例中,该JUnit单元测试代码编写规则包括
类名的后置名词为“Test”;
创建测试函数声明;具体实施时,创建测试函数声明包括操作单元名的前置名词为 “test”,即为操作单元名添加前置名词“test”,从而构成测试该操作单元的测试函数的函数名,参见图2,该编写规则在配置文件中如下“〈method_suffix>test〈/method_suffix> < !-测试函数前缀一>”,或者测试函数的后置名词为“test”;对应该操作单元的测试函数无返回值、无输入参数,即测试函数必须声明为“void”;在另一具体实施例中,还可包括在测试函数的上一行增加“Otest”,参见图2中的“<method_JPA>@Test〈/method_JPA>” ; 预定义源代码文件中的操作单元的输入参数和预期结果,并调用源代码文件中的操作单元。本发明实施例中的“预定义”是指源代码文件的操作单元的输入参数类型的默认值, 即Java中基本数据类型默认值。本实施例中Java的基本数据类型默认值为 short: O; int: O; long:0 ; float: O. O ; double: 0.0; char: (int) char=0 ; String:null ;
boolean: false ; Java中对象引用默认值为null。本实施例中的预期结果也为自定义默认值,即需要预先自定义一个该源代码文件操作单元的返回值,即预期结果,从而通过比较所调用源代码文件的操作单元后实际返回的结果,与该自定义预期结果是否一致,以验证实际的源代码文件中操作单元的执行结果的正确性。本实施例中测试函数的内部实现代码实际上是调用源代码文件中的操作单元,而调用源代码文件中的操作单元时,需要传入的参数是自定义默认值;并且需要预先自定义预期结果,从而通过比较所调用源代码文件的操作单元后返回的结果,与测试前自定义预期结果是否一致,以验证实际的源代码文件中操作单元的执行结果的正确性。S104,根据单元测试代码编写规则和源代码文件的操作单元和对应的参数属性, 生成对应的单元测试代码。具体实施时,该步骤S104包括
根据该源代码文件的目录结构生成对应的目录以及该目录下的空白目标文件,且该空白目标文件的文件名后置名词为“Test”。在一具体实施例中,首先分析该源代码文件的目录结构,得到该源代码文件的目录结构d /com/coship/ngod/a7/foldercontents/dao/ impl/GetFolderContentsDaoImpl. java,根据该目录结构生成对应的目录及该目录下的空白目标文件,该目标文件的目录结构为
d : / com/coship/ngod/a 7/foldercontents/dao/impl/ GetFoIderContentsDaoImpITest. java ;并且该目标文件的后置名词为“Test”,即在被测试源代码文件文件名的后面加上“Test ”。
根据单元测试代码编写规则和源代码文件的操作单元和对应的参数属性,在空白的源代码文件中生成对应的单元测试代码。参见图3和图4,分别为本发明实施例的部分 Java源代码和生成的对应的单元测试代码。其中,在被测试的Java源代码文件的操作单元的名称“getNGODAssetByAssetFileldO ”前添加“test”,从而构成测试函数的函数名,用于与被测试的该操作单元名称相区分;同时在该测试函数名上一行添加了 “OTest”,用于声明以下内容为测试函数,并且将该测试函数声明为“void”,即该测试函数无返回值、无输入参数;“getNGODAssetByAssetFileId(assetFileId) ”为调用源代码文件的一个操作单元,其输入参数assetFileld自定义默认为O ;assertNotNull O为预定义结果不为空。当 JUint软件执行该生成的单元测试代码时,比较是否该源代码文件的该操作单元的执行结果Integer是否为空,若不为空,即与预期结果相同,则该源代码文件的该操作单元“getNG ODAssetByAssetFileId(assetFileld) ” 正确。本发明的单元测试代码生成方法通过每获取一个源代码文件的参数属性以及操作单元时,再从该配置文件中获取单元测试代码编写规则,并结合这三者自动生成对应于该源代码文件的单元测试代码,再递归到该源代码文件所在子目录,即源代码集目录下,获取下一个源代码文件的操作单元以及对应的参数属性,同时再次获取单元测试代码编写规则,并结合三者自动生成对应单元测试代码,直至生成对应于所述源代码文件的单元测试代码为止。本发明实施例的单元测试代码生成方法通过结合配置文件中的单元测试代码编写规则,以及源代码文件的操作单元和对应的参数属性来自动生成模板化的单元测试代码,使得当需要进行测试时,可直接将该生成的单元测试代码在JUnit软件中执行即可,从而不需要程序员手动来编写单元测试代码,使得程序员只需根据方法的实际要求,修改参数即可,进而降低了程序员的工作量;并且通过本发明实施例的方法生成的代码,用JUnit 软件统计覆盖正确性能够达到20%左右,剩下的代码自行做出小的参数修改就能正确执行。基于上述的单元测试代码生成方法,本发明还提供了一种单元测试代码生成装置,下面结合附图对本发明实施例的单元测试代码生成系统进行详细的说明。参见图5,为本发明的单元测试代码生成装置的一实施例的功能模块图。具体实施时,本发明实施例的单元测试代码生成装置包括
被测试集导入模块11,用于导入源代码集,该源代码集包括至少一个源代码文件;在一具体实施例中,源代码文件为Java文件;
源代码文件属性获取模块12,用于根据所述源代码集的目录规则,依次获取各个源代码文件的操作单元以及对应的参数属性;具体实施时,该源代码文件属性获取模块12获取到一个源代码文件的操作单元和对应的参数属性后,等待生成对应的单元测试代码,当生成对应于该源代码文件的单元测试代码后,该源代码文件属性获取模块12采用递归的方式递归到该源代码文件所在子目录,再顺序获取下一个源代码文件的操作单元和对应的参数属性直至生成对应于该子目录下所有源代码文件的单元测试代码;具体实施时,该源代码属性获取模块包括
结构分析子模块,用于分析源代码文件的结构;
属性获取子模块,用于根据Java语言反射机制对源代码文件从上至下进行解释,得到该源代码文件的多个操作单元,以及每个操作单元的输入参数、参数类型和返回值等参数
8属性;
代码编写规则获取模块13,用于在源代码文件属性获取模块每获取到一个源代码文件的操作单元以及对应的参数属性时,获取该预先定义的配置文件中的单元测试代码编写规则;在一具体实施例中,该单元测试代码编写规则为JUnit单元测试代码编写规则;
代码自动生成模块14,用于根据源代码文件的操作单元、参数属性和单元测试代码编写规则,生成对应的单元测试代码。具体实施时,本发明实施例的该代码自动生成模块14 包括
文件生成子模块,用于根据源代码文件的目录结构,生成对应的目录及该目录下的空白目标文件;在一具体实施例中,生成的该空白目标文件的文件名名称也采用对应的被测试源代码文件名称;
代码生成子模块,用于根据单元测试代码编写规则和源代码文件的操作单元以及对应的参数属性,在该空白的目标文件中生成单元测试代码。在另一具体实施例中,本发明实施例的单元测试代码生成装置还包括配置文件模块,用于预先定义配置文件,该配置文件包含JUnit单元测试代码编写规则;在一具体实施例中,该JUnit单元测试代码编写规则包括
类名后置名词为“Test”;
创建测试函数声明;具体实施时,创建测试函数声明包括测试函数无返回值、无输入参数,即测试函数必须声明为“void”,即无返回值;操作单元名的前置名词为“test” ;在另一具体实施例中,还可包括在测试函数的上一行增加“Otest” ;
预定义源代码文件中的操作单元的输入参数和预期结果,并调用源代码文件中的操作单元。本实施例中“预定义”是指源代码文件的操作单元的输入参数类型的默认值,即Java 中基本数据类型默认值。Java的基本数据类型默认值为
short: O;int: O;long:0 ;float: 0.0;double: 0.0;
char: (int)char=0; String:null ; boolean: false ; 并且Java中对象引用默认值为null。本实施例中测试函数的内部实现代码实际上是调用源代码文件中的操作单元,而调用源代码文件中的操作单元时,需要传入的参数是自定义默认值;
预期结果也为自定义默认值,即需要预先自定义该源代码文件操作单元的返回值,即预期结果,从而通过比较所调用源代码文件的操作单元后返回的结果,与该自定义预期结果是否一致,以验证实际的源代码文件中操作单元的执行结果的正确性。本发明实施例的单元测试代码生成装置通过代码编写规则获取模块从配置文件中获取单元测试代码编写规则,以及由源代码文件属性获取模块获取的源代码文件的操作单元和对应的参数属性,再由代码自动生成模块结合单元测试代码编写规则和源代码文件的操作单元和参数属性来自动生成对应于该源代码文件的单元测试代码,从而当需要进行测试时,可直接将该单元测试代码在JUnit软件中执行即可,不需要程序员手动来编写单元测试代码,使得程序员只需根据方法的实际要求,修改参数即可,进而降低了程序员的工作量;并且通过本发明实施例的方法及装置生成的代码,用JUnit软件统计覆盖正确性能够达到20%左右,剩下的代码自行做出小的参数修改就能正确执行。以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于发明所涵盖的范围。
权利要求
1.一种单元测试代码生成方法,其特征在于,包括导入源代码集,所述源代码集包括至少一个源代码文件;根据所述源代码集的目录规则,依次获取各个源代码文件所包含的操作单元,以及与该操作单元对应的参数属性;当每获取一个源代码文件的操作单元以及对应的参数属性后,获取预先定义的配置文件中的单元测试代码编写规则;并根据所述单元测试代码编写规则和所述源代码文件的操作单元和该操作单元对应的参数属性,生成对应的单元测试代码。
2.如权利要求I所述的单元测试代码生成方法,其特征在于,所述源代码文件为Java 文件,所述单元测试代码编写规则为JUnit单元测试代码编写规则。
3.如权利要求I所述的单元测试代码生成方法,其特征在于,所述根据所述单元测试代码编写规则和所述源代码文件的操作单元和该操作单元对应的参数属性,生成对应的单元测试代码的步骤,具体包括根据所述源代码文件的目录结构,生成对应目录及该目录下的空白目标文件;根据所述单元测试代码编写规则和所述源代码文件的操作单元和对应的参数属性,在所述空白的目标文件中生成单元测试代码。
4.如权利要求2所述的单元测试代码生成方法,其特征在于,所述依次获取各个源代码文件所包含的操作单元,以及与该操作单元对应的参数属性具体包括依次分析各个所述源代码文件的结构,并根据Java语言反射机制对所述源代码文件从上至下进行解释,得到所述源代码文件的多个操作单元,以及与每一个操作单元对应的参数属性。
5.如权利要求4所述的单元测试代码生成方法,其特征在于,所述操作单元对应的参数属性包括输入参数、参数类型及返回值。
6.如权利要求2或4或5所述的单元测试代码生成方法,其特征在于,所述JUnit单元测试代码编写规则包括类名后置名词为“Test” ;操作单元名的前置名词为“test” ;对应于该操作单元的测试函数无返回值。
7.—种单元测试代码生成装置,其特征在于,包括源代码集导入模块,用于导入源代码集,所述源代码集包括至少一个源代码文件;源代码文件属性获取模块,用于根据所述源代码集的目录规则,依次获取各个所述源代码文件的操作单元,以及对应于所述操作单元的参数属性;代码编写规则获取模块,用于在所述源代码文件属性获取模块每获取到一个源代码文件的操作单元和对应的参数属性时,获取预先定义的配置文件中的单元测试代码编写规则;代码自动生成模块,用于根据所述源代码文件的操作单元、参数属性和所述单元测试代码编写规则,生成对应的单元测试代码。
8.如权利要求7所述的单元测试代码生成装置,其特征在于,所述源代码文件为Java 文件,所述单元测试代码编写规则为JUnit单元测试代码编写规则。
9.如权利要求7所述的单元测试代码生成装置,其特征在于,所述代码自动生成模块包括文件生成子模块,用于根据所述源代码文件的目录结构,生成对应目录以及该目录下的空白目标文件;代码生成子模块,用于根据所述单元测试代码编写规则和所述源代码文件的操作单元和对应的参数属性,在所述空白的目标文件中生成单元测试代码。
10.如权利要求8所述的单元测试代码生成装置,其特征在于,所述源代码文件属性获取模块包括结构分析子模块,用于分析所述源代码文件的结构;属性获取子模块,用于根据Java语言反射机制对所述源代码文件从上至下进行解释, 得到所述源代码文件的多个操作单元,以及每一个操作单元的参数属性。
全文摘要
本发明公开了一种单元测试代码生成方法及装置。本发明实施例的单元测试代码生成方法通过获取源代码文件的操作单元和对应的参数属性,并获取配置文件中的单元测试代码编写规则,再结合这三者自动生成对应于该源代码文件的单元测试代码,使得当需要进行测试时,可直接将生成的该单元测试代码在JUnit软件中执行即可,从而不需要程序员手动来编写单元测试代码,使得程序员只需根据方法的实际要求,修改参数即可,进而降低了程序员的工作量;并且通过本发明实施例的方法及装置生成的代码,用JUnit软件统计覆盖正确性能够达到20%左右,剩下的代码自行做出小的参数修改就能正确执行。
文档编号G06F11/36GK102591777SQ20121000544
公开日2012年7月18日 申请日期2012年1月10日 优先权日2012年1月10日
发明者何振飞, 邓勇 申请人:深圳市同洲视讯传媒有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1