程序代码测试方法及装置与流程

文档序号:18373855发布日期:2019-08-07 01:56阅读:293来源:国知局
程序代码测试方法及装置与流程

本发明涉及计算机技术领域,更具体地说,涉及程序代码测试方法及装置。



背景技术:

白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。盒子指的是被测试软件(或程序),白盒指的是盒子是可视的,盒子内部的东西以及里面是如何运作是清楚的。

传统白盒测试的覆盖标准之一是逻辑覆盖。逻辑覆盖又包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖,其最终目的是将所有路径都执行至少一遍。如图1所示,程序代码从入口节点到出口节点,需要经过逻辑层,逻辑覆盖最终期望覆盖其所有可能的逻辑分支,最终到达所有的逻辑出口节点。

传统白盒测试具有如下缺点:

路径不可能完全覆盖,如图1所示,逻辑层如果要全部覆盖,需要9次路径覆盖。但图1仅仅包含两层逻辑,假定逻辑层包含m层,每层分支可能性是[n0,n1,n2...nm],则总的可能性为当逻辑层到达32层,每层分支逻辑为2种,可能性就达到几十亿次,并且,这种逻辑覆盖没有针对性。



技术实现要素:

有鉴于此,本发明实施例的目的在于提供程序代码测试方法及装置,以降低传统路径覆盖带来的海量检测,以及检测无针对性的问题。

为实现上述目的,本发明实施例提供如下技术方案:

一种程序代码测试方法,包括:

获取本次测试的测试目的;

搜索所述程序代码对应的逻辑拓扑树,得到与所述测试目的相关的逻辑出口节点,作为目标逻辑出口节点;其中,所述逻辑拓扑树包括多条逻辑路径;所述逻辑路径包含多个节点,所述多条逻辑路径共用同一逻辑入口;所述包含所述目标逻辑出口节点的逻辑路径为目标逻辑路径;

以所述目标逻辑出口节点为起点,对所述逻辑拓扑树中包含所述目标逻辑出口节点的逻辑路径进行逻辑测试。

一种程序代码测试装置,包括:

获取单元,用于获取本次测试的测试目的;

确定单元,用于搜索所述程序代码对应的逻辑拓扑树,得到与所述测试目的相关的逻辑出口节点,作为目标逻辑出口节点;其中,所述逻辑拓扑树包括多条逻辑路径;所述逻辑路径包含多个节点,所述多条逻辑路径共用同一逻辑入口;所述包含所述目标逻辑出口节点的逻辑路径为目标逻辑路径;

测试单元,用于以所述目标逻辑出口节点为起点,对所述逻辑拓扑树中包含所述目标逻辑出口节点的逻辑路径进行逻辑测试。

可见,在本实施例中,是对包含与测试目的相关的逻辑出口节点的逻辑路径进行逻辑测试,而不是对所有的逻辑路径进行逻辑测试。由于是基于测试目的进行的逻辑测试,因此,与传统白盒测试相比,本发明实施例所提供的程序代码测试方案更具有针对性。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1、图2c为本发明实施例提供的抽象的代码覆盖图示意图;

图2d-2f为本发明实施例提供的逻辑拓扑树示意图;

图2a为本发明实施例提供的通用计算机结构示意图;

图2b、图3a、图3b、图4和图5c为本发明实施例提供的程序代码测试方法流程图;

图3c为本发明实施例提供的检查逻辑的逻辑图示意图;

图3d为本发明实施例提供的程序代码示意图;

图3e为本发明实施例提供的检查逻辑的逻辑图另一示意图;

图5a为本发明实施例提供的金币系统简化流程示意图;

图5b为本发明实施例提供的金币系统倒推逆演的示意图;

图6a和图6b为本发明实施例提供的程序代码测试装置结构示意图。

具体实施方式

为了引用和清楚起见,下文中使用的技术名词、简写或缩写总结解释如下:

有限解问题:如果一个功能/程序,要保证逻辑能正常运行的测试用例集是有限的,则称之为有限解问题;

非无限解问题:如果一个功能/程序,要保证逻辑能正常运行的测试用例集是无限的,则称之为无限解问题,理论上来说,无限解问题无法保证功能/程序在所有情况下都正常。

除针对性差外,传统的白盒测试中,不同的输入对于同一段代码执行很可能是不同的结果(结果不同,对应的逻辑出口或逻辑分支也不同),即使是相同的输入,也可能由于状态不同产生不同的结果(结果不同,对应的逻辑出口或逻辑分支也不同)。因此传统白盒测试精准度有限,漏测率高。

有鉴于此,本发明实施例提供程序代码测试方法和程序代码测试装置,以解决上述问题。

上述程序代码测试方法和程序代码测试装置可应用于任何需要进行白盒测试的场景,例如,游戏服务端白盒测试场景。

该方法的执行主体为程序代码测试装置,程序代码测试装置可以软件或硬件的形式,应用于服务器、电子设备/终端(诸如台式机、移动终端、ipad等)中。

在以软件形式存在时,程序代码测试装置具体可为脚本或独立的应用软件。

程序代码测试装置100的通用计算机结构如图2a所示:包括至少一个处理器101,例如CPU,至少一个网络接口104或者其他用户接口103,存储器105,至少一个通信总线102。通信总线102用于实现这些组件之间的连接通信。

该程序代码测试装置100可选的包含键盘或者点击设备,例如,鼠标、轨迹球(trackball)等。

在本发明实施例中,处理器101通过调用存储器105存储的应用程序1051或指令,执行程序代码测试方法中的各步骤。

请参见图2b,上述程序代码测试方法的核心思想是:

200部分:获取本次测试的测试目的;

上述测试目的可由测试人员通过鼠标、键盘等输入。也可从存储器或数据库中读取。

测试目的依不同的场景及设计需要可有不同的变化,例如,测试目的可为:检测待测程序代码中可能导致致命问题的逻辑路径。

201部分:搜索(待测)程序代码对应的逻辑拓扑树,得到与上述测试目的相关的逻辑出口节点,作为目标逻辑出口节点。

为称呼方便,将包含上述目标逻辑出口节点的逻辑路径为目标逻辑路径。

图2c、3c示出了逻辑拓扑树的一种示例性结构,其可包括多条逻辑路径,多条逻辑路径共用同一逻辑入口。

每一逻辑路径则包含多个节点。

需要说明的是,本实施例中的节点是最基本的调用单位,指的是代码中的函数。

在一个示例中,每一节点可包括一行或多行代码行。

在另一个示例中,每一节点还可对应有描述信息。该描述信息至少可包括功能描述信息,以方便了解节点可执行的功能。

设计人员可在设计程序代码时,同时设计逻辑拓扑树并保存在测试装置可以访问的存储介质上。在需要时,程序代码测试装置可访问存储介质来获取到逻辑拓扑树。

或者,程序代码测试装置也可分析程序代码(例如分析语法等),来生成逻辑拓扑树。

由于一般情况下程序代码对应的逻辑拓扑树会有多个逻辑出口节点,所以需从多个逻辑出口节点中,确定出与测试目的相关的逻辑出口节点。仍沿用前例,假定测试目的为:检测待测程序代码中可导致致命问题的逻辑路径,则可确定出可导致致命问题的逻辑路径的逻辑出口节点作为目标逻辑出口节点。本文后续还将以更详细的例子进行介绍。

在本发明其他实施例中,也可直接指定逻辑出口节点作为目标逻辑出口节点,则在此情况下,200部分可省略掉。

202部分:以上述目标逻辑出口节点为起点,对逻辑拓扑树中包含上述目标逻辑出口节点的逻辑路径进行逻辑测试。

请参见图2c,入口节点与出口逻辑节点1(简称出口1)之间的逻辑路径包括:

入口-节点1-节点5-出口1;

入口-节点2-节点5-出口1;

入口-节点3-节点5-出口1。

在一个示例中,可对反向逻辑路径进行逻辑测试。所谓的反向,指的是由出口至入口。

可见,在本实施例中,是对包含与测试目的相关的逻辑出口节点的逻辑路径进行逻辑测试,而不是对所有的逻辑路径进行逻辑测试。由于是基于测试目的进行的逻辑测试,因此,与传统白盒测试相比,本发明实施例所提供的程序代码测试方案更具有针对性。

图3a示出了上述程序代码测试装置所执行的程序代码测试方法的另一种示例性流程,在本实施例中,以倒逆推演方式,通过预先设定测试目的,剥离出达到此目的的逻辑路径,进而检测各个逻辑路径。其可包括:

300-301部分与200-201部分相类似,在此不作赘述。

302部分:将目标逻辑出口节点作为目标节点。

303部分:寻找目标节点的上层节点。

所谓的上层节点,是指与目标节点存在直接调用关系的节点。

304部分:检测上层节点的代码逻辑是否符合设计逻辑,若是,进入305部分,否则进入306部分。

在一个示例中,可检测上层节点与目标节点之间的引用调用是否符合设计逻辑。

在另一个示例中,对于算法类的节点,具体可采用如下方式进行检测:

向该上层节点输入标准测试数据;

获取该上层节点输出的响应数据;

比对标准响应输出数据与上述上层节点输出的响应数据是否一致;

若一致,判定上述上层节点的代码逻辑符合设计逻辑;

若不一致,判定上述上层节点的代码逻辑不符合设计逻辑。

举例来讲,假定上层节点实现的是运算C=A+B,因此,当输入的标准测试数据为A=1,B=2时,标准响应输出数据应为C=3。

则将A=1,B=2代入该上层节点,若该上层节点输出的响应数据等于3,则可判定其符合设计逻辑,否则判定其不符合设计逻辑。

此外,还可检测输入数据的数据类型与输出数据的数据类型是否匹配等,在此不作赘述。

305部分:在上述上层节点不为逻辑入口节点时,将该上层节点作为目标节点,返回303部分。

306部分:判定该上层节点为漏洞节点。

在本发明其他实施例中,请参见图3b,在306部分之后,还可包括:

307部分:对被判定为漏洞的上述上层节点的代码逻辑进行修改,使其符合设计逻辑;

在一个示例中,可对被判定为漏洞的上述上层节点对应的代码行进行修改,以使该上层节点的代码逻辑符合设计逻辑。当然,在实际中可能还需要修改漏洞节点的上层节点对应的代码行。

308部分:在修改后的上层节点不为逻辑入口节点时,将修改后的上层节点作为目标节点,返回303部分。

需要说明的是,302-306部分或者302-308部分是以目标逻辑出口节点为起点,进行倒推逆演逻辑检测的。

假设图2c是抽象的代码覆盖图,若出口1为目标逻辑出口节点,则检查逻辑的逻辑图演化为如图3c。阴影部分为需要检查的节点及路径,而其他部分将不需要关心。

再举例,如图3d所示程序代码,main为主函数,func3为目标逻辑出口节点。

若依据传统白盒测试的路径覆盖,则整个程序需要枚举很多不必要的情况,用例非常多。

但如果从func3反推,即如果func3要发生,发现整个程序func3的调用只在代码14行及18行处发生。如果要使得代码14行被执行,只需要保证其上层节点if(c>0)即可。

如果要进入代码行18行,则需要保证代码行10行不满足条件,由于此处是一个else分支,故第8行条件分支if(a>0)不满足条件,以此类推,直到推导出程序入口main函数,整个推导过程可以画为一颗代码树。

如图3e所示,如果要检查func3的调用情况,只需要首先检查其被调用的节点,然后依次逐层检查上层节点,直到找到入口检查结束。

可见,在本实施例中,从结果(出口)向上追溯,通过分析反向逻辑路径上的每个节点,一直反向到入口,这种简化使得的检查具有针对性,同时使得局部的完备测试成为可能。

图4示出了上述程序代码测试装置所执行的程序代码测试方法的又一种示例性流程,本实施例与其他实施例最大的不同点在于增加了对程序代码按照逻辑出口节点划分为代码块的步骤。本实施例包括如下部分:

400部分:将(待测)程序代码按照逻辑出口节点划分为代码块。

若程序代码对应一棵逻辑拓扑树,那么代码块就对应子逻辑拓扑树。

每一子逻辑拓扑树包含至少一条逻辑路径,并且,属于同一子逻辑拓扑树的逻辑路径包含同一逻辑出口节点。而不同的代码块对应不同的逻辑出口节点。

例如,图2c中的逻辑拓扑树可分为三个子逻辑拓扑树(图2d-2f),对应代码块1-3,分别对应出口1、出口2和出口3。

401部分:存储每一逻辑出口节点的描述信息;

描述信息具体可包括逻辑出口节点的功能描述信息。

402部分:获取本次测试的测试目的。

403部分:遍历逻辑拓扑树的各逻辑出口节点,得到描述信息与测试目的相匹配的逻辑出口节点,作为目标逻辑出口节点。

举例来讲,假定测试目的为:检测待测程序代码中可能导致致命/严重问题的逻辑路径。

则可根据各逻辑出口节点的功能描述信息,判断逻辑出口节点的功能异常是否可能导致致命/严重问题,进而可确定出目标逻辑出口节点。

404部分:确定目标逻辑出口节点对应的代码块,作为目标代码块。

假定目标逻辑出口节点为出口1,则目标代码块为代码块1。

404部分:对上述目标代码块对应的子逻辑拓扑树中的逻辑路径进行逻辑测试。

在一个示例中,可采用如302-306部分或者302-308部分所示的操作,对目标代码块中的逻辑路径进行倒推逆演逻辑检测,在此不作赘述。

需要说明的是,程序代码有很多代码行,在确定了测试目的后,很多代码行并不需要进行检测。

所以在本实施例先划分了代码块,这样在检测时,可挑出相关的代码块进行测试就可以,从而节省了测试中查找上层节点的时间。

下面将以游戏服务端白盒测试场景为例,对本发明技术方案进行更为详细的介绍。

游戏里一般有金币系统,如何来证明一个金币系统是没有问题的?

图5a示出了金币系统的简化流程(在图5a中,各节点是以节点所对应的功能来命名的)。从简化流程图中可以看到,整个系统庞大而复杂,如果要正向分析,是极其困难的。

逻辑分支过多,其本质是一个非有限解空间问题,逻辑上此类问题就无法完全保证所有逻辑都被执行。

从程序运行的结果上分析,程序错误的严重程度是不同的。例如服务器崩溃称之为致命问题,此类问题是无法接受的;再例如服务器被刷金币,会导致游戏经济系统崩溃,此类问题被称为严重问题,也无法接受;又比如用户数据错误,导致服务器必须回档,这些都是无法接受的问题。

但比如玩家无法获取奖励,相比之下就能比较能接受。那么对于非有限空间问题,既然无法保证所有逻辑都正常,保证致命问题/严重问题不发生,也是不错的。

基于上述分析,则测试目的可为:检测待测程序代码中可能导致致命/严重问题的逻辑路径。

假定金币系统的目标逻辑出口可被简化为两个点:用户获取金币出口和用户失去金币出口。需要保证用户不能非法获取金币,也需要保证用户不能无故被扣除金币。此时就可以此用倒推逆演进行针对性分析,如图5b所示的阴影部分。

若已明确需要分析的点是“用户获取金币”,只需要分析“获取金币”的上层调用有哪些,如上层逻辑节点是“金币是否达到上限”,首先需要确认这个节点的逻辑是对的。

再继续追踪“金币是否达到上限”的上层逻辑节点,逐层确认,最终保证协议接口层,即“寄卖道具”层逻辑正确,那么即保证到达“用户获取金币”节点的代码逻辑是正确的。这种分析方式目的性十分明确,分析的节点也可以减少很多,从而可将非有限解空间问题变为有限解空间问题。

在确定了测试目的和目标逻辑出口节点后,请参见图5c,程序代码测试方法可包括:

501部分:确定目标节点,称为x节点。

初始时,是以目标逻辑出口节点作为x节点的。

502部分:寻找所有可到x节点的上层节点,由于上层节点可能不止一个,故称为{y0,y1,y2..yn}节点集合。

503部分:逐个分析{y0,y1,y2..yn}节点集合中的节点:检查yi节点(yi表示{y0,y1,y2..yn}节点集合中的某个点)是否符合设计逻辑,若是,进入505部分,否则,进入504部分。

如何检查可参见前述304部分,在此不作赘述。

如果yi不符合设计逻辑,则说明yi是非法节点,即漏洞。

504部分:判定yi为漏洞节点。

需要说明的是,如果入口节点不是设计的逻辑入口节点,也是漏洞。

在判定yi为漏洞节点后,可结束对包含yi的逻辑路径的倒推逆演,也可将yi节点的代码逻辑修改为符合设计逻辑,修改后,将yi节点作为目标节点,返回502部分。

505部分:判断yi节点是否为逻辑入口节点,若是,进入507部分,否则进入506部分。

506部分:将yi节点作为目标节点,返回502部分。

507部分:确定所有节点无漏洞,结束。

图6a示出了上述实施例中所涉及的程序代码测试装置的一种可能的结构示意图,包括:

获取单元601,用于获取本次测试的测试目的;

确定单元602,用于搜索程序代码对应的逻辑拓扑树,得到与测试目的相关的逻辑出口节点,作为目标逻辑出口节点;

逻辑拓扑树的相关介绍请参见本文前述记载,在此不作赘述。

测试单元603,用于以上述目标逻辑出口节点为起点,对上述逻辑拓扑树中包含目标逻辑出口节点的逻辑路径进行逻辑测试。

在本发明其他实施例中,请参见图6b,上述所有实施例中的程序代码测试装置还可包括:划分单元604,用于在进行逻辑测试之前或获取测试目的之前,将程序代码按照逻辑出口节点划分为代码块。

其中,代码块对应的子逻辑拓扑树包含至少一条逻辑路径,该至少一条逻辑路径包含同一逻辑出口节点;不同的代码块对应不同的逻辑出口节点。

此外,仍请参见图6b,上述所有实施例中的程序代码测试装置还可包括:存储单元605,用于存储每一逻辑出口节点的描述信息。

获取单元601可用于执行图2b所示的200部分,图3a和图3b所示的300部分,图4所示的402部分。

确定单元602可用于执行图2b所示的201部分,图3a和图3b所示的301和305部分,图4所示的403部分,图5c所示的501和506部分。

测试单元603可用于执行图2b所示的201部分,图3a所示的302-304、306部分,图3b所示的302-304、306-308部分,图4所示的404-408部分,图5c所示的502-505、507部分。

划分单元604可用于执行图4所示的400部分。存储单元605可用于执行图4所示的401部分。

上述所有实施例所涉及的程序代码测试装置/电子设备/服务端/终端的另一种可能的结构示意图可参见图2a,包括:

总线、处理器1、存储器2、通信接口3、输入设备4和输出设备5。处理器1、存储器2、通信接口3、输入设备4和输出设备5通过总线相互连接。其中:

总线可包括一通路,在计算机系统各个部件之间传送信息。

处理器1可以是通用处理器,例如通用中央处理器(CPU)、网络处理器(Network Processor,简称NP)、微处理器等,也可以是特定应用集成电路(application-specific integrated circuit,ASIC),或一个或多个用于控制本发明方案程序执行的集成电路。还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。

处理器1可包括主处理器,还可包括基带芯片、调制解调器等。

存储器2中保存有执行本发明技术方案的程序或脚本,还可以保存有操作系统和其他关键业务。具体地,程序可以包括程序代码,程序代码包括计算机操作指令。脚本则通常以文本(如ASCII)保存,只在被调用时进行解释或编译。

更具体的,存储器2可以包括只读存储器(read-only memory,ROM)、可存储静态信息和指令的其他类型的静态存储设备、随机存取存储器(random access memory,RAM)、可存储信息和指令的其他类型的动态存储设备、磁盘存储器、flash等等。

输入设备4可包括接收用户输入的数据和信息的装置,例如键盘、鼠标、摄像头、扫描仪、光笔、语音输入装置、触摸屏、计步器或重力感应器等。

输出设备5可包括允许输出信息给用户的装置,例如显示屏、打印机、扬声器等。

通信接口3可包括使用任何收发器一类的装置,以便与其他设备或通信网络通信,如以太网,无线接入网(RAN),无线局域网(WLAN)等。

控制器/处理器可用于执行图2b、图3a、图3b、图4和图5c涉及程序代码测试装置/电子设备/服务器/终端的处理过程和/或用于本申请所描述的技术的其他过程。控制器/处理器也可用于实现前述确定单元602、测试单元603以及划分单元604的功能。

通信接口则用于支持程序代码测试装置/电子设备/服务器/终端与其他装置进行通信。

可以理解的是,图2a仅仅示出了程序代码测试装置/电子设备/服务器/终端的简化设计。在实际应用中,图像选中装置/电子设备/终端可以包含任意数量的发射器,接收器,处理器,控制器,存储器,通信接口等,而所有可以实现本发明的程序代码测试装置/电子设备/服务器/终端都在本发明的保护范围之内。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例提供的装置而言,由于其与实施例提供的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,通用硬件包括通用集成电路、通用CPU、通用存储器、通用元器件等,当然也可以通过专用硬件包括专用集成电路、专用CPU、专用存储器、专用元器件等来实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在可读取的存储介质中,如U盘、移动存储介质、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储软件程序代码的介质,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例的方法。

对所提供的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所提供的原理和新颖特点相一致的最宽的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1