[0001]
本公开涉及计算机系统测试领域,具体涉及一种用例测试方法及终端。
背景技术:[0002]
在计算机系统测试中,常常通过对被测系统的用例进行测试实现对被测系统的测试。具体的,在对用例进行测试前,需要先构造出该用例具体的测试场景,从而对具体测试场景下的用例进行测试。
[0003]
现有技术中是先在用例的业务流转路径外部构造测试场景,进而根据外部构造的测试场景对用例进行测试。通过这种方法构造出的测试场景常常无法全面覆盖用例的测试场景,导致用例测试的测试场景覆盖率低下。
技术实现要素:[0004]
本公开的一个目的在于提出一种对用例测试方法及终端,以提高用例测试的测试场景覆盖率。
[0005]
根据本公开实施例的一方面,公开了一种用例测试方法,所述方法包括:
[0006]
获取待测试用例的业务流转路径;
[0007]
于业务流转路径内部构造测试场景;
[0008]
根据所述测试场景对待测试用例进行测试。
[0009]
根据本公开实施例的一方面,公开了一种用例测试终端,所述终端包括:
[0010]
获取模块,用于获取待测试用例的业务流转路径;
[0011]
构造模块,用于于业务流转路径内部构造测试场景;
[0012]
测试模块,用于根据所述测试场景对待测试用例进行测试。
[0013]
现有技术中于待测试用例的业务流转路径外部构造测试场景,即,从业务流程节点层面考虑业务流转路径可能出现的分支,进而构造测试场景。从而导致现有技术对测试场景的构造的颗粒精细程度止步于业务流程节点层面,导致测试场景覆盖率低下。本公开实施例在进行用例测试时,于待测试用例的业务流转路径内部构造测试场景,即,从计算机系统的函数节点层面考虑业务流转路径可能出现的分支,进而构造测试场景。从而本公开实施例能够以更小的颗粒度对测试场景进行构造,提高用例测试的测试场景覆盖率。
[0014]
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
[0015]
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本公开。
附图说明
[0016]
通过参考附图详细描述其示例实施例,本公开的上述和其它目标、特征及优点将变得更加显而易见。
[0017]
图1示出了根据本公开一个实施例的用例测试方法的体系构架图。
[0018]
图2示出了根据本公开一个实施例的于业务流转路径内部结构示意图。
[0019]
图3示出了根据本公开一个实施例的逻辑结构组成。
[0020]
图4示出了根据本公开一个实施例的逻辑结构组成。
[0021]
图5示出了根据本公开一个实施例的用例测试方法的流程图。
[0022]
图6示出了根据本公开一个实施例的用例测试终端的模块图。
[0023]
图7示出了根据本公开一个实施例的用例测试终端的硬件结构图。
具体实施方式
[0024]
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些示例实施方式使得本公开的描述将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。
[0025]
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多示例实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的示例实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、步骤等。在其它情况下,不详细示出或描述公知结构、方法、实现或者操作以避免喧宾夺主而使得本公开的各方面变得模糊。
[0026]
附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
[0027]
下面首先参考图1描述本公开实施例的体系构架。
[0028]
图1示出了本公开实施例体系构架所涉及的实体:测试执行器10与被测系统20。其中,测试执行器10控制待测试用例的测试场景的构造,被测系统20运行测试执行器10构造的测试场景,从而得到运行结果,实现对待测试用例的测试。
[0029]
具体的,测试执行器10获取被测系统20中待测试用例的业务流转路径,于业务流转路径内部构造测试场景;进而使得被测系统20运行测试执行器10于业务流转路径内部构造的测试场景,得到运行结果;进一步地,测试执行器10通过对运行结果的分析,得到待测试用例的测试结果,实现对待测试用例的测试。
[0030]
图2示出了在一实施例中,业务流转路径的内部结构。该实施例中,对于待测试用例的一条业务流转路径,该业务流转路径的执行是按照函数节点a调用函数节点b、函数节点b调用函数节点c、函数节点c调用函数节点d的顺序进行的。测试执行器通过设置钩子,对函数节点之间的信息活动进行监控、截获。测试执行器每执行一次截获,即能够根据预设的测试场景规则在钩子截获点相应地构造测试场景。
[0031]
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和范围造成限制。
[0032]
为了能够更全面地展示本公开实施例的具体实施过程,在对本公开实施例的具体
实施过程进行详细描述之前,下面先参考图3以及图4对本公开一实施例的逻辑结构组成进行简要描述。
[0033]
图3示出了本公开一实施例涉及到的实体以及主要逻辑结构组成。该实施例涉及到的实体有:测试执行器、被测系统;涉及到的主要逻辑结构组成有:业务流转路径集合、精准路径集合、主控钩子、代理钩子、测试场景规则。
[0034]
其中,业务流转路径是指被测系统在进行业务流转时所执行的路径,具体的,在计算机系统中,业务流转路径体现为被测系统执行的函数调用链路,如图2所示。
[0035]
例如:被测系统进行退款相关的业务流转时,“退款至微信余额”即为被测系统的一条业务流转路径;具体的,在计算机系统中,“退款至微信余额”这一业务流转路径可以体现为“函数节点a调用函数节点b、函数节点b调用函数节点c、函数节点c调用函数节点d”这一函数调用链路。
[0036]
业务流转路径集合是指被测系统进行业务流转时所有可能所执行的路径的集合。
[0037]
例如:被测系统进行业务流转时所有可能所执行的路径有——“退款至微信余额”、“退款至银行卡”、“转账至微信余额”以及“转账至银行卡”。则被测系统的业务流转路径集合即为——【“退款至微信余额”、“退款至银行卡”、“转账至微信余额”、“转账至银行卡”】。
[0038]
精准路径集合是指针对被测系统的一特定用例,在对该用例进行测试的过程中,截止到测试进行的当前时间点,尚未被执行测试过的该用例的业务流转路径。
[0039]
例如:被测系统中,“退款”这一用例的所有业务流转路径有——“退款至微信余额”、“退款至银行卡”。截止到测试进行的当前时间点,“退款至微信余额”这一条业务流转路径已经被执行测试过,尚未被执行测试过的该用例的业务流转路径为“退款至银行卡”,则在当前时间点该用例的精准路径集合为——【“退款至银行卡”】。
[0040]
主控钩子(即,hook master)与代理钩子(即,hook agent)属于同一个钩子(即,hook)。钩子是指一种能够监控、截获信息活动的程序。钩子截获信息活动后,能够取代原负责处理该信息活动的函数节点,对该信息活动进行后续的控制。
[0041]
本公开实施例中,代理钩子位于被测系统内部,负责对被测系统内部业务流转路径的信息活动进行监控、截获,直接控制业务流转路径内部的测试场景构造;属于同一钩子的主控钩子位于测试执行器内部,负责与代理钩子进行通信,能够实时获取代理钩子对被测系统内部业务流转路径的信息活动监控、截获情况;测试执行器向主控钩子发送有关构造测试场景的指令,从而控制代理钩子于业务流转路径内部构造测试场景。
[0042]
测试场景规则是指如何在业务流转路径内部构造测试场景的规则,可由测试人员预先设定。
[0043]
具体的,测试执行器在读取业务流转路径集合、精准路径集合之后,根据测试场景规则、以及被测系统内部业务流转路径的信息活动情况,通过主控钩子控制代理钩子,于被测系统的业务流转路径内部相应地构造测试场景。
[0044]
图4进一步示出了本公开一实施例各逻辑结构组成、以及各逻辑结构组成的生成过程。该实施例的逻辑结构组成包括:测试执行逻辑、业务流转路径集合、精准路径集合、钩子库、主控钩子与代理钩子、测试场景规则。
[0045]
其中,测试执行逻辑是指测试执行器对用例进行测试时,全程所遵循的执行逻辑
的集合。测试执行逻辑由测试人员预先写入测试执行器,使得测试执行器能够根据测试执行逻辑执行本公开实施例。
[0046]
测试执行器对被测系统中的代码源文件进行代码预处理,获取被测系统的函数调用链,进而获取业务流转路径集合。
[0047]
测试执行器对被测系统中的代理源文件进行代码预处理,除了能够获取被测系统的函数调用链,还能够获取被测系统的系统应用编程接口原型、业务应用编程接口原型,进而生成针对被测系统的钩子库。钩子库中的钩子能够对业务流转路径中(具体的,对在计算机系统中体现为函数调用链的业务流转路径)各函数节点之间的信息活动进行监控、截获,进而于业务流转路径内部构造测试场景。具体的,代理钩子对业务流转路径中各函数节点之间的信息活动进行监控、截获,主控钩子控制代理钩子于业务流转路径内部构造测试场景。
[0048]
测试执行器将被测系统的用例集合中的每一个用例与对应的业务流转路径进行关联、映射,从而得到每一个用例与对应业务流转路径的映射。在测试执行的过程中,测试执行器通过比较当前正在测试的用例已测试覆盖过的业务流转路径,与该用例映射的对应业务流转路径进行对比,从而得到该用例在当前时间点的精准路径集合。
[0049]
该实施例中,测试执行器根据测试执行逻辑,读取测试场景规则、业务流转路径集合、精准路径集合,通过钩子库中针对待测试用例的主控钩子与代理钩子,于业务流转路径内部构造测试场景,具体的,于在计算机系统中体现为函数调用链的业务流转路径的内部构造测试场景。
[0050]
需要说明的是,该实施例只是示例性对本公开一实施例的示例性简要说明,旨在展现出实际执行过程中本公开一实施例的大体组成与大致流程,不应对本公开的功能和范围造成限制。
[0051]
下面参考图5对本公开实施例的具体实施过程进行详细描述。
[0052]
本公开实施例的执行主体为图1所示的测试执行器,如图5所示,一种用例测试方法,包括:
[0053]
步骤310、获取待测试用例的业务流转路径;
[0054]
步骤320、于业务流转路径内部构造测试场景;
[0055]
步骤330、根据所述测试场景对待测试用例进行测试。
[0056]
本公开实施例在对待测试用例进行测试时,针对待测试用例的每一条业务流转路径,于每一条业务流转路径内部构造测试场景,进而根据构造出的测试场景对待测试用例进行测试,从而提高测试场景的覆盖率。
[0057]
在一实施例中,测试执行器要对被测系统中每一个用例都进行测试。测试执行器按照图5所示的流程,将被测系统中的每一个用例作为待测试用例进行测试。
[0058]
由此可见,在对待测试用例执行测试之前,具体的,在获取待测试用例的业务流转路径之前,需要先生成被测系统的业务流转路径集合。下面结合图4对业务流转路径集合的生成的具体实施过程进行详细描述。
[0059]
在一实施例中,在所述获取待测试用例的业务流转路径之前,包括:
[0060]
获取待测试用例所在的被测系统的业务方法原型;
[0061]
获取待测试用例所在的被测系统的函数调用链;
[0062]
基于所述业务方法原型、所述函数调用链,获取所述被测系统中的每一条业务流转路径。
[0063]
业务方法原型是指可以被实例化为具体业务方法的空对象,业务方法原型可以衍生出多个具体业务方法。
[0064]
函数调用链是指描述了函数节点之间调用关系的链路。
[0065]
通过业务方法原型与函数调用链之间的组合,可以得到描述了业务流转过程的函数节点链路,即,业务流转路径。打个比方:将业务流转路径看作能够实现具体功能的建筑,将业务方法原型看作描述了要建造具有何种具体功能的建筑的指导性手册,将函数调用链看作描述了各类基础建材之间在各种情况下如何进行连接的蓝图,将函数节点看作基础建材。按照指导性手册与蓝图的组合对各类基础建材进行连接,即可得到对应具体功能的建筑。
[0066]
该实施例中,测试执行器获取待测试用例所在的被测系统的业务方法原型、以及函数调用链,按照业务方法原型,根据函数调用链对函数节点进行组合,从而得到被测系统中的每一条业务流转路径,即,得到了被测系统的业务流转路径集合。
[0067]
该实施例的优点在于,通过对被测系统的所有业务方法原型、以及函数调用链的提取,使得在此基础上能够获取被测系统中所有的业务流转路径。
[0068]
在一实施例中,所述获取待测试用例所在的被测系统的业务方法原型,包括:
[0069]
对被测系统的代码源文件进行代码预处理,得到被测系统的语法树;
[0070]
遍历被测系统的语法树,获取被测系统的业务方法原型。
[0071]
语法树(syntax tree),或者说抽象语法树ast(abstract syntax tree),是指抽象语法结构的树状表现形式的源代码。
[0072]
该实施例中,测试执行器对被测系统的代码源文件进行代码预处理,具体的,对被测系统的代码源文件进行编译前端处理,得到被测系统的语法树。对被测系统的语法树进行遍历,获取被测系统中各个业务方法原型。
[0073]
该实施例的优点在于,通过遍历被测系统的语法树,能够完整得到被测系统中所有的业务方法原型。
[0074]
在一实施例中,所述遍历被测系统的语法树,获取被测系统的业务方法原型,包括:
[0075]
通过递归方式按照深度优先搜索算法遍历语法树,获取被测系统的业务方法原型。
[0076]
深度优先搜索算法dfs(depth first search)是一种用于遍历树或图的算法,沿着树的深度遍历树的节点,尽可能深地搜索树的分支,属于盲目搜索。
[0077]
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和范围造成限制。
[0078]
在一实施例中,所述获取待测试用例所在的被测系统的函数调用链,包括:
[0079]
对被测系统的代码源文件进行代码预处理,得到被测系统的语法树;
[0080]
遍历被测系统的语法树,获取被测系统的函数调用链。
[0081]
该实施例的优点在于,通过遍历被测系统的语法树,能够完整的大被测系统中所有的函数调用链。
[0082]
在一实施例中,所述遍历被测系统的语法树,获取被测系统的函数调用链,包括:
[0083]
通过递归方式按照深度优先搜索算法遍历语法树,获取被测系统的函数调用链。
[0084]
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和范围造成限制。
[0085]
在一实施例中,测试执行器通过钩子实现于业务流转路径内部的测试场景构造。业务流转路径会涉及到各种各样的函数节点,对于不同类的函数节点,就需要使用不同的钩子对其进行监控、截获。
[0086]
由此可见,在对待测试用例执行测试之前,具体的,在获取待测试用例的业务流转路径之前,需要先生成用于对业务流转路径中各函数节点进行监控、截获的钩子库。下面结合图4对钩子库的生成的具体实施过程进行详细描述。
[0087]
在一实施例中,在所述于业务流转路径内部构造测试场景之前,包括:
[0088]
获取待测试用例所在的被测系统中的应用编程接口原型;
[0089]
针对每一个应用编程接口原型,构造与所述应用编程接口原型相同定义的钩子。
[0090]
应用编程接口原型是指能够实例化为具体应用编程接口的空对象,应用编程接口原型能够衍生出多个应用编程接口。
[0091]
应用编程接口则是在计算机系统中对函数节点统一进行控制的接口,每个应用编程接口都会控制相应的一部分函数节点的信息活动。
[0092]
该实施例中,测试执行器从待测试用例所在的被测系统中获取各个应用编程接口原型,针对每一个应用编程接口原型,构造与该应用编程接口原型相同定义的钩子,从而得到被钩子库。
[0093]
该实施例的优点在于,通过生成与各应用编程接口原型具有相同定义的钩子,使得钩子能够取代各应用编程接口原型所衍生的应用编程接口,进而能够对各函数节点进行控制。
[0094]
在一实施例中,所述获取待测试用例所在的被测系统中的应用编程接口原型,包括:
[0095]
基于所述被测系统的官方应用编程接口文档,提取所述被测系统的系统应用编程接口原型;
[0096]
基于所述被测系统的官方应用编程接口文档,提取所述被测系统的业务应用编程接口原型。
[0097]
系统应用编程接口是指控制系统基础运行功能相关函数的应用编程接口,相应的,系统应用编程接口原型是指控制系统基础运行功能相关函数的应用编程接口的原型。
[0098]
业务应用编程接口是指控制系统业务流转功能相关函数的应用编程接口,相应的,业务应用编程接口原型是指控制系统业务流转功能相关函数的应用编程接口的原型。
[0099]
该实施例中,测试执行器获取被测系统的官方应用编程接口文档,在此基础上,提取被测系统的系统应用编程接口原型与业务应用编程接口原型,进而针对每一个应用编程接口原型,构造相同定义的钩子。
[0100]
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和范围造成限制。
[0101]
在一实施例中,测试执行器对待测试用例进行测试时,是针对从该用例的精准路
径集合中选取的业务流转路径进行测试的。通过上述说明可见,精准路径集合是指待测试用例尚未被测试覆盖的业务流转路径的集合,也就是说,随着对待测试用例测试的进行,精准路径集合是动态变化的。因此,下面对精准路径集合的动态生成的具体过程进行详细描述。
[0102]
在一实施例中,在获取待测试用例的业务流转路径之前,包括:
[0103]
获取待测试用例所在的被测系统的用例集合;
[0104]
获取待测试用例所在的被测系统的业务流转路径集合。
[0105]
该实施例中,测试执行器要对被测系统中的每一个用例的每一条业务流转路径都执行测试,以全面覆盖被测系统,因此获取被测系统的用例集合、业务流转路径集合。
[0106]
在一实施例中,在获取待测试用例的业务流转路径之前,包括:
[0107]
获取待测试用例所在的被测系统中的每一条业务流转路径;
[0108]
获取所述被测系统中的每一个待测试用例;
[0109]
将每一个待测试用例与对应的业务流转路径进行关联。
[0110]
该实施例中,测试执行器从被测系统的业务流转路径集合中获取每一条业务流转路径,从被测系统的用例集合中获取每一个待测试用例。将每一个待测试用例与其对应的业务流转路径进行关联,从而得到了待测试用例与业务流转路径的映射关系,进而能够在对单一用例进行测试时,测试该用例的所有业务流转路径。
[0111]
在一实施例中,在获取待测试用例的业务流转路径之前,包括:
[0112]
通过钩子对被测系统已测试覆盖的业务流转路径进行记录;
[0113]
对比待测试用例关联的业务流转路径与被测系统已测试覆盖的业务流转路径,将所述待测试用例未测试覆盖的业务流转路径汇总为所述待测试用例的精准路径集合。
[0114]
该实施例中,测试执行器通过预先设置钩子,由钩子对已测试覆盖的业务流转路径进行实时记录。每当测试执行器测试完毕用例的一条业务流转路径,要再选取该用例的另一条业务流转路径进行测试时,测试执行器通过对比已测试覆盖的业务流转路径以及该用例关联的所有业务流转路径,将该待用例未测试覆盖的业务流转路径汇总为该用例的精准路径集合。
[0115]
该实施例的优点在于,通过钩子对被测系统已测试覆盖的业务流转路径进行实时记录,从而能够动态地生成待测试用例的精准路径集合。
[0116]
在一实施例中,待测试用例未测试覆盖的业务流转路径包括新产生的业务流转路径。
[0117]
由于被测系统是动态的,相应的,部分函数节点的变化可能会导致新的业务流转路径的产生。这一部分新产生的业务流转路径并不在测试启动时被测系统的业务流转路径集合中。该实施例中,每当出现新产生的业务流转路径,就要将其补充到对应的待测试用例的精准路径集合中,以保证用例测试的业务流转路径的全面覆盖。
[0118]
该实施例的优点在于,通过及时补充新产生的业务流转路径,保证了用例测试过程中业务流转路径的动态全面覆盖。
[0119]
在一实施例中,所述通过钩子对被测系统已测试覆盖的业务流转路径进行记录,包括:
[0120]
在被测系统启动时执行地址替换,将被测系统的原始应用编程接口替换为对应的
应用编程接口原型对应的钩子;
[0121]
通过钩子对用例测试期间被测系统触发的函数节点及时间信息进行记录;
[0122]
基于所述触发的函数节点及时间信息,生成被测系统已测试覆盖的业务流转路径。
[0123]
由上述关于钩子库生成的说明可见,由于钩子库中的每个钩子是与对应的应用编程接口原型具有相同定义的,因此每个钩子都可以执行对应的应用编程接口原型的功能。即,应用编程接口原型所衍生的应用编程接口,都可以被对应的钩子替代掉,由钩子对应用编程接口所负责控制的函数节点的信息活动进行控制。
[0124]
该实施例中,通过将原始应用编程接口的地址替换为钩子的地址,使得钩子能够取代原始应用编程接口,为相应的函数节点提供服务,同时也就能够对被测系统触发对函数节点已经时间信息进行记录,进而生成被测系统已测试覆盖的业务流转路径。
[0125]
在一实施例中,所述在被测系统启动时执行地址替换,包括:
[0126]
在被测系统启动时通过so加载的方式执行地址替换。
[0127]
so指的是动态链接库,相应的,该实施例中通过so加载的方式执行地址替换指的是通过动态链接库加载的方式执行地址替换。
[0128]
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和范围造成限制。
[0129]
经过以上对业务流转路径集合的生成、钩子库的生成、精准路径集合的生成的详细描述,下面直接对于业务流转路径内部构造测试场景,进而对待测试用例进行测试的具体过程进行详细描述。
[0130]
在步骤310中,获取待测试用例的业务流转路径。
[0131]
在一实施例中,测试执行器依次从被测系统的用例集合中选取一待测试用例进行测试。每次对该待测试用例的一条业务流转路径进行测试,直到对该测试用例的所有业务流转路径都测试过之后,再对用例集合中的下一条待测试用例进行测试,直到对用例集合中的所有待测试用例都测试过。
[0132]
在一实施例中,在所述获取待测试用例的业务流转路径之前,包括:
[0133]
获取待测试用例所在的被测系统的业务方法原型;
[0134]
获取待测试用例所在的被测系统的函数调用链;
[0135]
基于所述业务方法原型、所述函数调用链,获取所述被测系统中的每一条业务流转路径。
[0136]
该实施例的具体实施过程已在业务流转路径集合的生成过程中进行了描述,故在此不再赘述。
[0137]
在一实施例中,在所述获取待测试用例的业务流转路径之前,包括:
[0138]
获取待测试用例所在的被测系统中的每一条业务流转路径;
[0139]
获取所述被测系统中的每一个待测试用例;
[0140]
将每一个待测试用例与对应的业务流转路径进行关联。
[0141]
该实施例的具体实施过程已在精准路径集合的生成过程中进行了描述,故在此不再赘述。
[0142]
在一实施例中,所述获取待测试用例的业务流转路径,包括:
[0143]
根据待测试用例关联的业务流转路径标识,获取业务流转路径。
[0144]
业务流转路径标识是指能够唯一识别业务流转路径的信息。例如:业务流转路径的函数节点调用序列。若一业务流转路径是通过函数a调用函数b,函数b调用函数c,函数c再调用函数d执行的,则该业务流转路径的标识可以为“a/b/c/d”。
[0145]
该实施例中,用例和其对应的业务流转路径建立了关联、映射,相应的,业务流转路径标识与对应的用例关联存储。
[0146]
在一实施例中,所述业务流转路径标识与对应的用例关联存储包括:
[0147]
建立用例-路径映射表,所述用例-路径映射表中存储着每一个用例及该用例所关联的业务流转路径标识。
[0148]
该实施例中,测试执行器可以通过查询用例-路径映射表获取待测试用例关联的每一个业务流转路径标识,进而获取对应的业务流转路径。
[0149]
该实施例的优点在于,预先建立用例-路径映射表,能够通过查表快速获取待测试用例的业务流转路径。
[0150]
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和范围造成限制。
[0151]
在一实施例中,所述获取待测试用例的业务流转路径,包括:
[0152]
从待测试用例的精准路径集合中,获取所述用例的业务流转路径。
[0153]
该实施例中,测试执行器每次从待测试用例的精准路径集合中选取一条业务流转路径进行测试。
[0154]
精准路径集合的生成过程中已在以上说明中进行了描述,故在此不再赘述。
[0155]
在步骤320中,于业务流转路径内部构造测试场景。
[0156]
在一实施例中,于业务流转路径内部构造测试场景,是指于精准路径集合内的业务流转路径内部构造测试场景。
[0157]
在一实施例中,所述于业务流转路径内部构造测试场景,包括:
[0158]
针对业务流转路径中的每一函数节点,构造所述函数节点所能导向的所有测试场景。
[0159]
业务流转路径中的每一函数节点一般都会存在多个返回值,每个返回值都可以看作该函数节点的一个分支,进而该分支能够导向对应的测试场景。
[0160]
该实施例中,测试执行器对业务流转路径中的每一函数节点进行检查,根据该函数节点可能存在的分支,相应地构造该函数节点所能导向的所有测试场景。
[0161]
该实施例的优点在于,针对每一函数节点进行测试场景的构造,降低了测试场景构造的颗粒度,提高了测试场景的覆盖率。
[0162]
在一实施例中,在所述于业务流转路径内部构造测试场景之前,包括:
[0163]
获取待测试用例所在的被测系统中的应用编程接口原型;
[0164]
针对每一个应用编程接口原型,构造与所述应用编程接口原型相同定义的钩子。
[0165]
该实施例的具体实施过程已在上述钩子库的生成过程中进行了描述,故在此不再赘述。
[0166]
在一实施例中,所述构造所述函数节点所能导向的所有测试场景,包括:
[0167]
将用于控制所述函数节点的原始应用编程接口,替换为所述原始应用编程接口对
应的应用编程接口原型所对应的钩子;
[0168]
通过所述钩子构造所述函数节点所能导向的所有测试场景。
[0169]
原始应用编程接口是指被测系统原有的应用编程接口。
[0170]
计算机系统中是由各应用编程接口控制函数节点的信息活动的。通过将原始应用编程接口替换为与该原始应用编程接口对应的应用编程接口原型所对应的钩子,使得钩子能够取得函数节点的控制权。
[0171]
测试执行器通过钩子处理原始应用编程接口的调用。由于原始应用编程接口被对应的钩子替换掉,因此原始应用编程接口对函数节点的调用控制将由对应的钩子负责处理。若测试执行器不对函数节点的信息活动进行干涉,则钩子像原始应用编程接口一样为函数节点提供相应的服务;若测试执行器决定对函数节点的信息活动进行干涉,则通过钩子对函数节点的信息活动进行相应的控制。
[0172]
该实施例的优点在于,使用钩子替换原始应用编程接口,使得测试执行器能够通过钩子实时地对被测系统内各函数节点的信息活动进行监控。
[0173]
在一实施例中,所述钩子由位于所述被测系统外的主控钩子、以及位于所述被测系统中的代理钩子组成,所述主控钩子控制所述代理钩子的动作执行。
[0174]
在一实施例中,所述将用于控制所述函数节点的原始应用编程接口,替换为所述原始应用编程接口对应的应用编程接口原型所对应的钩子,包括:
[0175]
将用于控制所述函数节点的原始应用编程接口,替换为所述原始应用编程接口对应的应用编程接口原型所对应的代理钩子。
[0176]
该实施例中,由于在被测系统中直接执行控制动作的是代理钩子,故使用代理钩子替代被测系统中的原始应用编程接口。
[0177]
在一实施例中,所述通过所述钩子构造所述函数节点所能导向的所有测试场景,包括:
[0178]
通过主控钩子控制代理钩子构造所述函数节点所能导向的所有测试场景。
[0179]
该实施例中,测试执行器通过主控钩子向被测系统中的代理钩子下发指令,从而控制代理钩子构造测试场景。
[0180]
本公开实施例中,代理钩子以独立线程运行于被测系统内,根据来自主控钩子的指令执行测试场景的构造。
[0181]
由于代理钩子是以独立线程运行于被测系统内的,也就是说,代理钩子于业务流转路径内部的测试场景构造的影响范围仅限于该线程内部,不会对被测系统其它进程造成任何影响。
[0182]
而现有技术中于业务流转路径外部的测试场景构造的影响范围是整个被测系统。这种情况下随着用例测试的进行、测试场景的构造,被测系统的稳定性将大幅下降,尤其是需要构造异常测试场景时。例如:现有技术中,若用例测试过程中需要构造“磁盘空间满”这一异常测试场景,测试人员只能于业务流转路径外部构造出“磁盘空间满”这一异常被测系统环境。这就会导致被测系统的磁盘空间确实变满,从而影响被测系统其它进程的运行,甚至可能会导致被测系统崩溃。
[0183]
而本公开实施例中,测试场景的构造是通过独立线程的代理钩子,于业务流转路径内部构造得到的。若用例测试过程中需要构造“磁盘空间满”这一异常测试场景,测试执
行器只需通过代理钩子向相应的函数节点传递“磁盘空间满”的参数,即可构造出“磁盘空间满”这一异常测试场景,而不会对被测系统其他进程的运行造成影响,保证了被测系统的稳定性。
[0184]
同时,现有技术中于业务流转路径外部对测试场景的构造,通常会涉及对被测系统环境的更改,导致构造的困难、效率低、难以大规模开展。而本公开实施例通过与独立线程的代理钩子,于业务流转路径内部对测试场景的构造,不需要对被测系统环境进行更改,构造难度低、效率高、容易大规模开展。
[0185]
进一步的,实际的系统测试中,测试困难之处主要集中在两个方面:一是被测系统使用了大量的系统函数或者标准库函数,来完成诸如内存管理、磁盘读写、网络通信等功能,测试需要覆盖这些函数的异常情况;二是被测系统自身存在诸多条件分支、异常分支、并发时序等潜在难以覆盖的场景。现有技术中从外部构造测试场景,构造困难、效率低、覆盖率,而且往往会影响被测系统中其它进程或当前进程的其它函数的调用。
[0186]
本公开实施例通过钩子对被测系统的业务流转路径内部各函数节点间的信息活动进行监控、截获,以函数级别的精准度构造测试场景,实现测试场景的自动化构造,简化了测试场景的构造流程,提高了测试场景的覆盖率;由于在业务流转路径内部构造测试场景,是在计算机系统的函数节点层面构造测试场景,从而增强了测试场景的重复利用性;同时由于构造的颗粒度较之现有技术更小,能够发现被测系统中更多潜在的异常场景及并发时序问题,从而对被测系统进行更为全面的测试。
[0187]
本公开实施例中,主控钩子可以基于自定义扩展的规则文件对每个函数节点进行自定义处理。
[0188]
通过自定义拓展的规则文件,提高了测试执行器中主控钩子对函数节点的处理灵活度。
[0189]
在步骤330中,根据所述测试场景对待测试用例进行测试。
[0190]
本公开实施例中,测试执行器于业务流转路径内部构造测试场景后,被测系统根据测试执行器构造的测试场景,运行相应的测试场景,并将运行结果返回给测试执行器。测试执行器对运行结果进行分析,从而得到测试结果。
[0191]
在一实施例中,对于“退款至银行卡”这一业务流转路径,该业务流转路径的业务流程为“接收退款金额->检查退款金额->退款”。其中,“检查退款金额”这一业务流程节点,在计算机系统层面,通过“函数c->函数a->函数b”实现。
[0192]
现有技术中在针对该业务流转路径进行测试场景的构造时,只能从业务流程节点的分支进行考虑:对于“检查退款金额,退款金额超出余额”这一分支构造相应的测试场景;对于“检查退款金额,退款金额未超出余额”这一分支构造相应的测试场景。
[0193]
而本公开对每一函数可能出现的分支进行考虑:对于函数c的每个返回值构造相应的测试场景、对于函数a的每个返回值构造相应的测试场景、对于函数b的每个返回值构造相应的测试场景。
[0194]
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和范围造成限制。
[0195]
通过以上说明可见,本公开中的测试执行器通过于业务流转路径内部构造测试场景,即,通过对业务流转路径内的每一函数节点进行考虑,构造每一函数节点所能导向的测
试场景,相比于现有技术中只能从业务流程节点层面进行考虑进而构造测试场景,减小了测试场景构造的颗粒度,提高了测试场景的覆盖率。
[0196]
根据本公开一实施例,如图6所示,还提供了一种用例测试装置,所述装置包括:
[0197]
获取模块410,用于获取待测试用例的业务流转路径;
[0198]
构造模块420,用于于业务流转路径内部构造测试场景;
[0199]
测试模块430,用于根据所述测试场景对待测试用例进行测试。
[0200]
在本公开的一示例性实施例中,所述构造模块420还用于针对业务流转路径中的每一函数节点,构造所述函数节点所能导向的所有测试场景。
[0201]
在本公开的一示例性实施例中,在所述构造模块420之前还包括:
[0202]
接口原型获取模块,用于获取待测试用例所在的被测系统中的应用编程接口原型;
[0203]
钩子构造模块,用于针对每一个应用编程接口原型,构造与所述应用编程接口原型相同定义的钩子。
[0204]
在本公开的一示例性实施例中,所述构造模块420还包括:
[0205]
替换模块,用于将用于控制所述函数节点的原始应用编程接口,替换为所述原始应用编程接口对应的应用编程接口原型所对应的钩子;
[0206]
对函数节点构造模块,用于通过所述钩子构造所述函数节点所能导向的所有测试场景。
[0207]
在本公开的一示例性实施例中,所述钩子由位于所述被测系统外的主控钩子、以及位于所述被测系统中的代理钩子组成,所述主控钩子控制所述代理钩子的动作执行。
[0208]
在本公开的一示例性实施例中,所述替换模块还用于将用于控制所述函数节点的原始应用编程接口,替换为所述原始应用编程接口对应的应用编程接口原型所对应的代理钩子。
[0209]
在本公开的一示例性实施例中,所述对函数节点构造模块还用于通过主控钩子控制代理钩子构造所述函数节点所能导向的所有测试场景。
[0210]
在本公开的一示例性实施例中,在所述获取模块410之前还包括:
[0211]
方法原型获取模块,用于获取待测试用例所在的被测系统的业务方法原型;
[0212]
函数调用链获取模块,用于获取待测试用例所在的被测系统的函数调用链;
[0213]
第一路径获取模块,用于基于所述业务方法原型、所述函数调用链,获取所述被测系统中的每一条业务流转路径。
[0214]
在本公开的一示例性实施例中,在所述获取模块410之前还包括:
[0215]
第二路径获取模块,用于获取待测试用例所在的被测系统中的每一条业务流转路径;
[0216]
待测试用例获取模块,用于获取所述被测系统中的每一个待测试用例;
[0217]
关联模块,用于将每一个待测试用例与对应的业务流转路径进行关联。
[0218]
本公开实施例的用例测试方法可以由图1所示的测试执行器10实现。下面参考图7来描述根据本公开实施例的测试执行器10。图7显示的测试执行器10仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
[0219]
如图7所示,测试执行器10以通用计算设备的形式表现。测试执行器10的组件可以
包括但不限于:上述至少一个处理单元510、上述至少一个存储单元520、连接不同系统组件(包括存储单元520和处理单元510)的总线530。
[0220]
其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元510执行,使得所述处理单元510执行本说明书上述示例性方法的描述部分中描述的根据本发明各种示例性实施方式的步骤。例如,所述处理单元510可以执行如图3中所示的各个步骤。
[0221]
存储单元520可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(ram)5201和/或高速缓存存储单元5202,还可以进一步包括只读存储单元(rom)5203。
[0222]
存储单元520还可以包括具有一组(至少一个)程序模块5205的程序/实用工具5204,这样的程序模块5205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
[0223]
总线530可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
[0224]
测试执行器10也可以与一个或多个外部设备600(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该测试执行器10交互的设备通信,和/或与使得该测试执行器10能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口550进行。并且,测试执行器10还可以通过网络适配器560与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图所示,网络适配器560通过总线530与测试执行器10的其它模块通信。应当明白,尽管图中未示出,可以结合测试执行器10使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。
[0225]
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本公开实施方式的方法。
[0226]
在本公开的示例性实施例中,还提供了一种计算机程序介质,其上存储有计算机可读指令,当所述计算机可读指令被计算机的处理器执行时,使计算机执行上述方法实施例部分描述的方法。
[0227]
根据本公开的一个实施例,还提供了一种用于实现上述方法实施例中的方法的程序产品,其可以采用便携式紧凑盘只读存储器(cd-rom)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0228]
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举
的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(rgm)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。
[0229]
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0230]
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、rf等等,或者上述的任意合适的组合。
[0231]
可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如jgvg、c++等,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(kgn)或广域网(wgn),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
[0232]
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
[0233]
此外,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
[0234]
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、移动终端、或者网络设备等)执行根据本公开实施方式的方法。
[0235]
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由所附的权利要求指出。