CN110633213A - 单元测试方法、装置、计算机设备和存储介质 - Google Patents
单元测试方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN110633213A CN110633213A CN201910884316.4A CN201910884316A CN110633213A CN 110633213 A CN110633213 A CN 110633213A CN 201910884316 A CN201910884316 A CN 201910884316A CN 110633213 A CN110633213 A CN 110633213A
- Authority
- CN
- China
- Prior art keywords
- mock
- class
- anonymous
- target interception
- rewriting
- 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
Links
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/3684—Test management for test design, e.g. generating new test cases
-
- 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
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)
- Debugging And Monitoring (AREA)
Abstract
本申请涉及一种单元测试方法、装置、计算机设备及存储介质,属于互联网技术领域。所述方法包括:通过获取待测试类的所有方法,采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果,根据比较结果返回测试结果。本申请实施例提供的技术方案通过面向切面编程进行路由,直接将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,不需要考虑输入参数相同或不同的情况,解决了不同的单元测试采用相同的输入参数时,导致无法进行单元测试的问题。
Description
技术领域
本申请涉及互联网技术领域,特别是单元测试方法、装置、计算机设备和存储介质。
背景技术
近年来,编写单元测试逐渐成为程序开发中必不可少的一部分。单元测试是由开发人员进行编写,用于检测在特定条件下目标代码正确性的方法。单元测试具备便于后期重构、优化程序设计、同步文档记录、具有回归性的等很多的优点,越来越受到开发者的青睐。
现在可用的单元测试工具种类很多,常用的单元测试工具为Mock工具,Mock工具中又分了不同类别的单元测试工具,例如Mockito、EasyMock、Powe rMock、JMockit、Junit、TestNG等,不同类别的测试工具针对的问题有所不同。一般的,单元测试工具在Java开发过程中需要依赖Spring框架,在现有的基于Spring框架的开发方法中,在原基于Spring设计中,通常是重新实现需要Mock的类,并替换掉原类。在这种方案中,不同Mock类根据传入方法的不同参数返回不同的值,即不同的单元测试都使用统一路由方式。
但是,如果不同的单元测试采用相同的输入参数时,会导致无法进行单元测试的问题。
发明内容
基于此,有必要针对上述技术问题,提供一种不需要考虑输入参数的单元测试方法、装置、计算机设备和存储介质。
第一方面,提供了一种单元测试方法,该方法包括:
获取单元测试的待测试类的所有方法;
采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法;
将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果;
根据比较结果返回测试结果。
通过预处理阶段设置好所需的mock数据,建立单元测试的待测试类方法对应的Mock类,采用面向切面编程对已注释的待测试类方法进行选择拦截,将预先建立的匿名Mock类重写的方法与目标拦截方法进行比较,根据比较结果返回测试结果。整个单元测试过程采用面向切面编程实现待测试类方法与Mock重写方法的比较判断,不需要直接在单元测试中建立匿名Mock类重写的方法,即不需要考虑输入参数相同或不同的问题,解决了由于不同的单元测试采用相同的输入参数时,会导致无法进行单元测试的问题。
在其中一个实施例中,根据比较结果返回测试结果,包括:
若目标拦截方法和匿名Mock类重写的方法一致,且匿名Mock类为目标拦截方法所属类的子类,则调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象并返回;
若目标拦截方法和匿名Mock类重写的方法不一致,和/或匿名Mock类不为目标拦截方法的子类,调用目标拦截方法,返回目标拦截方法中的数据。
通过调用AOP模块,对拦截的待测试类的方法与预先设立的匿名Mock类重写的方法进行比较判断,根据判断结果返回测试结果。直接将两种方法调用比较,意味着不需要在单元测试中反复重写待测试类的Mock类,不需要根据输入参数返回测试结果,达到了隔离路由的效果,同时也解决了因输入参数相同或不同导致返回结果不准确,或无法返回测试结果的问题。
在其中一个实施例中,匿名Mock类重写的方法中包括已注释的类的入参断言,调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象并返回之前,还包括:
根据已注释的类的入参断言,确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数是否一致;
若一致,则执行调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象的步骤。
根据已注释的类的入参断言,确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数是否一致,相当于对待测试类的方法进行二次校验,进一步减少了单元测试的误判、漏判等情况。
在其中一个实施例中,该方法还包括:
设置Mock数据;
将Mock数据保存至Mock文件中,并建立Mock文件对应的匿名Mock类重写的方法。
在其中一个实施例中,Mock文件的格式包括空、序列化或JSON格式中的任一种。
在其中一个实施例中,建立Mock文件对应的匿名Mock类重写的方法之前,还包括:
建立Mock类;
若Mock类为接口,则实现接口;
若Mock类为抽象类或者普通类,则继承接口。
通过预先设置Mock类,单元测试中直接调用该类实现对应的方法,不需要在单元测试本体中重复重写需待测试类的方法的步骤,简化了单元测试的编写步骤,同时解决了在同一单元测试中,即使用同一路由,不同待测试类的方法输入不同的参数,无法返回测试结果的问题,提高了单元测试的效率和可行性。
在其中一个实施例中,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,包括:
根据设置Mock数据的顺序,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较。
按照预根据待测试类的方法设置的Mock数据顺序,采用AOP模块将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,通过设置比较对象的优先级,相当于对比较对象进行侧重点筛选,有利于测试人员在单元测试中对待测试类的方法的重点测试对象的优先获取。
第二方面,提供了一种单元测试装置,该装置包括:
获取模块,用于获取单元测试的待测试类的所有方法;
拦截模块,用于采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法;
比较模块,用于将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果;
返回模块,用于根据比较结果返回测试结果。
在其中一个实施例中,该返回模块还包括:
转换单元,用于若目标拦截方法和匿名Mock类重写的方法一致,且匿名Mock类为目标拦截方法所属类的子类,则调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象并返回;
返回子单元,用于若目标拦截方法和匿名Mock类重写的方法不一致,和/或匿名Mock类不为目标拦截方法的子类,则调用目标拦截方法,返回目标拦截方法中的数据。
在其中一个实施例中,该返回模块还包括:
断言单元,用于根据已注释的类的入参断言,确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数是否一致;
若一致,则执行调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象的步骤。
在其中一个实施例中,该单元测试装置还包括:
数据模块,用于设置Mock数据;将所述Mock数据保存至Mock文件中,并建立所述Mock文件对应的匿名Mock类重写的方法。
在其中一个实施例中,Mock文件的格式包括空、序列化或JSON格式中的任一种。
在其中一个实施例中,建立所述Mock文件对应的匿名Mock类重写的方法之前,该单元测试装置还包括建立模块:
建立模块,用于建立Mock类;若Mock类为接口,则实现所述接口;若Mock类为抽象类或者普通类,则继承所述接口。
在其中一个实施例中,该拦截模块包括:
排序单元,用于根据设置所述Mock数据的顺序,将所述目标拦截方法和预先建立的匿名Mock类重写的方法进行比较。
第三方面,提供了一种计算机设备,包括存储器和处理器,该存储器存储有计算机程序,该处理器执行所述计算机程序时实现上述第一方面任一项所述的单元测试方法。
第四方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述第一方面任一项所述的单元测试方法。
本申请实施例提供的技术方案带来的有益效果至少包括:
通过获取待测试类的所有方法,采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果,根据比较结果返回测试结果。本申请中,通过预处理阶段设置好所需的mock数据,建立待测试类方法对应的Mock类,通过面向切面编程对待测试类进行选择拦截,直接通过预先建立的匿名Mock类重写的方法与目标拦截方法进行比较,根据比较结果返回测试结果,不需要直接在单元测试中建立匿名Mock类重写的方法,即不需要考虑输入参数相同或不同的问题,从而准确地得到相应的单元测试结果。
附图说明
图1为本申请实施例中单元测试方法的应用环境示意图;
图2为本申请实施例中单元测试方法的流程示意图;
图3为本申请实施例中单元测试方法的流程示意图;
图4为本申请实施例中单元测试方法的流程示意图;
图5为本申请实施例中单元测试方法的流程示意图;
图6为本申请实施例中单元测试方法的时序图;
图7为本申请实施例中单元测试装置的结构示意图;
图8为本申请实施例中单元测试装置的结构示意图;
图9为本申请实施例中单元测试装置的结构示意图;
图10为本申请实施例中单元测试装置的结构示意图;
图11为本申请实施例中单元测试装置的结构示意图;
图12为本申请实施例中单元测试装置的结构示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请提供的单元测试方法,可以应用于如图1所示的应用环境中。图1提供了一种计算机设备,该计算机设备可以是终端,也可以是服务器,其内部结构图可以如图1所示。该计算机设备包括通过***总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作***和计算机程序。该内存储器为非易失性存储介质中的操作***和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种单元测试方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
需要说明的是,本申请实施例提供的单元测试方法,其执行主体可以是单元测试装置,该单元测试装置可以通过软件、硬件或者软硬件结合的方式实现成为计算机设备的部分或者全部。下述方法实施例中,均以执行主体是计算机设备为例来进行说明。
在一个实施例中,如图2所示,提供了一种单元测试方法,以该方法应用于图1中的计算机设备为例进行说明,包括以下步骤:
S201、获取单元测试的待测试类的所有方法。
其中,待测试类的所有方法指的是在开发过程中本次单元测试需要测试的类的所有方法。
在本实施例中,可以通过getUser函数调用单元测试类UserServiceImpl,获取需要测试的类的所有方法,获取到的方法中部分类按照预设的注释规则对其进行注释,用于之后对所注释的类进行拦截操作,比如,预设的注释规则可以为将待测试类添加注释@Service、@Component和@Repository等,本实施例中不以此为限。
S202、采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法。
其中,面向切面编程(Aspect Oriented Programming,AOP)可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性。预设规则注释的类可以包括被@Service、@Component和@Repository等所注释的类。
在本实施例中,采用AOP的特点,不需要在测试单元中不断的重写Mock类,而是按照预设的拦截规则,拦截待测试类的所有方法,比如,按照预设的拦截规则,AOP拦截注释为@Service的待测试类的所有方法,得到注释为@Service的待测试类的方法作为目标连接方法,用于之后与预先建立的对应的匿名Mock类重写的方法的比较。本实施例中不以此为限。
S203、将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果。
其中,目标拦截方法指的是根据注释,对待测试类所有方法进行拦截后,得到的待测试类的方法;预先建立的匿名Mock类重写的方法包括空实现或是对输入参数的断言。将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,可以是比较上述两种方法的方法签名和返回值类型是否一致。
在本实施例中,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,可以通过多种方式实现。比如,判断目标拦截方法和预先建立的匿名Mock类重写的方法的签名、返回值的类型等是否一致,或者判断目标拦截方法和预先建立的匿名Mock类重写的方法所属的类是否一致,或者判断目标拦截方法是否为匿名Mock类重写的方法的子类等。本实施例不以此为例。
S204、根据比较结果返回测试结果。
其中,比较结果包括匿名Mock类重写的方法与目标拦截方法一致,或匿名Mock类重写的方法与目标拦截方法不一致;对应测试结果分别为单元测试通过,或返回单元测试中错误信息,即Bug信息。
在本实施例中,若匿名Mock类重写的方法为目标拦截方法的子类,且匿名Mock类重写的方法为目标拦截方法一致,得到比较结果为一致,则返回单元测试通过信息;若匿名Mock类重写的方法不为目标拦截方法的子类,或匿名Mock类重写的方法为目标拦截方法不一致,得到比较结果为不一致,则返回单元测试中错误信息,跳出单元测试。本实施例不以此为限。
为了检测在特定条件下目标代码正确性,单元测试成为开发过程中比不可少的步骤。常用的单元测试工具在Java开发过程中需要依赖Spring框架,在原基于Spring设计中,通常是需要在单元测试方法中重写需要Mock的类,并替换掉原类。在这种方案中,不同Mock类根据传入方法的不同参数返回不同的值,即不同的单元测试都使用统一路由方式,但如果不同的单元测试采用相同的输入参数时,会导致无法进行单元测试的问题。本实施例中,通过预处理阶段设置好所需的Mock数据,建立待测试类方法对应的Mock类,采用面向切面编程,对预设规则注释的类的所有方法进行拦截,将预先建立的匿名Mock类重写的方法与目标拦截方法进行比较,根据比较结果返回测试结果。整个单元测试过程采用面向切面编程实现待测试类方法与Mock重写方法的比较判断,不需要直接在单元测试中建立匿名Mock类重写的方法,即不需要考虑输入参数相同或不同的问题,解决了由于不同的单元测试采用相同的输入参数时,会导致无法进行单元测试的问题。
在图2所示实施例的基础上,该方法涉及的是步骤204“根据比较结果返回测试结果”的具体实施方式可以包括以下两种情况:
第一种情况、若目标拦截方法和匿名Mock类重写的方法一致,且匿名Mock类为目标拦截方法的子类,则调用目标拦截方法对应的Mock文件,并将Mock文件转换为输出对象并返回。
其中,匿名Mock类重写的方法为目标拦截方法的子类指的是目标拦截方法为父类,匿名Mock类重写的方法为该方法的子类,匿名Mock类重写的方法继承父类的中的相同特征。目标拦截方法和匿名Mock类重写的方法一致指的是方法签名和返回值类型一致。
在本实施例中,判断匿名Mock类重写的方法为目标拦截方法的子类之后,将目标拦截方法和匿名Mock类重写的方法作比较,具体为比较两种方法的方法签名和返回值类型是否一致。其中,方法签名包括方法名、方法参数的个数和方法参数的类型等。若两种方法的方法签名和返回值类型一致,则调用目标拦截方法对应的Mock文件,并将Mock文件转换为对应的输出对象,并将该输出对象层层返回至单元测试中。本实施例不以此为例。
第二种情况、若目标拦截方法和匿名Mock类重写的方法不一致,和/或匿名Mock类不为目标拦截方法的子类,则调用目标拦截方法,返回目标拦截方法中的数据。
在本实施例中,判断匿名Mock类重写的方法不为目标拦截方法的子类,或判断匿名Mock类重写的方法为目标拦截方法的子类之后,将目标拦截方法和匿名Mock类重写的方法作比较,判断两种方法的方法签名和返回值类型不一致,则直接调用目标拦截方法,该目标拦截方法即当前单元测试中真实的方法,返回该目标拦截方法中的数据,即返回其对应的真实数据。本实施例不以此为例。
通过调用AOP,对拦截的待测试类的方法与预先设立的匿名Mock类重写的方法进行比较判断,根据判断结果返回测试结果。直接将两种方法调用比较,意味着不需要在单元测试中反复重写待测试类的Mock类,不需要根据输入参数返回测试结果,达到了隔离路由的效果,同时也解决了因输入参数相同或不同导致返回结果不准确,或无法返回测试结果的问题。
在图2所示实施例的基础上,图3为本实施例提供的另一种单元测试方法的流程图,该方法涉及的是匿名Mock类重写的方法中包括已注释的类的入参断言,调用目标拦截方法对应的Mock文件,在步骤204具体实施方式的第一种情况“将Mock文件转换为对象并返回”之前,如图3所示,该方法还包括以下步骤:
S301、根据已注释的类的入参断言,确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数是否一致。
其中,注释指的是对所对应的类的解释说明,断言指的是将确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数进行布尔校验,布尔校验结果分为真或假,如果布尔校验结果为真,则确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数一致,如果布尔校验结果为假,则确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数不一致。
在本实施例中,将AOP拦截的已注释的类的方法,也就是目标拦截方法中的输入参数作为实际值,将匿名Mock类重写的方法的输入参数作为预期值,进行断言,具体为判断实际值与预期值是否一致。本实施例中不以此为限。
S302、若一致,则执行调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象的步骤。
其中,一致是指上述目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数一致,若一致,则确定该目标拦截方法通过校验,调用该目标拦截方法对应的Mock文件,根据该Mock文件的格式将其转换为对应的输出对象。
在本实施例中,若拦截方法中的输入参数即实际值,与匿名Mock类重写的方法的输入参数即预期值一致,即“实际值==预期值”,表示断言结果为真,则校验通过,执行调用目标拦截方法对应的Mock文件,并将Mock文件转换为对应的对象的;若实际值与预期值不一致,即“实际值!=预期值”,表示断言结果为假,则抛出错误信息,直接跳出单元测试。本实施例中不以此为限。
根据已注释的类的入参断言,确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数是否一致,相当于对待测试类的方法进行二次校验,进一步减少了单元测试的误判、漏判等情况。
在图2所示实施例的基础上,在步骤201“获取待测试类的所有方法”之前,图4为本实施例提供的另一种单元测试方法的流程图,如图4所示,该方法还包括以下步骤:
S401、设置Mock数据。
在本实施例中,Mock就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的方法,Mock数据即为相应的的虚拟数据。在进行单元测试之前设置Mock数据,可以将该Mock数据以Mock文件的形式存储,还可以为各Mock数据设置优先级顺序。本实施例中不以此为限。
S402、将Mock数据保存至Mock文件中,并建立Mock文件对应的匿名Mock类重写的方法。
进一步地,Mock文件的格式包括空、序列化或JSON格式中的任一种。
其中,调用数据栈类DataMockerMock将Mock数据以Mock文件的形式保存,Mock文件的格式可以是空、序列化格式或者JSON格式等,相应的建立Mock文件对应的匿名Mock类重写方法,该方法用于在AOP按照预设的拦截规则对待测试类的所有方法进行拦截后,与目标拦截方法进行比较。
在本实施例中,将预先设置的Mock数据保存至Mock文件中,并建立Mock文件对应的匿名Mock类重写的方法,在调用AOP对待测试类的所有方法进行指定拦截后,与该目标拦截方法进行方法签名以及返回值类型的比较,根据其比较结果返回测试结果。本实施例中不以此为限。
在图4所示实施例的基础上,图5为本实施例提供的另一种单元测试方法的流程图,该方法涉及的是建立Mock类,在步骤402“并建立Mock文件对应的匿名Mock类重写的方法”之前,如图5所示,该方法还包括以下步骤:
S501、建立Mock类。
其中,Mock是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的方法。建立Mock类指的是将不容易构造或者不容易获取的类进行虚拟化,建立Mock类以便于之后进行单元测试。建立Mock类之后,对该Mock类进行类型的判定,Mock类包括接口、抽象类或方法类中任意一种。
S502、若Mock类为接口,则实现接口。
其中,接口是指在Java语言中,一个方法的特征包括方法的名字、参数的数目和种类,而不包括方法的返回类型,参数的名字以及异常抛出。如果Mock类为接口,则表示该类中不包含方法,故只能实现该接口。
S503、若所述Mock类为抽象类或者普通类,则继承所述接口。
其中,包含抽象方法的类为抽象类,没有方法主体;不包含抽象方法的类为普通类,该类中可以包含方法主体,也可以包含一个接口。若Mock类为上述两类,则不需要重写对应类中的方法,只需将对应类作为父类,继承其所有特征与方法即可。
在本实施例中,建立的Mock类为UserDaoRequsetAsserter,该类主要实现的方法包括匿名Mock类重写的方法,和/或输入参数的断言,或空实现。其中,若Mock类包含匿名Mock类重写的方法,和/或输入参数的断言,该Mock类为抽象类或者普通类,匿名Mock类重写的方法用于在采用AOP对已注释类的所有方法进行拦截后,与目标拦截方法进行比较,根据其比较结果返回测试结果;输入参数的断言具体为判断输入参数的实际值与预期值是否一致,即目标拦截方法中的输入参数与Mock类中的输入参数是否一致,Mock类中继承上述两种方法的接口,不重写具体实现方法。若Mock类包含空实现,则判断该类为接口或抽象类或者普通类,若Mock类为接口,直接实现该接口;若Mock类为抽象类或者普通类,则继承空实现中的接口。本实施例中不以此为限。
通过预先设置Mock类,单元测试中直接调用该类实现对应的方法,不需要在单元测试本体中重复重写需待测试类的方法的步骤,简化了单元测试的编写步骤,同时解决了在同一单元测试中,即使用同一路由,不同待测试类的方法输入不同的参数,无法返回测试结果的问题,提高了单元测试的效率和可行性。
在图2和图4所示实施例的基础上,步骤203“将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较”包括:根据设置所述Mock数据的顺序,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较。
其中,设置Mock数据的顺序的依据为针对当前待测试类的方法,设置对应的优先级不同的Mock数据顺序。
在本实施例中,按照预根据待测试类的方法设置的Mock数据顺序,采用AOP模块将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,通过设置比较对象的优先级,相当于对比较对象进行侧重点筛选,有利于测试人员在单元测试中对待测试类的方法的重点测试对象的优先获取。
为了更好的本申请的提供的单元测试方法,本实施例将从单元测试方法时序图方面对本申请提供的单元测试方法进行解释说明。如图6所示,包括:
S601、设置Mock数据:通过单元测试类基类设置Mock数据;
S602、将Mock数据保存至数据栈类中:将设置好的Mock数据保存至数据栈类中,同时生成保存Mock数据的Mock文件;
S603、获取待测试类的所有方法:通过调用单元测试子类获取待测试类的所有方法;
S604、AOP拦截已注释的待测试类的所有方法:AOP根据已注释的类对待测试类的所有方法进行拦截,得到目标拦截方法,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较;
S605、判断是否应该获取Mock数据:其中,判断依据为目标拦截方法和预先建立的匿名Mock类重写的方法的比较结果;
S606、返回值为真:若所述比较结果为所述匿名Mock类重写的方法为所述目标拦截方法的子类,且所述目标拦截方法和所述匿名Mock类重写的方法一致,判断应该获取Mock数据,返回值为真,该Mock数据用于之后调用其Mock文件进行对应转换为输出对象;
S607、获取Mock数据:通过调用数据栈类获取Mock数据,调用Mock数据对应的Mock文件;
S608、获取输入参数的实际值与预期值进行断言校验:调用Mock类获取输入参数的实际值与预期值进行断言校验,其中校验结果包括真或假;
S609、返回结果:若校验失败,则返回错误信息,并跳出单元测试;
S610、调用文件转换对象类:调用该类以实现将Mock文件转换为输出对象;
S611、根据Mock文件格式将其转换为输出对象;
S612、返回输出对象:向数据栈类返回转换后的输出对象;
S613、返回输出对象:向AOP返回转换后的输出对象;
S614、返回输出对象:向单元测试子类返回转换后的输出对象;
S615、返回输出对象:向单元测试子类返回转换后的输出对象。
本申请提供的单元测试方法,首先通过预处理阶段设置好所需的Mock数据,然后获取待测试类的所有方法,采用面向切面编程AOP方法,根据已注释的类对待测试类的所有方法进行拦截,得到目标拦截方法,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果,根据比较结果判返回测试结果。整个单元测试过程采用面向切面编程AOP实现待测试方法与Mock重写方法的比较判断,不需要考虑输入参数相同或者不同的情况,解决了由于不同的单元测试采用相同的输入参数时,会导致无法进行单元测试的问题。
应该理解的是,虽然图1-5的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1-5中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图7所示,提供了一种单元测试装置800,包括:获取模块801、拦截模块802、比较模块803和返回模块804,其中:
获取模块801,用于获取单元测试的待测试类的所有方法;
拦截模块802,用于采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法;
比较模块803,用于将所述目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果;
返回模块804,用于根据所述比较结果返回测试结果。
上述实施例提供的一种单元测试装置,其实现原理和技术效果与上述方法实施例类似,在此不再赘述。
在一个实施例中,如图8所示,该返回模块804还包括转换单元8041和停止单元8042,其中:
转换单元8041,用于若目标拦截方法和匿名Mock类重写的方法一致,且匿名Mock类为目标拦截方法的子类,则调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象并返回;
返回子单元8042,用于若目标拦截方法和匿名Mock类重写的方法不一致,和/或匿名Mock类不为目标拦截方法的子类,则调用目标拦截方法,返回目标拦截方法中的数据。
上述实施例提供的一种单元测试装置,其实现原理和技术效果与上述方法实施例类似,在此不再赘述。
在一个实施例中,如图9所示,匿名Mock类重写的方法中包括已注释的类的入参断言,该返回模块804还包括断言单元8043:
断言单元8043,用于根据已注释的类的入参断言,确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数是否一致;若一致,则执行调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象的步骤。
在其中一个实施例中,如图10所示,该单元测试装置800还包括数据模块805:
数据模块805,用于设置Mock数据;将所述Mock数据保存至Mock文件中,并建立所述Mock文件对应的匿名Mock类重写的方法。
进一步地,Mock文件的格式包括空、序列化或JSON格式中的任一种。
上述实施例提供的一种仓库管理装置,其实现原理和技术效果与上述方法实施例类似,在此不再赘述。
在其中一个实施例中,如图11所示,该单元测试装置800还包括建立模块806:
建立模块806,用于建立Mock类;
若Mock类为接口,则实现所述接口;
若Mock类为抽象类或者普通类,则继承所述接口。
在其中一个实施例中,如图12所示,该拦截模块802包括排序单元8021:
排序单元8021,用于根据设置所述Mock数据的顺序,将所述目标拦截方法和预先建立的匿名Mock类重写的方法进行比较。
上述实施例提供的一种仓库管理装置,其实现原理和技术效果与上述方法实施例类似,在此不再赘述。
关于单元测试装置的具体限定可以参见上文中对于单元测试方法的限定,在此不再赘述。上述单元测试装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
本领域技术人员可以理解,图1中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
获取单元测试的待测试类的所有方法;
采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法;
将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果;
根据比较结果返回测试结果。
在一个实施例中,根据比较结果返回测试结果,处理器执行计算机程序时还实现以下步骤:
若目标拦截方法和匿名Mock类重写的方法一致,且匿名Mock类为目标拦截方法的子类,则调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象并返回;
若目标拦截方法和匿名Mock类重写的方法不一致,和/或匿名Mock类不为目标拦截方法的子类,则调用目标拦截方法,返回目标拦截方法中的数据。
在一个实施例中,匿名Mock类重写的方法中包括已注释的类的入参断言,调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象并返回之前,处理器执行计算机程序时还实现以下步骤:
根据已注释的类的入参断言,确定目标拦截方法的输入参数和匿名Mock类重写的方法的输入参数是否一致;
若一致,则执行调用目标拦截方法对应的Mock文件,并将Mock文件转换为对象的步骤。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
设置Mock数据;
将Mock数据保存至Mock文件中,并建立Mock文件对应的匿名Mock类重写的方法。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
Mock文件的格式包括空、序列化或JSON格式中的任一种。
在一个实施例中,建立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类重写的方法。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
Mock文件的格式包括空、序列化或JSON格式中的任一种。
在一个实施例中,建立Mock文件对应的匿名Mock类重写的方法之前,计算机程序被处理器执行时还实现以下步骤:
建立Mock类;
若Mock类为接口,则实现接口;
若Mock类为抽象类或者普通类,则继承接口。
在一个实施例中,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,计算机程序被处理器执行时还实现以下步骤:
根据设置Mock数据的顺序,将目标拦截方法和预先建立的匿名Mock类重写的方法进行比较。
本实施例提供的计算机可读存储介质,其实现原理和技术效果与上述方法实施例类似,在此不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (10)
1.一种单元测试方法,其特征在于,所述方法包括:
获取所述单元测试的待测试类的所有方法;
采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法;
将所述目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果;
根据所述比较结果返回测试结果。
2.根据权利要求1所述的方法,其特征在于,所述根据所述比较结果返回测试结果,包括:
若所述目标拦截方法和所述匿名Mock类重写的方法一致,且所述匿名Mock类为所述目标拦截方法所属类的子类,则调用所述目标拦截方法对应的Mock文件,并将所述Mock文件转换为输出对象并返回;
若目标拦截方法和匿名Mock类重写的方法不一致,和/或匿名Mock类不为目标拦截方法的子类,调用所述目标拦截方法,返回所述目标拦截方法中的数据。
3.根据权利要求2所述的方法,其特征在于,所述匿名Mock类重写的方法中包括已注释的类的入参断言,所述调用所述目标拦截方法对应的Mock文件,并将所述Mock文件转换为对象并返回之前,还包括:
根据所述已注释的类的入参断言,确定所述目标拦截方法的输入参数和所述匿名Mock类重写的方法的输入参数是否一致;
若一致,则执行所述调用所述目标拦截方法对应的Mock文件,并将所述Mock文件转换为输出对象的步骤。
4.根据权利要求2-3任一项所述的方法,其特征在于,所述方法还包括:
设置Mock数据;
将所述Mock数据保存至所述Mock文件中,并建立所述Mock文件对应的匿名Mock类重写的方法。
5.根据权利要求4所述的方法,其特征在于,所述Mock文件的格式包括空、序列化或JSON格式中的任一种。
6.根据权利要求4所述的方法,其特征在于,所述建立所述Mock文件对应的匿名Mock类重写的方法之前,还包括:
建立Mock类;
若所述Mock类为接口,则实现所述接口;
若所述Mock类为抽象类或者普通类,则继承所述接口。
7.根据权利要求4所述的方法,其特征在于,所述将所述目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,包括:
根据设置所述Mock数据的顺序,将所述目标拦截方法和预先建立的匿名Mock类重写的方法进行比较。
8.一种单元测试装置,其特征在于,所述装置包括:
获取模块,用于获取单元测试的待测试类的所有方法;
拦截模块,用于采用面向切面编程,对预设规则注释的类的所有方法进行拦截,得到目标拦截方法;
比较模块,用于将所述目标拦截方法和预先建立的匿名Mock类重写的方法进行比较,得到比较结果;
返回模块,用于根据所述比较结果返回测试结果。
9.一种计算机设备,其特征在于,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述计算机程序被所述处理器执行时实现如权利要求1至7任一所述的单元测试方法。
10.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1至7任一所述的单元测试方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910884316.4A CN110633213B (zh) | 2019-09-19 | 2019-09-19 | 单元测试方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910884316.4A CN110633213B (zh) | 2019-09-19 | 2019-09-19 | 单元测试方法、装置、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110633213A true CN110633213A (zh) | 2019-12-31 |
CN110633213B CN110633213B (zh) | 2023-07-04 |
Family
ID=68971632
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910884316.4A Active CN110633213B (zh) | 2019-09-19 | 2019-09-19 | 单元测试方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110633213B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631942A (zh) * | 2020-12-31 | 2021-04-09 | 广州华多网络科技有限公司 | 单元测试方法、装置、计算机设备及存储介质 |
CN115344502A (zh) * | 2022-10-18 | 2022-11-15 | 中建电子商务有限责任公司 | 基于真实数据自动生成mock数据及自动加载的方法 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101276271A (zh) * | 2007-03-29 | 2008-10-01 | 北京邮电大学 | 一种面向切面编程的******及方法 |
US20110239194A1 (en) * | 2010-03-29 | 2011-09-29 | Microsoft Corporation | Automatically redirecting method calls for unit testing |
US20120222014A1 (en) * | 2011-02-28 | 2012-08-30 | Typemock Ltd. | Method and apparatus for detecting software bugs |
US20140109228A1 (en) * | 2012-10-16 | 2014-04-17 | International Business Machines Corporation | Transforming unit tests for security testing |
US20180129592A1 (en) * | 2016-11-08 | 2018-05-10 | Microsoft Technology Licensing, Llc | Mock-based unit test(s) for an end-to-end test of a code snippet |
CN108388519A (zh) * | 2018-03-19 | 2018-08-10 | 车智互联(北京)科技有限公司 | 基于SpringBoot服务的Mock测试方法 |
CN108427631A (zh) * | 2017-02-14 | 2018-08-21 | 北京京东尚科信息技术有限公司 | 一种应用测试***、方法、电子设备和可读存储介质 |
CN108647143A (zh) * | 2018-05-09 | 2018-10-12 | 平安普惠企业管理有限公司 | Mock接口测试方法、装置、计算机设备以及存储介质 |
CN110147326A (zh) * | 2019-05-23 | 2019-08-20 | 四川新网银行股份有限公司 | 基于Redis数据库的微服务自动化测试方法 |
-
2019
- 2019-09-19 CN CN201910884316.4A patent/CN110633213B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101276271A (zh) * | 2007-03-29 | 2008-10-01 | 北京邮电大学 | 一种面向切面编程的******及方法 |
US20110239194A1 (en) * | 2010-03-29 | 2011-09-29 | Microsoft Corporation | Automatically redirecting method calls for unit testing |
US20120222014A1 (en) * | 2011-02-28 | 2012-08-30 | Typemock Ltd. | Method and apparatus for detecting software bugs |
US20140109228A1 (en) * | 2012-10-16 | 2014-04-17 | International Business Machines Corporation | Transforming unit tests for security testing |
US20180129592A1 (en) * | 2016-11-08 | 2018-05-10 | Microsoft Technology Licensing, Llc | Mock-based unit test(s) for an end-to-end test of a code snippet |
CN108427631A (zh) * | 2017-02-14 | 2018-08-21 | 北京京东尚科信息技术有限公司 | 一种应用测试***、方法、电子设备和可读存储介质 |
CN108388519A (zh) * | 2018-03-19 | 2018-08-10 | 车智互联(北京)科技有限公司 | 基于SpringBoot服务的Mock测试方法 |
CN108647143A (zh) * | 2018-05-09 | 2018-10-12 | 平安普惠企业管理有限公司 | Mock接口测试方法、装置、计算机设备以及存储介质 |
CN110147326A (zh) * | 2019-05-23 | 2019-08-20 | 四川新网银行股份有限公司 | 基于Redis数据库的微服务自动化测试方法 |
Non-Patent Citations (2)
Title |
---|
柯栋梁: "云服务自动化集成测试研究", 《***仿真学报》 * |
网易数帆: "教育单元测试mock框架优化之路", 《HTTPS://ZHUANLAN.ZHIHU.COM/P/38471528》 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631942A (zh) * | 2020-12-31 | 2021-04-09 | 广州华多网络科技有限公司 | 单元测试方法、装置、计算机设备及存储介质 |
CN115344502A (zh) * | 2022-10-18 | 2022-11-15 | 中建电子商务有限责任公司 | 基于真实数据自动生成mock数据及自动加载的方法 |
CN115344502B (zh) * | 2022-10-18 | 2023-03-10 | 中建电子商务有限责任公司 | 基于真实数据自动生成mock数据及自动加载的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110633213B (zh) | 2023-07-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11281570B2 (en) | Software testing method, system, apparatus, device medium, and computer program product | |
CN112363941A (zh) | 接口测试方法、装置、计算机设备及存储介质 | |
CN110908895A (zh) | 页面自动化测试方法、装置、计算机设备及存储介质 | |
CN107526676B (zh) | 一种跨***测试方法及装置 | |
CN106293798B (zh) | 电子装置的自我修复方法、***及服务器 | |
CN111797026A (zh) | 测试用例生成方法、装置、计算机设备及存储介质 | |
KR102588856B1 (ko) | 소프트웨어 검증 방법 및 이를 위한 장치 | |
CN112286828B (zh) | 一种区块链智能合约的测试方法和*** | |
CN110928777B (zh) | 测试用例的处理方法、装置、设备及存储介质 | |
CN111897727A (zh) | 软件测试方法、装置、计算机设备及存储介质 | |
CN109582583B (zh) | 软件测试方法、装置、计算机设备和存储介质 | |
CN110633213B (zh) | 单元测试方法、装置、计算机设备和存储介质 | |
CN110704312A (zh) | 压力测试的方法、装置、计算机设备和存储介质 | |
CN111414309B (zh) | 应用程序的自动化测试方法、计算机设备和存储介质 | |
CN114328243A (zh) | 一种异常运行数据的处理方法、装置、设备和存储介质 | |
CN116069635A (zh) | Soc***的测试方法、装置、计算机设备及存储介质 | |
CN112612706A (zh) | 自动化测试方法、计算机设备及存储介质 | |
CN109815127B (zh) | 自动化脚本转换方法、装置、计算机设备和存储介质 | |
CN111159025A (zh) | 应用程序接口测试方法、装置、计算机设备和存储介质 | |
CN115599683A (zh) | 自动化测试方法、装置、设备及存储介质 | |
CN115114135B (zh) | 软件数据测试方法、装置、设备、介质及产品 | |
CN114328275A (zh) | ***测试方法、装置、计算机设备和存储介质 | |
CN108845932B (zh) | 一种网络库的单元测试方法、装置、存储介质及终端 | |
CN113220586A (zh) | 一种自动化的接口压力测试执行方法、装置和*** | |
CN113094258A (zh) | 精准测试方法、装置、计算机设备及介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |