CN116126711A - 单元测试方法、装置及电子设备 - Google Patents
单元测试方法、装置及电子设备 Download PDFInfo
- Publication number
- CN116126711A CN116126711A CN202310071095.5A CN202310071095A CN116126711A CN 116126711 A CN116126711 A CN 116126711A CN 202310071095 A CN202310071095 A CN 202310071095A CN 116126711 A CN116126711 A CN 116126711A
- Authority
- CN
- China
- Prior art keywords
- class
- meta
- description file
- information description
- annotation
- 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.)
- Pending
Links
- 238000010998 test method Methods 0.000 title claims description 15
- 238000012360 testing method Methods 0.000 claims abstract description 139
- 238000000034 method Methods 0.000 claims abstract description 53
- 230000004048 modification Effects 0.000 claims description 5
- 238000012986 modification Methods 0.000 claims description 5
- 235000010627 Phaseolus vulgaris Nutrition 0.000 description 26
- 244000046052 Phaseolus vulgaris Species 0.000 description 26
- 230000008569 process Effects 0.000 description 13
- 238000012545 processing Methods 0.000 description 8
- 230000006870 function Effects 0.000 description 5
- 238000010586 diagram Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 239000000243 solution Substances 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000002715 modification method Methods 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 238000003491 array Methods 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000002347 injection Methods 0.000 description 1
- 239000007924 injection Substances 0.000 description 1
- 238000011022 operating instruction Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3696—Methods or tools to render software testable
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例公开了一种单元测试方法、装置及电子设备,该方法包括:获取与待测试单元对应的第一类,以及与第一类对应的第一类对象;根据第一类确定第二类对应的第二类对象;获取第二类对象的注解配置;其中,注解配置用于指示对第一类对象的第一代理对象进行实例化,以及对第一类实际调用的第二类对象的第二代理对象进行实例化;生成第一元信息描述文件和第二元信息描述文件;获取第二元信息描述文件中的懒加载属性;在懒加载属性为真的情况下,根据第一元信息描述文件对第一代理对象进行实例化,以及根据第二元信息描述文件对待测试单元进行测试时实际调用的第二代理对象进行实例化。
Description
技术领域
本申请涉及测试技术领域,尤其涉及一种单元测试方法、装置及电子设备。
背景技术
单元测试(Unit Testing)是指对应用程序中的最小可测单元进行检查和验证。在单元测试过程中通常使用开源框架(Spring Framework)是一个开放源代码的应用程序框架,是针对代理对象(Bean)的生命周期进行管理的轻量级容器。Spring Boot通过简化配置来进一步简化Spring应用的整个搭建和开发过程。
在一些场景下,在执行应用程序的单元测试时需要启动Spring上下文容器,将对象的创建和依赖关系的建立都交给控制反转(Inversion of Control,IOC)容器管理,在启动Spring上下文容器的过程中,Spring会将使用@SpringBootTest注解标记的所有能够扫描到的类全部生成BeanDefinition元信息以及实例化Bean对象,这是一个极其耗时的过程,单元测试的测试效率较低。
发明内容
本申请提供一种单元测试方法、装置及电子设备,以提高单元测试的测试效率。
第一方面,本申请提供一种单元测试方法,包括:获取与待测试单元对应的第一类,以及与所述第一类对应的第一类对象;根据所述第一类确定第二类对应的第二类对象,所述第二类为参与测试所述待测试单元的类;获取所述第二类对象的注解配置;其中,所述注解配置用于指示对所述第一类对象的第一代理对象进行实例化,以及对所述第一类实际调用的所述第二类对象的第二代理对象进行实例化;生成第一元信息描述文件和第二元信息描述文件,所述第一元信息描述文件为所述第一代理对象的元信息描述文件,所述第二元信息描述文件为进行注解配置的所述第二代理对象的元信息描述文件;获取所述第二元信息描述文件中的懒加载属性;在所述懒加载属性为真的情况下,根据所述第一元信息描述文件对所述第一代理对象进行实例化,以及根据所述第二元信息描述文件对所述待测试单元进行测试时实际调用的第二代理对象进行实例化。
第二方面,本申请提供一种单元测试装置,包括:获取模块,用于获取与待测试单元对应的第一类,以及与所述第一类对应的第一类对象;确定模块,用于根据所述第一类确定第二类对应的第二类对象,所述第二类为参与测试所述待测试单元的类;所述获取模块,还用于获取所述第二类对象的注解配置;其中,所述注解配置用于指示对所述第一类对象的第一代理对象进行实例化,以及对所述第一类实际调用的所述第二类对象的第二代理对象进行实例化;生成模块,用于生成第一元信息描述文件和第二元信息描述文件,所述第一元信息描述文件为所述第一代理对象的元信息描述文件,所述第二元信息描述文件为进行注解配置的所述第二代理对象的元信息描述文件;所述获取模块,还用于获取所述第二元信息描述文件中的懒加载属性;测试模块,用于在所述懒加载属性为真的情况下,根据所述第一元信息描述文件对所述第一代理对象进行实例化,以及根据所述第二元信息描述文件对所述待测试单元进行测试时实际调用的第二代理对象进行实例化。
第三方面,本申请提供一种电子设备,包括:处理器;用于存储处理器可执行指令的存储器;其中,处理器被配置为执行指令,以实现如第一方面的方法。
第四方面,本申请提供一种计算机可读存储介质,当存储介质中的指令由电子设备的处理器执行时,使得计算机可读存储介质能够执行如第一方面的方法。
可以看出,在使用spring进行单元测试时,通过对与单元测试对应的第二类对应的第二类对象进行注解配置,以及在第二类对象的第二代理对象的元信息描述文件中的懒加载属性为真的情况下,按需实例化类,即只实例化本次单元测试所实际使用的第一类对象以及实际调用的第二类对象,减少类的实例化所消耗的时间和内存,提高单元测试的测试效率。此外,在生成元信息描述文件时,只对待测试单元对应的第一类对象的第一代理对象和参与测试待测试单元的第二类对象的第二代理对象生成元信息描述文件,不会对扫描到的所有的类生成元信息描述文件,进一步减少生成元信息描述文件所消耗的时间和内存,进一步提高了单元测试的测试效率。
附图说明
此处所说明的附图用来提供对本说明书的进一步理解,构成本说明书的一部分,本说明书的示意性实施例及其说明用于解释本说明书,并不构成对本说明书的不当限定。在附图中:
图1为本申请实施例提供的第一种单元测试方法的流程示意图;
图2为本申请实施例提供的第二种单元测试方法的流程示意图;
图3为本申请实施例提供的一种单元测试装置的结构示意图;
图4为本说明书的一个实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本说明书的目的、技术方案和优点更加清楚,下面将结合本说明书具体实施例及相应的附图对本说明书技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
本说明书和权利要求书中的术语“第一”、“第二”等是用于区别类似的对象,而不用于描述特定的顺序或先后次序。应理解这样使用的数据在适当情况下可以互换,以便本申请实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,本说明书以及权利要求书中“和/或”表示所连接对象的至少其中之一,字符“/”一般表示前后关联对象是一种“或”的关系。
首先对本申请中的关键术语进行解释说明:
Spring:Spring是一个一站式轻量级的Java开发框架,其核心是IOC和面向切面(Aspect-Oriented Programming,AOP)。
IOC容器:IOC容器就是具有依赖注入功能的容器,容器中管理了应用程序中所有Bean(组装的及被Spring容器管理的Java对象)的元信息(Bean Definition),IOC容器负责根据类的元信息实例化Bean对象并建立Bean对象间的依赖。由IOC容器管理的那些组成应用程序的对象我们就叫它Bean,Bean就是由Spring容器初始化、装配及管理的对象。
实例化:在面向对象的编程中,把用类创建对象的过程称为实例化。
BeanDefinition:Spring中用其来描述Bean对象的元信息,根据BeanDefinition来创建Bean对象,BeanDefinition表示Bean的定义文件,用于描述了Bean的一些属性。比如描述,描述Bean的class类型,作用域scope、lazyInit bean是否懒加载,initMethodName表示Bean初始化执行的方法,destoryMethod bean销毁时执行的方法等。
class对象:用于表示类的类型信息。
类(class):对一项事物的抽象概括,可以包含事物的属性定义以及操作属性的方法,包含其名称、属性、方法和事件,类充作一种对象模板,在允许时,创建对象实例。
如上,在执行应用程序的单元测试时需要启动Spring上下文容器,将对象的创建和依赖关系的建立都交给控制反转(Inversion of Control,IOC)容器管理,在启动Spring上下文容器的过程中,Spring会将使用@SpringBootTest注解标记的所有能够扫描到的类全部实例化Bean对象,这是一个极其耗时的过程,单元测试的测试效率较低。
本申请实施例提供了一种单元测试方法、装置及电子设备,以提高单元测试的测试效率。本申请实施例提供了一种单元测试方法,包括:获取与待测试单元对应的第一类,以及与第一类对应的第一类对象;根据第一类确定第二类对应的第二类对象,第二类为参与测试待测试单元的类;获取第二类对象的注解配置;其中,注解配置用于指示对第一类对象的第一代理对象进行实例化,以及对第一类实际调用的第二类对象的第二代理对象进行实例化;生成第一元信息描述文件和第二元信息描述文件,第一元信息描述文件为第一代理对象的元信息描述文件,第二元信息描述文件为进行注解配置的第二代理对象的元信息描述文件;获取第二元信息描述文件中的懒加载属性;在懒加载属性为真的情况下,根据第一元信息描述文件对第一代理对象进行实例化,以及根据第二元信息描述文件对待测试单元进行测试时实际调用的第二代理对象进行实例化。上述对第一代理对象以及对待测试单元进行测试时实际调用的第二代理对象进行实例化是用来对待测试单元进行测试。
通过本申请实施例提供的技术方案,在使用spring进行单元测试时,通过对与单元测试对应的第二类对应的第二类对象进行注解配置,以及在第二类对象的第二代理对象的元信息描述文件中的懒加载属性为真的情况下,按需实例化类,即只实例化本次单元测试所实际使用的第一类对象以及实际调用的第二类对象,减少类的实例化所消耗的时间和内存,提高单元测试的测试效率。此外,在生成元信息描述文件时,只对待测试单元对应的第一类对象的第一代理对象和参与测试待测试单元的第二类对象的第二代理对象生成元信息描述文件,不会对扫描到的所有的类生成元信息描述文件,进一步减少生成元信息描述文件所消耗的时间和内存,进一步提高了单元测试的测试效率。
应理解,本申请实施例提供的单元测试方法均可以由电子设备执行或安装在电子设备中的软件执行,具体可以由终端设备或服务端设备执行。其中,单元测试方法可以由同一电子设备执行,或者也可以由不同的电子设备执行。
以下结合附图,详细说明本说明书各实施例提供的技术方案。
请参考图1,为本说明书的一个实施例提供的一种单元测试方法的流程示意图,应用于电子设备,该方法可以包括:
步骤S101,获取与待测试单元对应的第一类,和与第一类对应的第一类对象。
具体来讲,待测试单元可以是应用程序的待测试的函数,与待测试单元对应的第一类指的是待测试单元所在的类,对于每一个类而言,其都对应有类对象(class对象),每个类运行时的类型信息就是用class对象表示的,它包含了与类有关的信息。在获取与待测试单元对应的第一类时,可以通过与待测试单元对应的测试类获取,测试类的class文件中有一个自定义的注解,该注解用来标记待测试单元所在的类,因此通过该注解可以获取待测试单元所在的类以及该类所对应的class对象。
步骤S103,根据第一类确定第二类对应的第二类对象。
其中,第二类为参与测试待测试单元的类。
具体来讲,第二类包括但不限于:待测试单元对应的第一类所引用的类、与测试待测试单元相关的基础配置中的类以及测试待测试单元所实际用的类但是与待测试单元对应的第一类没有引用关系的类。在获取第二类时,可以通过第一类的类的加载器,拿到当前第一类所在的整个工程,在这个工程的特定目录中放了编译好的所有的class文件,从该目录的所有的class文件中获取第二类,以及第二类的class对象。
其中,根据第一类确定第二类对应的第二类对象的具体实现方式包括以下至少一者:
1)从第一类开始,自顶向下层层检索第一类引用的第二类,确定第一类引用的第二类对应的类对象为第二类对象。
具体来讲,在获取第二类时,可以通过第一类的类的加载器,拿到当前第一类所在的整个工程,在这个工程的特定目录中放了编译好的所有的class文件,从该目录的class文件对应的第一类开始,自顶向下层层检索第一类引用的第二类,以及确定第一类引用的第二类的class对象。
例如,待测试单元对应的第一类为:
MemberNotifyFileSummaryUploadTask.java;
其引用了类MemberNotifyFileSummaryUploadService.java;
类MemberNotifyFileSummaryUploadService.java又引用了
类MemberAccountFileUploadService.java;
则将类MemberNotifyFileSummaryUploadService.java
和MemberAccountFileUploadService.java这两个类作为与第一类有引用关系的类,并获取这两个类对应的Class对象,以及获取第一类MemberNotifyFileSummaryUploadTask.java的class对象。
2)确定测试待测试单元所需的基础配置的类,获取基础配置的类对应的类对象为第二类对应的第二类对象,基础配置的类包括数据库连接池类、数据库事务管理类和缓存配置类中的至少一者。
具体来讲,测试待测试单元所需的基础配置的类指的是测试待测试单元所必须的基础配置的类,如数据库连接池类、数据库事务管理类和缓存配置类中的至少一者。数据库连接池类指的是链接数据库的配置类、数据库事务管理类指的是管理数据库的事务的类,缓存配置类指的是连接缓存所需要的配置存储集群的地址、链接等所需要的类。其中,测试待测试单元所需的基础配置的类存储在特定的包内,在获取基础配置的类时可以直接从该包内获取所有的class文件并收集类和类的class对象。例如,config包下为所有基础配置相关的类,在此Spring启动时,扫描config包下所有的class文件,收集class类以及class类对应的class对象。
3)针对根据自定义注解确定标记有自定义注解的类,确定标记有自定义注解的第二类的类对象为第二类对象。
具体来讲,在测试类中可以通过自定义注解标记测试待测试单元所需要使用但没有被待测试单元对应的第一类直接或间接引用的类,例如分页插件等切面类。根据测试类中标记有自定义注解的类从第一类对应的工程的特定目录中的所有的class文件中获取与该自定义注解标记的类对应的类为第二类,以及获取该第二类的class对象。其中,自定义注解可以是用户自命名的注解,例如,RedisCacheConfig.class,SpringContextUtil.class,PageHelperAutoConfigura-tion.class三个类没有被待测试单元对应的第一类直接或间接引用,但执行待测试单元的测试方法时需要用到这三个类,则通过提供自定义注解@CommonDependenciesClass将这三个类标记起来,表示其在进行待测试单元的测试时需要使用的类。
如此,通过获取与待测试单元对应的第一类有引用关系、测试所需的基础配置的类以及实际使用的第二类,将第一类和这些第二类注入到spring容器中,而不会把所有的类都注入到spring容器中,缩短了注入类至spring容器所需的时间,提高了单元测试的测试效率。在生成元信息描述文件时,只对待测试单元对应的第一类和第二类生成元信息描述文件(BeanDefinition),不会对扫描到的所有的类生成元信息描述文件,进一步减少生成BeanDefinition所消耗的时间和内存,进一步提高了单元测试的测试效率。
步骤S105,获取第二类对象的注解配置。
其中,注解配置用于指示对第一类对象的第一代理对象进行实例化,以及对第一类实际调用的第二类对象的第二代理对象进行实例化。
具体来讲,注解配置可以是自定义注解配置,通过该自定义注解配置可以约束在待测试单元的测试方法执行之前,不会预先实例化所有的类对象的代理对象,而是根据注解配置按需实例化。其中,可以对参与测试待测试单元的第二类的第二类对象进行注解配置,如对带有@AutoWired注解的第二类的引用字段中进行注解配置。通过该注解配置,在对第一类的class对象对应的第一代理对象进行实例化时,不对第二类对应的class对象的第二代理对象进行实例化;以及对未被第一类实际调用的第二类对应的class对象的第二代理对象不进行实例化。
步骤S107,生成第一元信息描述文件和第二元信息描述文件。
其中,第一元信息描述文件为第一代理对象的元信息描述文件,第二元信息描述文件为进行注解配置的第二代理对象的元信息描述文件。
具体来讲,第一元信息描述文件和第二元信息描述文件指的是与class对象对应的代理对象的元信息描述文件,代理对象指的是Bean对象,元信息描述文件指的是Bean对象的BeanDefinition元信息。其中,生成第一元信息描述文件和第二元信息描述文件的具体实现方式有:将第一类对象和进行注解配置的第二类对象注入到开源框架(spring)的控制反转容器,通过控制反转容器生成第一元信息描述文件和第二元信息描述文件。
具体来讲,本申请通过创建WebTestContextBootstrapper类的扩展类,重写processMergedContextConfiguration方法,在单元测试启动时,SpringBoot会调用此重写的processMergedContextConfiguration方法获取所有需要注入Spring容器的Class类,我们可以通过重写的processMergedContextConfiguration方法将以上步骤收集的第一类和第二类,以及进行注解配置的第二类通过反射赋值到mergedContextConfiguration对象的classes字段,从这个重写的processMergedContextConfiguration方法的入参里获取待测试单元的单元测试类的类(如上述获取到的第一类和第二类),SpringBoot就会将这些类以及类的Class对象提交到Spring的上下文容器中,如spring的控制反转容器,由spring的控制反转容器生成第一元信息描述文件和第二元信息描述文件。利用spring的控制反转容器生成第一元信息描述文件和第二元信息描述文件的具体过程可以是:spring的控制反转容器通过调用BeanDefinition接口,BeanDefinition接口提供了一系列操作Bean对象元数据的set方法以及get方法,这些操作为Bean的元信息描述文件定义了一套模板,具体的实现则交由子类,通过该BeanDefinition接口用来操作注解信息生成第一代理对象的元信息描述文件和第二代理对象的元信息描述文件。其中,注解信息包括但不限于定义的常量、属性、操作这些属性的set和get方法以及操作方法等。
步骤S109,获取第二元信息描述文件中的懒加载属性。
具体来讲,spring中懒加载指的是把代理对象的实例化延迟到真正调用该代理对象时候,而不是在进行待测试单元之前进行程序初始化的时候就预先将代理对象实例化。
因此,在获取第二元信息描述文件中的懒加载属性前,可以将第二元信息描述文件中的懒加载属性配置为真,懒加载属性为真指示在对待测试单元进行测试之前,不预先实例化第一代理对象和第二代理对象,在开始对测试单元进行测试时,根据注解配置按需实例化。也就是说,将懒加载属性配置为真,可以在对待测试单元进行测试前,不会预先实例化注入到Spring容器中的全部的类对象对应的代理对象,而是在实际进行待测试单元的测试时,才实例化待测试单元对应的第一代理对象以及被实际调用的第二代理对象。从而进一步缩短了实例化代理对象所需的时间,提高了单元测试的测试效率。
更为具体的,实现Spring的BeanDefinitionRegistryPostProcessor后置处理器接口,在postProcessBeanDefinitionRegistry方法中获取所有的元信息描述文件(BeanDefinition元信息),修改其懒加载属性lazyInit为true,使得在开始对待测试单元的测试方法执行之前,不会预先实例化所有的类对象对应的代理对象,而是在待测试单元的测试方法开始执行后按需实例化。
步骤S111,在懒加载属性为真的情况下,根据第一元信息描述文件对第一代理对象进行实例化,以及根据第二元信息描述文件对待测试单元进行测试时实际调用的第二代理对象进行实例化。
具体来讲,在配置了懒加载属性为真之后,在开始执行待测试单元的测试方法时,不会预先实例化所有的类对象对应的代理对象,而是根据第一元信息描述文件对第一代理对象进行实例化,在第一代理对象进行实例化时,不会预先对各第二类对象对应的第二代理对象进行实例化。对第二类对象对应的第二代理对象进行实例化是根据第二元信息描述文件对测试待测试单元进行测试时实际调用的第二代理对象进行实例化。
通过本申请实施例公开的技术方案,通过对与单元测试对应的第二类对应的第二类对象进行注解配置,以及在第二类对象的第二代理对象的元信息描述文件中的懒加载属性为真的情况下,按需实例化类,即只实例化本次单元测试所实际使用的第一类对象以及实际调用的第二类对象,减少类的实例化所消耗的时间和内存,提高单元测试的测试效率。此外,在生成元信息描述文件时,只对待测试单元对应的第一类对象的第一代理对象和参与测试待测试单元的第二类对象的第二代理对象生成元信息描述文件,不会对扫描到的所有的类生成元信息描述文件,进一步减少生成元信息描述文件所消耗的时间和内存,进一步提高了单元测试的测试效率。
如图2所示的,为本说明书的一个实施例提供的另一种单元测试方法的流程示意图,应用于电子设备,该方法可以包括:
步骤S201,获取与待测试单元对应的第一类,和与第一类对应的第一类对象。
步骤S203,根据第一类确定第二类对应的第二类对象。
第二类为参与测试待测试单元的类。
步骤S204,对第二类对象进行注解配置。
具体来讲,注解配置可以是自定义注解配置,通过该自定义注解配置可以约束在待测试单元的测试方法执行之前,不会预先实例化所有的类对象对应的代理对象,而是根据注解配置按需实例化类对象对应的代理对象。其中,可以对与第一类有引用关系的第二类的第二类对象进行注解配置,如对带有@AutoWired注解的第二类对象的引用字段中进行注解配置。通过该注解配置,在对第一类的class对象对应的第一代理对象进行实例化时,不对第二类对应的class对象的第二代理对象进行实例化;以及对未被第一类实际调用的第二类对应的class对象的第二代理对象不进行实例化。通过进行注解配置,在待测试单元的测试方法执行时,使得当前的第一代理对象在实例化时,无需实例化与其有引用关系的所有的第二代理对象,缩短了实例化第二代理对象所需的时间,提高了单元测试的测试效率。在待测试单元的测试方法执行时,未真实调用与第一类有引用关系的第二类之前,有引用关系的第二类的第二代理对象不会被实例化,进一步缩短了实例化第二代理对象所需的时间,进一步提高了单元测试的测试效率。
其中,注解配置包括目标注解的配置,目标注解的配置的具体实现方式有:获取第二类对象中带有目标注解的引用字段,目标注解用于指示第二类与第一类存在引用关系;通过反射修改将目标注解的目标属性配置为假,在目标注解的目标属性为假时,指示对第一代理对象进行实例化。
具体来讲,目标注解可以为spring提供的@AutoWired注解,目标属性指的是@AutoWired注解的required属性,带有@AutoWired注解的第二类表示与待测试单元对应的第一类有引用关系,通过反射修改法将@AutoWired注解的required属性配置为假,使得当前的第一代理对象在实例化时,无需实例化与其有引用关系的所有的第二代理对象,其中,反射修改法指的是利用java的反射机制修改第二类对象的目标注解的目标属性值,具体是利用反射机制调用get方法获取第二类对象的目标注解中目标属性的正常属性值(如正常属性值为真),再将目标属性的正常属性值修改为假。例如MemberCardManageServiceImpl类通过@Autowired注解引用了类MemberCardTransManageService,通过对MemberCardTransManageService的@Autowired注解进行反射修改后,MemberCardManageServiceImpl.class在实际运行时,MemberCardTransManageService的注解的引用字段上标记的注解等同于@Autowired(required=false)。通过配置目标注解,在待测试单元的测试方法执行时,使得当前的第一代理对象在实例化时,无需实例化与其有引用关系的所有的第二代理对象,缩短了实例化第二代理对象所需的时间,进一步提高了单元测试的测试效率。
进一步,注解配置还包括懒加载注解的配置,其中,懒加载注解的配置的具体实现方式有:在引用字段配置懒加载注解,懒加载注解指示在对待测试单元进行测试时,对第一类实际调用的第二类对象的第二代理对象进行实例化,对未被第一类实际调用的第二类对象的第二代理对象不进行实例化。
具体来将,懒加载注解可以使用Javassist+ByteBuddy字节码增强技术修改第二类的Class对象,给其所有的@AutoWired注解的引用字段加上@Lazy注解(懒加载注解),通过该@Lazy注解使得在待测试单元的测试方法执行时,未真实调用与第一类有引用关系的第二类之前,有引用关系的第二类的第二代理对象不会被实例化。通过配置懒加载注解,在待测试单元的测试方法执行时,未真实调用与第一类有引用关系的第二类之前,有引用关系的第二类的第二代理对象不会被实例化,缩短了实例化第二代理对象所需的时间,提高了单元测试的测试效率。
在根据第一类确定第二类对应的第二类对象之后,方法还包括:
判断第二类对象是否为抽象类或接口;在第二类对象不是抽象类或接口的情况下,执行对第二类对象进行注解配置的步骤;在类对象是抽象类或接口的情况下,通过类加载器获取根路径,读取根路径下目标目录的所有的类文件,从所有的类文件中检索第二类对象的多个子类和多个实现类;对第二类对象的多个子类和多个实现类进行注解配置。
具体来讲,上述第二类的类对象的类型可能为抽象类或接口,具体可以通过jdk提供的java.lang.reflect.Modifier.isAbstract(clazz.getModifiers())方法进行判断类对象是否为抽象类或接口,通过类的class对象来判断其是否为抽象类或接口,如果不是抽象类或接口,则可以直接对类对应的类对象进行注解配置。
在class对象是抽象类或接口的情况下,通过类的ClassLoader类加载器获取该class对象对应的类所在工程的根路径,在该根路径下找Target目录(目标目录)下的所有Class文件,从中检索出class对象是抽象类或接口的类的所有子类和实现类,从而对class对象的多个子类和多个实现类进行注解配置。其中,对class对象的多个子类和多个实现类进行注解配置也包括目标注解的配置和懒加载注解的配置,多个子类和多个实现类进行目标注解的配置和懒加载注解的配置与上述实施例中第二类对象的目标注解的配置和懒加载注解的配置具有相同或类似的实现方式,其可以互相参照,本申请实施例在此不再赘述。如此,针对类型为抽象类或接口的类对象,可以进一步的获取其子类和实现类,从而避免遗漏与待测试单元相关的类,降低待测试单元的测试失败率。
步骤S205,获取第二类对象的注解配置。
注解配置用于指示对第一类对象的第一代理对象进行实例化,以及对第一类实际调用的第二类对象的第二代理对象进行实例化。
步骤S207,生成第一元信息描述文件和第二元信息描述文件。
第一元信息描述文件为第一代理对象的元信息描述文件,第二元信息描述文件为进行注解配置的第二代理对象的元信息描述文件。
步骤S209,获取第二元信息描述文件中的懒加载属性。
步骤S211,在懒加载属性为真的情况下,根据第一元信息描述文件对第一代理对象进行实例化,以及根据第二元信息描述文件对待测试单元进行测试时实际调用的第二代理对象进行实例化。
值得注意的是,步骤S201,步骤S203,步骤S205至步骤S211与上述步骤S101至步骤S111有相同或类似的实现方式,可以互相参照,本申请实施例在此不再赘述。
通过本申请实施例公开的技术方案,在使用spring进行单元测试时,通过对参与单元测试的第二类对应的第二类对象进行注解配置,以及在第二代理对象的元信息描述文件中的懒加载属性为真的情况下,按需实例化类,即只实例化本次单元测试所实际使用的第一代理对象以及实际调用的第二代理对象,减少类的实例化所消耗的时间和内存,提高单元测试的测试效率。
此外,与上述图1所示的单元测试方法相对应地,本申请实施例还提供一种单元测试装置。图3是本申请实施例提供的一种单元测试装置300的结构示意图,包括:获取模块301,用于获取与待测试单元对应的第一类,以及与第一类对应的第一类对象;确定模块302,用于根据第一类确定第二类对应的第二类对象,第二类为参与测试待测试单元的类;获取模块301,还用于获取第二类对象的注解配置;其中,注解配置用于指示对第一类对象的第一代理对象进行实例化,以及对第一类实际调用的第二类对象的第二代理对象进行实例化;生成模块303,用于生成第一元信息描述文件和第二元信息描述文件,第一元信息描述文件为第一代理对象的元信息描述文件,第二元信息描述文件为进行注解配置的第二代理对象的元信息描述文件;获取模块301,还用于获取第二元信息描述文件中的懒加载属性;测试模块304,用于根据第一元信息描述文件对第一代理对象进行实例化,以及根据第二元信息描述文件对待测试单元进行测试时实际调用的第二代理对象进行实例化。
通过本申请实施例公开的技术方案,通过对与单元测试对应的第二类对应的第二类对象进行注解配置,以及在第二类对象的第二代理对象的元信息描述文件中的懒加载属性为真的情况下,按需实例化类,即只实例化本次单元测试所实际使用的第一类对象以及实际调用的第二类对象,减少类的实例化所消耗的时间和内存,提高单元测试的测试效率。此外,在生成元信息描述文件时,只对待测试单元对应的第一类对象的第一代理对象和参与测试待测试单元的第二类对象的第二代理对象生成元信息描述文件,不会对扫描到的所有的类生成元信息描述文件,进一步减少生成元信息描述文件所消耗的时间和内存,进一步提高了单元测试的测试效率。
在一种可能的实现方式中,还包括:配置模块,用于对第二类对象进行注解配置,注解配置包括目标注解的配置;其中,目标注解的配置的具体实现方式有:获取第二类对象中带有目标注解的引用字段,目标注解用于指示第二类与第一类存在引用关系;通过反射修改将目标注解的目标属性配置为假,其中,在目标注解的目标属性为假时,指示对第一代理对象进行实例化。
在一种可能的实现方式中,注解配置还包括懒加载注解的配置,其中,懒加载注解的配置的具体实现方式有:在引用字段配置懒加载注解,懒加载注解指示在对待测试单元进行测试时,对第一类实际调用的第二类对象的第二代理对象进行实例化,对未被第一类实际调用的第二类对象的第二代理对象不进行实例化。
在一种可能的实现方式中,配置模块,还用于将第二元信息描述文件中的懒加载属性配置为真,其中,懒加载属性为真指示在对待测试单元进行测试之前,不预先实例化第一代理对象和第二代理对象,在开始对待测试单元进行测试时,按照注解配置实例化。
在一种可能的实现方式中,生成模块303,还用于将第一类对象和进行注解配置的第二类对象注入到开源框架的控制反转容器,通过控制反转容器生成第一元信息描述文件和第二元信息描述文件。
在一种可能的实现方式中,确定模块302,还用于:
1)从第一类开始,自顶向下层层检索第一类引用的第二类,确定第一类引用的第二类对应的类对象为第二类对象。
或者,2)确定测试待测试单元所需的基础配置的类,获取基础配置的类对应的类对象为第二类对应的第二类对象,基础配置的类包括数据库连接池类、数据库事务管理类和缓存配置类中的至少一者。
或者,3)根据自定义注解确定标记有自定义注解的类,确定标记有自定义注解的第二类对应的类对象为第二类对象。
在一种可能的实现方式中,还包括:判断模块,用于判断第二类对象是否为抽象类或接口。
配置模块,还用于在第二类对象不是抽象类或接口的情况下,执行对第二类对象进行注解配置的步骤。
还包括:读取模块,用于在类对象是抽象类或接口的情况下,通过类加载器获取根路径,读取根路径下目标目录的所有的类文件,从所有的类文件中检索第二类对象的多个子类和多个实现类。配置模块,还用于对第二类对象的多个子类和多个实现类进行注解配置。
显然,本申请实施例公开的单元测试装置可以作为上述实施例所示的单元测试方法的执行主体,因此能够实现单元测试方法在上述实施例所实现的功能。由于原理相同,在此不再赘述。
图4是本说明书的一个实施例电子设备的结构示意图。请参考图4,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-Access Memory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是ISA(Industry Standard Architecture,工业标准体系结构)总线、PCI(PeripheralComponent Interconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图4中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,用于存放程序。具体地,程序可以包括程序代码,程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。
处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成单元测试装置。处理器,执行存储器所存放的程序,并具体用于执行上述任一方法实施例中提到的单元测试方法。
上述如本说明书图1和图2所示实施例揭示的单元测试装置执行的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(Central ProcessingUnit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(DigitalSignal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
应理解,本申请实施例的电子设备可以实现单元测试装置在图1和图2所示实施例的功能。由于原理相同,本申请实施例在此不再赘述。
当然,除了软件实现方式之外,本说明书的电子设备并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
本申请实施例还提出了一种计算机可读存储介质,该计算机可读存储介质存储一个或多个程序,该一个或多个程序包括指令,该指令当被包括多个应用程序的便携式电子设备执行时,能够使该便携式电子设备执行上述任一实施例的单元测试方法。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
总之,以上仅为本说明书的较佳实施例而已,并非用于限定本说明书的保护范围。凡在本说明书的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本说明书的保护范围之内。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
Claims (10)
1.一种单元测试方法,其特征在于,包括:
获取与待测试单元对应的第一类,以及与所述第一类对应的第一类对象;
根据所述第一类确定第二类对应的第二类对象,所述第二类为参与测试所述待测试单元的类;
获取所述第二类对象的注解配置;其中,所述注解配置用于指示对所述第一类对象的第一代理对象进行实例化,以及对所述第一类实际调用的所述第二类对象的第二代理对象进行实例化;
生成第一元信息描述文件和第二元信息描述文件,所述第一元信息描述文件为所述第一代理对象的元信息描述文件,所述第二元信息描述文件为进行注解配置的所述第二代理对象的元信息描述文件;
获取所述第二元信息描述文件中的懒加载属性;
在所述懒加载属性为真的情况下,根据所述第一元信息描述文件对所述第一代理对象进行实例化,以及根据所述第二元信息描述文件对所述待测试单元进行测试时实际调用的第二代理对象进行实例化。
2.根据权利要求1所述的单元测试方法,其特征在于,在所述获取所述第二类对象的注解配置之前,所述方法还包括:
对所述第二类对象进行注解配置,所述注解配置包括目标注解的配置;
其中,所述目标注解的配置的具体实现方式有:获取所述第二类对象中带有目标注解的引用字段,所述目标注解用于指示所述第二类与所述第一类存在引用关系;通过反射修改将所述目标注解的目标属性配置为假,其中,在所述目标注解的目标属性为假时,指示对所述第一代理对象进行实例化。
3.根据权利要求2所述的单元测试方法,所述注解配置还包括懒加载注解的配置;
其中,所述懒加载注解的配置的具体实现方式有:在所述引用字段配置懒加载注解,所述懒加载注解指示在对所述待测试单元进行测试时,对所述第一类实际调用的所述第二类对象的第二代理对象进行实例化,对未被所述第一类实际调用的所述第二类对象的第二代理对象不进行实例化。
4.根据权利要求1所述的单元测试方法,其特征在于,在所述获取所述第二元信息描述文件中的懒加载属性之前,所述方法还包括:
将所述第二元信息描述文件中的懒加载属性配置为真;其中,所述懒加载属性为真指示在对所述待测试单元进行测试之前,不预先实例化所述第一代理对象和所述第二代理对象,在开始对所述待测试单元进行测试时,按照所述注解配置实例化。
5.根据权利要求1所述的单元测试方法,其特征在于,所述生成第一元信息描述文件和第二元信息描述文件包括:
将所述第一类对象和进行注解配置的所述第二类对象注入到开源框架的控制反转容器,通过所述控制反转容器生成所述第一元信息描述文件和所述第二元信息描述文件。
6.根据权利要求1-5任意一项所述的单元测试方法,其特征在于,所述根据所述第一类确定第二类对应的第二类对象包括以下至少一者:
1)从所述第一类开始,自顶向下层层检索所述第一类引用的第二类,确定所述第一类引用的第二类对应的类对象为所述第二类对象;
2)确定测试所述待测试单元所需的基础配置的类,获取所述基础配置的类对应的类对象为所述第二类对应的第二类对象,所述基础配置的类包括数据库连接池类、数据库事务管理类和缓存配置类中的至少一者;
3)根据自定义注解确定标记有自定义注解的类,确定标记有所述自定义注解的第二类对应的类对象为所述第二类对象。
7.根据权利要求2所述的单元测试方法,其特征在于,在所述根据所述第一类确定第二类对应的第二类对象之后,所述方法还包括:
判断所述第二类对象是否为抽象类或接口;
在所述第二类对象不是抽象类或接口的情况下,执行对所述第二类对象进行注解配置的步骤;
在所述类对象是抽象类或接口的情况下,通过类加载器获取根路径,读取所述根路径下目标目录的所有的类文件,从所述所有的类文件中检索所述第二类对象的多个子类和多个实现类;对所述第二类对象的多个子类和多个实现类进行注解配置。
8.一种单元测试装置,其特征在于,包括:
获取模块,用于获取与待测试单元对应的第一类,以及与所述第一类对应的第一类对象;
确定模块,用于根据所述第一类确定第二类对应的第二类对象,所述第二类为参与测试所述待测试单元的类;
所述获取模块,还用于获取所述第二类对象的注解配置;其中,所述注解配置用于指示对所述第一类对象的第一代理对象进行实例化,以及对所述第一类实际调用的所述第二类对象的第二代理对象进行实例化;
生成模块,用于生成第一元信息描述文件和第二元信息描述文件,所述第一元信息描述文件为所述第一代理对象的元信息描述文件,所述第二元信息描述文件为进行注解配置的所述第二代理对象的元信息描述文件;
所述获取模块,还用于获取所述第二元信息描述文件中的懒加载属性;
测试模块,用于在所述懒加载属性为真的情况下,根据所述第一元信息描述文件对所述第一代理对象进行实例化,以及根据所述第二元信息描述文件对所述待测试单元进行测试时实际调用的第二代理对象进行实例化。
9.一种电子设备,其特征在于,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现如权利要求1至7中任一项所述的单元测试方法。
10.一种计算机可读存储介质,其特征在于,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如权利要求1至7中任一项所述的单元测试方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310071095.5A CN116126711A (zh) | 2023-01-16 | 2023-01-16 | 单元测试方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310071095.5A CN116126711A (zh) | 2023-01-16 | 2023-01-16 | 单元测试方法、装置及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116126711A true CN116126711A (zh) | 2023-05-16 |
Family
ID=86297015
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310071095.5A Pending CN116126711A (zh) | 2023-01-16 | 2023-01-16 | 单元测试方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116126711A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117435512A (zh) * | 2023-12-21 | 2024-01-23 | 摩尔元数(福建)科技有限公司 | 一种基于Junit5自动切换不同数据库类型的单元测试方法 |
-
2023
- 2023-01-16 CN CN202310071095.5A patent/CN116126711A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117435512A (zh) * | 2023-12-21 | 2024-01-23 | 摩尔元数(福建)科技有限公司 | 一种基于Junit5自动切换不同数据库类型的单元测试方法 |
CN117435512B (zh) * | 2023-12-21 | 2024-03-08 | 摩尔元数(福建)科技有限公司 | 一种基于Junit5自动切换不同数据库类型的单元测试方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110032599B (zh) | 数据结构的读取及更新方法、装置、电子设备 | |
CN109308263B (zh) | 一种小程序测试方法、装置及设备 | |
CN109598407B (zh) | 一种业务流程的执行方法及装置 | |
EP1782191B1 (fr) | Procede de chargement d'un logiciel en langage intermediaire oriente objet dans un appareil portatif | |
CN116126711A (zh) | 单元测试方法、装置及电子设备 | |
Septian et al. | Automated test case generation from UML activity diagram and sequence diagram using depth first search algorithm | |
CN117931374A (zh) | 基于容器隔离的应用处理方法、装置、设备及存储介质 | |
CN112711405B (zh) | 一种生成增删改查应用程序接口的方法、设备及存储介质 | |
CN112052048B (zh) | 数据加载方法及装置、设备、存储介质 | |
CN115328458B (zh) | 一种业务应用开发方法及装置 | |
CN116483888A (zh) | 程序评估方法及装置、电子设备和计算机可读存储介质 | |
CN112907198B (zh) | 业务状态流转维护方法、装置及电子设备 | |
CN112214213B (zh) | Linux内核的开发和管理方法、装置、计算机设备和存储介质 | |
CN110688430B (zh) | 一种获得数据旁路的方法、装置及电子设备 | |
CN113138762A (zh) | Ui页面开发方法及装置 | |
CN113176988A (zh) | 数据记录方法及装置 | |
CN110297625B (zh) | 应用的处理方法及装置 | |
CN111858335A (zh) | 一种区块链sdk测试方法和装置 | |
CN116700840B (zh) | 文件执行方法、装置、电子设备及可读存储介质 | |
CN118093391A (zh) | 一种数据访问层单元测试方法、装置、介质和设备 | |
Heffelfinger | Payara Micro Revealed | |
CN111158701B (zh) | 库模块发布方法、装置、设备及存储介质 | |
CN118012400A (zh) | 针对程序的方法集合获取方法和装置 | |
CN115329227A (zh) | 一种WebIDE中区块链智能合约编辑器文件管理方法和装置 | |
Beernink et al. | Dynamic Beans |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |