CN111752841A - 单测模拟方法、装置、设备与计算机可读存储介质 - Google Patents

单测模拟方法、装置、设备与计算机可读存储介质 Download PDF

Info

Publication number
CN111752841A
CN111752841A CN202010597542.7A CN202010597542A CN111752841A CN 111752841 A CN111752841 A CN 111752841A CN 202010597542 A CN202010597542 A CN 202010597542A CN 111752841 A CN111752841 A CN 111752841A
Authority
CN
China
Prior art keywords
simulation
test
target
simulated
determining
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
Application number
CN202010597542.7A
Other languages
English (en)
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.)
WeBank Co Ltd
Original Assignee
WeBank Co 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 WeBank Co Ltd filed Critical WeBank Co Ltd
Priority to CN202010597542.7A priority Critical patent/CN111752841A/zh
Publication of CN111752841A publication Critical patent/CN111752841A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Abstract

本发明公开了一种单测模拟方法,包括:若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。本发明还公开了一种单测模拟装置、设备和计算机可读存储介质。本发明不需要测试案例中的模拟注解部分,以及注入声明部分,简化代码逻辑,提高单测框架的测试性能。

Description

单测模拟方法、装置、设备与计算机可读存储介质
技术领域
本发明涉及金融科技(Fintech)技术领域,尤其涉及单测模拟方法、装置、设备与计算机可读存储介质。
背景技术
近年来,随着金融科技(Fintech),尤其是互联网金融的不断发展,测试技术被引入银行等金融机构的日常开发中。在银行等金融机构的日常开发过程中,开发人员往往需要针对不同的业务功能开发不同的功能模块,为了确保开发的功能模块可用,开发人员需对其编写的程序进行测试,因此,如何进行程序可用性测试一直是银行等金融机构需要解决的技术问题。
在现有技术中,一般采用单元测试框架(单测框架),如Mockito和PowerMock等,对开发的功能模块等进行可用性测试,在测试过程中接收开发人员编写的测试案例集并执行测试案例集的测试行为,以得到预期值,其中,执行测试案例集的测试行为的过程中,需要读取测试案例集中每个测试案例的模拟注解部分,从而创建对应的模拟对象,并根据注入声明,将模拟对象注入被测对象中,以替换被测对象的依赖对象,最后模拟依赖对象返回预期值,使得被测对象调用依赖对象的过程替换成调用模拟对象,模拟对象无条件返回预期值,而不需要执行依赖对象内部的真实代码,从而完成被测对象的各个分支验证。
在这过程中,对于同一依赖对象,测试案例集中的不同测试案例在执行前的模拟阶段都需要重复创建该依赖对象的模拟对象,且每个模拟对象依赖注入声明部分,才能将模拟对象注入被测对象中,大量重复的创建以及声明,都将造成代码冗余。可见,现有单元测试框架的执行逻辑较为复杂且重复,导致性能较低。
发明内容
本发明的主要目的在于提出一种单测模拟方法、装置、设备与计算机可读存储介质,旨在简化测试逻辑,以提高测试框架的性能。
为实现上述目的,本发明提供一种单测模拟方法,所述单测模拟方法包括如下步骤:
若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;
若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;
基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;
将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。
优选地,所述基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象的步骤包括:
确定预设模拟池中是否存在所述待模拟对象对应的模拟对象;
若存在,则基于所述依赖拓扑关系图,确定所述模拟对象的注入对象;
将所述注入对象注入所述模拟对象中,以得到所述待模拟对象对应的目标模拟对象。
优选地,所述确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤之后,所述单测模拟方法还包括:
若不存在,则在所述预设模拟池中创建所述模拟对象,并执行基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤。
优选地,所述基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤包括:
从所述预设模拟池中获取所述模拟对象,并在所述预设模拟池中重置所述模拟对象;
确定所述待模拟对象的目标成员属性,并基于所述目标成员属性,确定所述待模拟对象所属的目标类;
在所述依赖拓扑关系图中确定所述目标类对应的目标反向拉链,所述依赖拓扑关系图由类以及类对应的反向拉链组成;
读取所述目标反向拉链中的对象,并确定所述目标反向拉链中的对象为所述模拟对象的注入对象。
优选地,所述确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤之前,所述单测模拟方法还包括:
确定所述预设模拟池中是否存在所述待模拟对象对应的模拟场景;
若不存在,则执行确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤。
优选地,所述确定所述预设模拟池中是否存在所述待模拟对象对应的模拟场景的步骤之后,所述单测模拟方法还包括:
若存在,则从所述预设模拟池中获取所述模拟场景对应的模拟组合对象,并在所述预设模拟池中重置所述模拟组合对象;
确定所述模拟组合对象为目标模拟对象,并执行将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为的步骤。
优选地,所述若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图的步骤包括:
若检测到启动指令,则加载所述启动指令对应的测试案例集,并扫描确定所述测试案例集中各成员对象的成员属性,以及各成员对象的依赖关系;
基于所述成员属性和所述依赖关系,建立所述测试案例中各成员对象的依赖拓扑关系图。
此外,为实现上述目的,本发明还提供一种单测模拟装置,所述单测模拟装置包括:
构建模块,用于若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;
确定模块,用于若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;
所述确定模块还用于基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;
执行模块,用于将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。
优选地,所述确定模块还用于:
确定预设模拟池中是否存在所述待模拟对象对应的模拟对象;
若存在,则基于所述依赖拓扑关系图,确定所述模拟对象的注入对象;
将所述注入对象注入所述模拟对象中,以得到所述待模拟对象对应的目标模拟对象。
优选地,所述确定模块还用于:
若不存在,则在所述预设模拟池中创建所述模拟对象,并执行基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤。
优选地,所述确定模块还用于:
从所述预设模拟池中获取所述模拟对象,并在所述预设模拟池中重置所述模拟对象;
确定所述待模拟对象的目标成员属性,并基于所述目标成员属性,确定所述待模拟对象所属的目标类;
在所述依赖拓扑关系图中确定所述目标类对应的目标反向拉链,所述依赖拓扑关系图由类以及类对应的反向拉链组成;
读取所述目标反向拉链中的对象,并确定所述目标反向拉链中的对象为所述模拟对象的注入对象。
优选地,所述确定模块还用于:
确定所述预设模拟池中是否存在所述待模拟对象对应的模拟场景;
若不存在,则执行确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤。
优选地,所述确定模块还用于:
若存在,则从所述预设模拟池中获取所述模拟场景对应的模拟组合对象,并在所述预设模拟池中重置所述模拟组合对象;
所述执行模块还用于:
确定所述模拟组合对象为目标模拟对象,并执行将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为的步骤。
优选地,所述构建模块还用于:
若检测到启动指令,则加载所述启动指令对应的测试案例集,并扫描确定所述测试案例集中各成员对象的成员属性,以及各成员对象的依赖关系;
基于所述成员属性和所述依赖关系,建立所述测试案例中各成员对象的依赖拓扑关系图。
此外,为实现上述目的,本发明还提供一种单测模拟设备,所述单测模拟设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的单测模拟程序,所述单测模拟程序被所述处理器执行时实现如上所述的单测模拟方法的步骤。
此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有单测模拟程序,所述单测模拟程序被处理器执行时实现如上所述的单测模拟方法的步骤。
本发明提出的单测模拟方法,若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。本发明在检测到单测指令时,通过构建测试案例中各成员对象的依赖拓扑关系图,以及预设模拟池,来确定成员对象中待模拟对象对应的目标模拟对象,不再需要测试案例中的模拟注解部分,以及注入声明部分,简化代码逻辑,提高单测框架的测试性能。
附图说明
图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图;
图2为本发明单测模拟方法第一实施例的流程示意图;
图3为本发明单测模拟方法第一实施例中,测试案例的一种示意图;
图4为本发明单测模拟方法第一实施例中,现有单测框架测试案例对应的代码文本示意图;
图5为本发明单测模拟方法第一实施例中,本发明单测框架测试案例对应的代码文本示意图;
图6为本发明单测模拟方法第一实施例中,一种依赖拓扑关系图的示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图。
本发明实施例设备可以是移动终端或服务器设备。
如图1所示,该设备可以包括:处理器1001,例如CPU,网络接口1004,用户接口1003,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图1中示出的设备结构并不构成对设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及单测模拟程序。
其中,操作系统是管理和控制单测模拟设备与软件资源的程序,支持网络通信模块、用户接口模块、单测模拟程序以及其他程序或软件的运行;网络通信模块用于管理和控制网络接口1002;用户接口模块用于管理和控制用户接口1003。
在图1所示的单测模拟设备中,所述单测模拟设备通过处理器1001调用存储器1005中存储的单测模拟程序,并执行下述单测模拟方法各个实施例中的操作。
基于上述硬件结构,提出本发明单测模拟方法实施例。
参照图2,图2为本发明单测模拟方法第一实施例的流程示意图,所述方法包括:
步骤S10,若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;
步骤S20,若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;
步骤S30,基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;
步骤S40,将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。
本实施例单测模拟方法运用于理财机构或者银行系统等金融机构的单测模拟设备中,单测模拟设备可以是终端、机器人或者PC设备,在本实施例中,单测模拟设备配置有单测框架,为描述方便,单测模拟设备以单测框架简称。在模拟设备检测到单测指令时,通过单测框架中JAVA框架容器加载单测指令对应的测试案例,再由单测框架执行测试案例,并以得到的结果值对产品功能的可用性进行判断,其中,测试案例是由开发人员为测试产品功能所编写的测试代码,可以理解的,程序开发过程中,为了实现产品需求,需编写相应的程序代码,代码通过了编译,只是说明它的语法正确,但功能能否实现则不能保证,因此,产品的某些功能代码完成后,为了检验其是否满足程序运行的需求,需要编写测试代码,模拟程序运行的过程,从而检验功能代码是否符合预期。
现有单测框架,如Mockito等,在对被测对象进行测试过程中,需要按照测试案例中的代码,依次执行模拟测试操作,如图3所示测试案例,被测对象依赖对象A、对象B和对象C,而对象A又依赖对象X,对象B又依赖对象Y,而对象X和对象Y分别进行了远程调用或者数据库查询,也即对象X和对象Y调用时,返回的值不可控,因此,在测试被测对象的过程中,需要对对象X和对象Y进行模拟。
测试案例对应的代码文本如图4所示,public class ServiceTest代表一个单侧类,也即一个测试案例,现有单测框架在执行时,首先读取模拟注解部分,然后根据模拟注解部分模拟被测对象的依赖对象,如模拟X对象为x,模拟Y对象为y,其中,@Mock注解代表mock(模拟)出来的对象方法是空方法,不保留原始代码行为,而@Spy注解代表mock出来的对象默认保留原始对象的行为;接着,读取注入声明部分,其中,@InjectMocks代表声明的对象是一个需要被注入的对象,如果没有该注解,则mock模拟对象就无法注入;接着,读取注释,其中@Autowired注释表示toTestObject被测对象是toTestObj;@Before注解的方法会在每个测试案例执行前执行,图4中,表示在执行测试案例前,需要执行MockitoAnnotations.initMocks(this)方法,使得模拟对象x和模拟对象y能注入对象A和对象B,最后读取测试部分,@Test注解表示被测对象执行过程中,需调用x.remoteRpc()或y.queryDB()的时候,分别无条件返回10和20,而不需要执行2个方法内部的真实代码。
对于开发人员来说,使用现有单测框架,在编写测试案例的过程中,需要熟知各类注解,且需要使用多种注解来声明测试案例的测试行为,也即,需要开发人员输入较多的代码;对于单测框架来说,由于各类注解太多,尤其是遇到测试案例集时,也即多个测试案例的情况,随处可见各种注解,增加了单测框架的性能负担,且执行逻辑也不够智能,每一个测试案例都需要mock对象,存在大量的重复性行为,降低了单测框架的性能。
而本实施例的单测模拟框架,在执行测试案例的过程中(测试案例对应的代码文本如图5所示),只需读取@SimpleMock声明部分,即可在模拟池中获取到TrimFacility依赖对象的trimFacilityMock模拟对象,同时calcService(自定义服务)依赖的TrimFacility对象就自动被替换为trimFacilityMock了。在这过程中,不需要再关心@Spy、@Mock、@InjectMocks以及其他注解或者声明,这意味着开发人员在编写测试案例的过程中,不再需要输入模拟注解部分的代码,以及注入声明部分的代码,大大减少开发人员的代码工作量;而单测框架在加载完测试案例后,在执行测试案例的测试行为的过程中,不需要执行模拟注解或者注入声明的操作,简化执行逻辑,减轻单测框架的性能负担,并且,由于模拟池的存在,不需要每个测试案例都重复创建mock对象,也不需要重复执行注入操作,减少了大量重复性工作,提高了单测模拟框架的性能。
本实施例的单测框架,在加载测试案例集之后,通过建立测试案例集中各成员对象的依赖拓扑关系图,从而在对目标测试案例进行单元测试时,从预设模拟池中确定目标测试案例的待模拟对象对应的目标模拟对象,再将待模拟对象替换成目标模拟对象,并获取目标模拟对象对应的测试值,不需要执行模拟操作或者注入操作,简化执行逻辑,提高单测框架的性能。
以下将对各个步骤进行详细说明:
步骤S10,若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;
在本实施例中,若检测到启动指令,则先通过单测框架中JAVA框架容器加载启动指令对应的测试案例集,然后,扫描确定测试案例集中涉及的各成员对象,并建立各成员对象的依赖拓扑关系图,其中,依赖拓扑关系图指的是测试中成员对象间的链式依赖关系,不同于现有的简单的两两对象间的依赖关系,本实施例的依赖拓扑关系图是由多条依赖关系链组成的。
具体的,在一实施例中,步骤S10包括:
步骤a1,若检测到启动指令,则加载所述启动指令对应的测试案例集,并扫描确定所述测试案例集中各成员对象的成员属性,以及各成员对象的依赖关系;
在一实施例中,若检测到启动指令,则先通过单测框架中JAVA框架容器加载启动指令对应的测试案例集,并扫描确定测试案例集中各成员对象的成员属性,以及各成员对象的依赖关系,其中,成员属性是描述成员对象特征的信息。
步骤a2,基于所述成员属性和所述依赖关系,建立所述测试案例中各成员对象的依赖拓扑关系图。
然后,根据测试案例中各成员对象的成员属性和依赖关系,依次遍历各成员对象并递归,具体的,采用矩阵图+链表的方式,将测试案例中各成员属性作为矩阵Hash的键key,依次确定各成员对象与当前成员对象的依赖关系,并将依赖关系为依赖的成员对象依次添加进当前成员对象所属类对应的链表中,以得到当前成员对象的反向拉链,最后将得到的各个反向拉链设置到key对应的value-list(依赖拓扑关系图,其中,value为key对应的类,list为链式表,用于存放反向拉链)中,即得到依赖拓扑关系图,如图6所示,K为测试案例中的成员对象的成员属性,K对应的链式表即为反向拉链,反向拉链中,C为与当前成员对象存在依赖关系的成员对象。后续在模拟过程中,若需要模拟K1对象,则根据K1对象的成员属性,在依赖拓扑关系图中找到K1所属类的位置,再将K1对应的反向拉链中的对象注入K1的模拟对象中。
步骤S20,若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象。
在本实施例中,若检测到单测指令,则先确定是对案例测试集中的哪一个目标测试案例进行单元测试,然后确定目标测试案例中的待模拟对象,也即确定哪些对象需要被mock模拟,在一实施例中,需要被mock的成员对象在目标测试案例中以标识的方式突出,也即,单测框架只需识别测试案例中各成员对象的标识,即可确定哪些对象是需要被mock的。
进一步地,在一实施例中,确定目标测试案例中的待模拟对象的步骤包括:
基于所述目标测试案例中被测对象的调用信息,确定所述成员对象中的待模拟对象;
在一实施例中,通过目标测试案例中被测对象的调用信息,确定成员对象中的待模拟对象,其中,调用信息包括接口信息,也即通过被测对象调用的接口信息,确定调用对象,也即依赖对象是否需要mock,可以理解的,当依赖对象为外部系统或者数据库时,其返回的结果值不可控,因此需要mock,因此,可根据接口信息,确定调用对象是否是外部系统或者数据库,以此确定成员对象中的待模拟对象,需要说明的是,待模拟对象可以是一个也可以是多个。
步骤S30,基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象。
在本实施例中,根据依赖拓扑关系图,以及预设模拟池,确定待模拟对象,其中,预设模拟池为单测框架预先划分出来,用于存储模拟对象的区域,在模拟池中都是创建好的模拟对象,且模拟对象唯一。
进一步地,在一实施例中,步骤S30包括:
步骤b1,确定预设模拟池中是否存在所述待模拟对象对应的模拟对象;
在一实施例中,确定预设模拟池中是否存在确定的待模拟对象对应的模拟对象,具体可在预设模拟池中查找是否存在成员属性与待模拟对象的成员属性相同的模拟对象。
步骤b2,若存在,则基于所述依赖拓扑关系图,确定所述模拟对象的注入对象;
在一实施例中,若确定模拟池中存在待模拟对象对应的模拟对象,则根据依赖拓扑关系图,进一步确定模拟对象的注入对象,也即需要将哪些成员对象注入模拟对象中,以使模拟对象在替换待模拟对象后,具备待模拟对象的调用逻辑,以便准确模拟待模拟对象在处理被测对象的调用请求时,返回预期值。
在另一实施例中,若不存在,则在所述预设模拟池中创建所述模拟对象,并执行基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤。
也即,若确定模拟池中不存在待模拟对象对应的模拟对象,则在预设模拟持中创建一个新的模拟对象,具体创建过程与现有模拟对象的创建过程类似,在此不再详细说明。接着执行基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤。
进一步地,在一实施例中,基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤包括:
步骤b21,从所述预设模拟池中获取所述模拟对象,并在所述预设模拟池中重置所述模拟对象;
在一实施例中,单测框架先从预设模拟池中获取模拟对象,然后在预设模拟池中重置模拟对象,这是为了便于其他测试案例也需要当前的模拟对象时,能互不干扰的各自执行测试,如当前测试案例包含两个案例,第一个案例和第二个案例都需要模拟A对象,从而得到模拟对象A’,但第一个案例的模拟对象需要注入B对象,而第二个案例需要注入B对象和C对象,因此,在第一个案例获取到模拟对象A’之后,在预设模拟池中重置模拟对象A’,以便第二个案例获取模拟对象A’,后续将B对象和C对象注入模拟对象A’中。
步骤b22,确定所述待模拟对象的目标成员属性,并基于所述目标成员属性,确定所述待模拟对象所属的目标类;
在一实施例中,在获取到模拟对象之后,确定待模拟对象的目标成员属性,并确定该目标成员属性属于哪一类,可以理解的,一个类包含多个成员对象,因此,也包含多个成员属性,也即一个类对应多个成员属性,一个成员属性对应一个类。
步骤b23,在所述依赖拓扑关系图中确定所述目标类对应的目标反向拉链,所述依赖拓扑关系图由类以及类对应的反向拉链组成;
然后在依赖拓扑关系图中,查找目标成员属性所属目标类的位置,该目标类所在位置对应的反向拉链即为目标反向拉链,可以理解的,目标反向拉链中的成员对象即为即将注入模拟对象的注入对象。
步骤b24,读取所述目标反向拉链中的对象,并确定所述目标反向拉链中的对象为所述模拟对象的注入对象。
最后,读取目标反向拉链中的成员对象,并确定目标反向拉链中的对象为模拟对象的注入对象。
步骤b3,将所述注入对象注入所述模拟对象中,以得到所述待模拟对象对应的目标模拟对象。
在一实施例中,在确定了模拟对象以及模拟对象的注入对象之后,将注入对象注入模拟对象中,从而得到待模拟对象对应的目标模拟对象,后续被测对象调用待模拟对象时,转换成调用目标模拟对象,如被测对象A调用B对象,B对象调用C对象,在模拟B对象得到模拟对象B’时,即转换成被测对象调用B’对象,这是由于C对象已被注入B’对象中,B’对象相当于B对象+C对象,简化调用逻辑,使得测试过程中,单测框架不需要执行其他的调用操作。
步骤S40,将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。
在本实施例中,在确定了目标模拟对象之后,将测试案例中的待模拟对象替换成目标模拟对象,之后,执行测试案例的测试行为,从而得到测试案例的测试结果,其中,由于不可控的依赖对象已替换成目标模拟对象,目标模拟对象返回的值为一个预期值,因此,排除了不可控依赖对象对本次测试的干扰,因此,可根据测试结果校验功能代码是否符合预期,具体的测试行为与现有单测框架的执行逻辑类似,在此不再详细说明。
需要说明的是测试案例使用完目标模拟对象之后,即删除,可以理解的,若不对目标模拟对象进行重置或回收,则有可能污染其他测试案例,如前述注入对象环节,会由于上一测试案例的注入操作而使得当前测试案例无法对其进行注入对象的注入,或者注入之后无法得到正确的目标模拟对象等,因此,单测框架每次从模拟池中获取到模拟对象之后,自动进行对象重置,使得模拟池中保留一个干净的模拟对象,且用后删除,不需要人工干预对象回收,不污染其他测试案例。
本实施例若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。本发明在检测到单测指令时,通过构建测试案例中各成员对象的依赖拓扑关系图,以及预设模拟池,来确定成员对象中待模拟对象对应的目标模拟对象,不再需要测试案例中的模拟注解部分,以及注入声明部分,简化代码逻辑,提高单测框架的测试性能。
进一步地,基于本发明单测模拟方法第一实施例,提出本发明单测模拟方法第二实施例。
单测模拟方法的第二实施例与单测模拟方法的第一实施例的区别在于,确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤之前,所述单测模拟方法还包括:
步骤c,确定所述预设模拟池中是否存在所述待模拟对象对应的模拟场景;
步骤d,若不存在,则执行确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤。
本实施例被测对象调用的依赖对象较多,如被测对象需要访问多个下游外部系统,或者调用的依赖对象返回的结果值多样时,将需要模拟多个对象或者多个结果值,本实施例将多个模拟行为包装成一个mock场景(模拟场景),使得不同测试案例遇到相同的模拟场景,都可以使用该mock场景,实现测试的复用性。
以下将对各个步骤进行详细说明:
步骤c,确定所述预设模拟池中是否存在所述待模拟对象对应的模拟场景。
在本实施例中,在确定目标模拟对象的过程中,先确定预设模拟池中是否存在待模拟对象对应的模拟场景,其中,模拟场景也可叫模拟组件,其本质上时一种特殊类,在本实施例的单测框架中,只需声明@MockScene(模拟场景)或@MockService(模拟服务)后单测框架即可自动识别加载,通常用于多个模拟对象的组合模拟。
因此,在一实施例中,单测框架先确定待模拟对象的数量,若待模拟对象的数量超过预设数量,如超过1,则就需要确定待模拟对象在预设模拟池中是否存在对应的模拟场景,如当前测试案例中,被测对象访问了对象A、对象B和对象C三个不可控外部系统,则可将访问对象对象A、对象B和对象C的访问行为包装成一个模拟场景,其他测试案例若也满足该模拟场景,则不需要再一个个去替换待模拟对象,而只需声明使用该模拟场景即可自动替换。
需要说明的是,模拟场景还可针对同一调用对象的多个结果,如被测对象访问下游A模块,A模块可能返回10种可能结果,此时,也可将这些结果封装成一个mock组件(模拟组件)。
因此,在确定了待模拟对象之后,先确定预设模拟池中是否存在对应的模拟场景。
步骤d,若不存在,则执行确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤。
在本实施例中,若预设模拟池中不存在待模拟对象对应的模拟场景,则执行确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤。
进一步地,若存在,则从所述预设模拟池中获取所述模拟场景对应的模拟组合对象,并在所述预设模拟池中重置所述模拟组合对象;
在一实施例中,若预设模拟池中存在待模拟对象对应的模拟场景,则从预设模拟池中获取模拟场景对应的模拟组合对象,需要说明的是,由于模拟场景固定,因此,其对应的模拟组合对象也是固定的,也即,确定了模拟组合对象之后,不需要再对模拟组合对象进行注入对象的注入。
确定所述模拟组合对象为目标模拟对象,并执行将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为的步骤。
之后,将模拟组合对象确定为目标模拟对象,并执行将待模拟对象替换成目标模拟对象,并基于目标模拟对象执行测试案例的测试行为的步骤,在此不再详细说明。
本实施例的模拟场景或者模拟组件,实质是将一组通用的模拟对象聚合,形成可复用的原子代码块,使得同一模拟场景可以被多个测试案例复用,且模拟场景一旦被修改,所有的测试案例也都相应生效,使得维护更加简便高效。
本发明还提供一种单测模拟装置。本发明单测模拟装置包括:
构建模块,用于若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;
确定模块,用于若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;
所述确定模块还用于基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;
执行模块,用于将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。
优选地,所述确定模块还用于:
确定预设模拟池中是否存在所述待模拟对象对应的模拟对象;
若存在,则基于所述依赖拓扑关系图,确定所述模拟对象的注入对象;
将所述注入对象注入所述模拟对象中,以得到所述待模拟对象对应的目标模拟对象。
优选地,所述确定模块还用于:
若不存在,则在所述预设模拟池中创建所述模拟对象,并执行基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤。
优选地,所述确定模块还用于:
从所述预设模拟池中获取所述模拟对象,并在所述预设模拟池中重置所述模拟对象;
确定所述待模拟对象的目标成员属性,并基于所述目标成员属性,确定所述待模拟对象所属的目标类;
在所述依赖拓扑关系图中确定所述目标类对应的目标反向拉链,所述依赖拓扑关系图由类以及类对应的反向拉链组成;
读取所述目标反向拉链中的对象,并确定所述目标反向拉链中的对象为所述模拟对象的注入对象。
优选地,所述确定模块还用于:
确定所述预设模拟池中是否存在所述待模拟对象对应的模拟场景;
若不存在,则执行确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤。
优选地,所述确定模块还用于:
若存在,则从所述预设模拟池中获取所述模拟场景对应的模拟组合对象,并在所述预设模拟池中重置所述模拟组合对象;
所述执行模块还用于:
确定所述模拟组合对象为目标模拟对象,并执行将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为的步骤。
优选地,所述构建模块还用于:
若检测到启动指令,则加载所述启动指令对应的测试案例集,并扫描确定所述测试案例集中各成员对象的成员属性,以及各成员对象的依赖关系;
基于所述成员属性和所述依赖关系,建立所述测试案例中各成员对象的依赖拓扑关系图。
本发明还提供一种计算机可读存储介质。
本发明计算机可读存储介质上存储有单测模拟程序,所述单测模拟程序被处理器执行时实现如上所述的单测模拟方法的步骤。
其中,在所述处理器上运行的单测模拟程序被执行时所实现的方法可参照本发明单测模拟方法各个实施例,此处不再赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书与附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (10)

1.一种单测模拟方法,其特征在于,所述单测模拟方法包括如下步骤:
若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;
若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;
基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;
将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。
2.如权利要求1所述的单测模拟方法,其特征在于,所述基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象的步骤包括:
确定预设模拟池中是否存在所述待模拟对象对应的模拟对象;
若存在,则基于所述依赖拓扑关系图,确定所述模拟对象的注入对象;
将所述注入对象注入所述模拟对象中,以得到所述待模拟对象对应的目标模拟对象。
3.如权利要求2所述的单测模拟方法,其特征在于,所述确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤之后,所述单测模拟方法还包括:
若不存在,则在所述预设模拟池中创建所述模拟对象,并执行基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤。
4.如权利要求2所述的单测模拟方法,其特征在于,所述基于所述依赖拓扑关系图,确定所述模拟对象的注入对象的步骤包括:
从所述预设模拟池中获取所述模拟对象,并在所述预设模拟池中重置所述模拟对象;
确定所述待模拟对象的目标成员属性,并基于所述目标成员属性,确定所述待模拟对象所属的目标类;
在所述依赖拓扑关系图中确定所述目标类对应的目标反向拉链,所述依赖拓扑关系图由类以及类对应的反向拉链组成;
读取所述目标反向拉链中的对象,并确定所述目标反向拉链中的对象为所述模拟对象的注入对象。
5.如权利要求2所述的单测模拟方法,其特征在于,所述确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤之前,所述单测模拟方法还包括:
确定所述预设模拟池中是否存在所述待模拟对象对应的模拟场景;
若不存在,则执行确定预设模拟池中是否存在所述待模拟对象对应的模拟对象的步骤。
6.如权利要求5所述的单测模拟方法,其特征在于,所述确定所述预设模拟池中是否存在所述待模拟对象对应的模拟场景的步骤之后,所述单测模拟方法还包括:
若存在,则从所述预设模拟池中获取所述模拟场景对应的模拟组合对象,并在所述预设模拟池中重置所述模拟组合对象;
确定所述模拟组合对象为目标模拟对象,并执行将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为的步骤。
7.如权利要求1-6任一项所述的单测模拟方法,其特征在于,所述若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图的步骤包括:
若检测到启动指令,则加载所述启动指令对应的测试案例集,并扫描确定所述测试案例集中各成员对象的成员属性,以及各成员对象的依赖关系;
基于所述成员属性和所述依赖关系,建立所述测试案例中各成员对象的依赖拓扑关系图。
8.一种单测模拟装置,其特征在于,所述单测模拟装置包括:
构建模块,用于若检测到启动指令,则加载所述启动指令对应的测试案例集,并建立所述测试案例集中各成员对象的依赖拓扑关系图;
确定模块,用于若检测到单测指令,则确定所述单测指令对应的目标测试案例,并确定所述目标测试案例中的待模拟对象;
所述确定模块还用于基于所述依赖拓扑关系图和预设模拟池,确定所述待模拟对象对应的目标模拟对象,其中,所述预设模拟池用于存储模拟对象;
执行模块,用于将所述待模拟对象替换成所述目标模拟对象,并基于所述目标模拟对象,执行所述测试案例的测试行为。
9.一种单测模拟设备,其特征在于,所述单测模拟设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的单测模拟程序,所述单测模拟程序被所述处理器执行时实现如权利要求1至7中任一项所述的单测模拟方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有单测模拟程序,所述单测模拟程序被处理器执行时实现如权利要求1至7中任一项所述的单测模拟方法的步骤。
CN202010597542.7A 2020-06-28 2020-06-28 单测模拟方法、装置、设备与计算机可读存储介质 Pending CN111752841A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010597542.7A CN111752841A (zh) 2020-06-28 2020-06-28 单测模拟方法、装置、设备与计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010597542.7A CN111752841A (zh) 2020-06-28 2020-06-28 单测模拟方法、装置、设备与计算机可读存储介质

Publications (1)

Publication Number Publication Date
CN111752841A true CN111752841A (zh) 2020-10-09

Family

ID=72678434

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010597542.7A Pending CN111752841A (zh) 2020-06-28 2020-06-28 单测模拟方法、装置、设备与计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN111752841A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112631942A (zh) * 2020-12-31 2021-04-09 广州华多网络科技有限公司 单元测试方法、装置、计算机设备及存储介质
CN113448853A (zh) * 2021-06-30 2021-09-28 东莞市大易产业链服务有限公司 单元测试方法、装置、测试设备及存储介质
CN117076332A (zh) * 2023-10-13 2023-11-17 博智安全科技股份有限公司 一种测试用例的测试方法、装置、电子设备及存储介质

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112631942A (zh) * 2020-12-31 2021-04-09 广州华多网络科技有限公司 单元测试方法、装置、计算机设备及存储介质
CN113448853A (zh) * 2021-06-30 2021-09-28 东莞市大易产业链服务有限公司 单元测试方法、装置、测试设备及存储介质
CN117076332A (zh) * 2023-10-13 2023-11-17 博智安全科技股份有限公司 一种测试用例的测试方法、装置、电子设备及存储介质
CN117076332B (zh) * 2023-10-13 2024-01-23 博智安全科技股份有限公司 一种测试用例的测试方法、装置、电子设备及存储介质

Similar Documents

Publication Publication Date Title
CN107273286B (zh) 针对任务应用的场景自动化测试平台及方法
US10162612B2 (en) Method and apparatus for inventory analysis
CN110008113B (zh) 一种测试方法、装置、电子设备
CN101924656B (zh) 一种基于动态配置的网络设备cli实现方法和装置
CN111752841A (zh) 单测模拟方法、装置、设备与计算机可读存储介质
Shahriar et al. Testing of memory leak in android applications
CN110633200A (zh) 用于测试智能合约的方法和设备
US20070061641A1 (en) Apparatus and method for generating test driver
CN111813394A (zh) 一种基于SpringBoot的Zeus框架的开发方法及Zeus框架
CN110673837B (zh) 代码修复方法及装置、电子设备、计算机可读存储介质
CN112148278A (zh) 可视化的区块链智能合约框架及智能合约开发部署方法
US20190050209A1 (en) Method and system to develop, deploy, test, and manage platform-independent software
CN103186463B (zh) 确定软件的测试范围的方法和系统
US10459698B2 (en) Framework for generating adapters in an integrated development environment
US20110016454A1 (en) Method and system for testing an order management system
CN117112060A (zh) 组件库构建方法、装置、电子设备及存储介质
CN111930398A (zh) 应用程序更新方法、装置、系统、介质及设备
CN110162310B (zh) 插件接口测试方法及装置、计算机设备及存储介质
CN114201397A (zh) 一种接口测试建模方法、装置、电子设备和存储介质
CN109284222B (zh) 软件单元、数据处理系统中的项目测试方法、装置及设备
CN117493188A (zh) 接口测试方法及装置、电子设备及存储介质
CN113590179B (zh) 插件检测方法、装置、电子设备及存储介质
CN113515452A (zh) 应用的自动测试方法、系统、电子设备及存储介质
CN116755684B (zh) OAS Schema的生成方法、装置、设备及介质
Bachelet et al. Designing expression templates with concepts

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