提供测试用例的方法和装置制造方法

文档序号:6504717阅读:552来源:国知局
提供测试用例的方法和装置制造方法
【专利摘要】本发明公开了一种用于为修改的程序提供测试用例的方法和装置。上述方法包括:获取对程序的上一版本进行修改的修改项;将修改项定位到插入在程序中的多个测试探针中的第一测试探针之后和第二测试探针之前;获取修改后的程序在所述第一测试探针和第二测试探针之间与所述修改相关的执行路径以及所述执行路径对应的约束组;获取所述第一测试探针输出的利用原有测试用例执行所述上一版本的程序的执行结果;以及基于所述执行结果和所述约束组,确定适用于所述执行路径的测试用例。所述装置与上述方法对应。根据上述方法和装置,基于原有测试用例,针对程序的修改部分提供适用的测试用例,从而提高了提供测试用例的效率。
【专利说明】提供测试用例的方法和装置

【技术领域】
[0001]本发明涉及用于软件测试的测试用例,更具体而言,涉及提供测试用例的方法和
>J-U ρ?α装直。

【背景技术】
[0002]在软件开发过程中,开发人员针对软件要实现的功能编写出程序的源代码,然后测试人员利用测试用例对基于源代码构建的软件进行测试。可以理解,一个程序往往利用条件判断和跳转构建多个流程分支,从而形成多个执行路径。因此,希望选择适当的测试用例构成测试用例集,使得测试用例集中的各个测试用例能够分别对应于不同的流程分支,覆盖不同的执行路径,从而全面地对程序的各种可能的执行状况进行测试。为此,在现有技术中,已经提出了符号执行(symbolic execut1n)的方法来分析程序的执行过程。该方法可以用于为程序生成适当的测试用例。
[0003]在符号执行的方法中,针对要测试的程序构建控制流图(Control FlowGraph,CFG)。控制流图(CFG)是用有向图表示一个程序过程的一种抽象数据结构。图1示例性示出一个程序的控制流图和对应的执行路径。具体地,图1中包含了多个节点以及多个连接节点的有向边,其中每个节点Ni表示一个程序基本块,也就是其中没有任何跳转的顺序语句代码块;每个有向边Ei表示程序中的跳转,并连接作为跳转的起点和终点的两个基本块(即节点)。由于程序中的跳转一般通过执行条件来限定,因此一个有向边对应于从该有向边的起点节点跳转到终点节点的执行条件。例如,在一个具体例子中,程序中定义了包括X和y在内的多个变量。在执行节点N1之后,程序判断变量X和y的值。如果(x+y)>=0,则跳转到节点N2,如果(x+y)〈O且y>0,则跳转到节点N3。那么,有向边E1对应于执行条件(x+y)>=0 ;有向边&对应于执行条件(x+y)〈0且y>0。经由不同的有向边连接不同的节点,可以形成不同的执行路径。具体地,图1还示出了不同的执行路径所对应的有向边的组合,例如执行路径P1经由有向边Etl, E1, E3, E7和E9,执行节点序列N1, N2, N6, N5, Nf。如前所述,每个有向边对应于从该有向边的起点节点跳转到终点节点的执行条件。因此,每个执行路径Pi可对应于由有向边的组合所限定的执行条件组,或称为约束组。接着,可以对该约束组进行求解。如果该约束组无解,则说明执行路径Pi不可达。对于可达的路径,可以通过对约束组进行求解获得程序执行该路径Pi的条件范围。进而,可以在该条件范围内生成测试用例ti。这样,测试用例ti中的各个参数符合路径pi的条件范围,于是,在利用测试用例ti进行测试时,程序必然会沿着路径pi进行执行,从而实现对路径pi的测试。也就是说,测试用例ti是适用于执行路径pi的测试用例。利用同样的方式,可以针对程序的各个不同执行路径生成不同的测试用例。如此,生成的不同测试用例就可以覆盖不同的执行路径,从而满足全面测试的要求。
[0004]然而,为满足用户对软件功能的各种需求,许多程序具有复杂的逻辑和大量的流程分支。可以理解,每增加一个流程分支,就会在原有执行路径的基础上组合产生出新的执行路径。因此,执行路径的数目随着分支数目的增加而指数级增长。大量的流程分支会产生巨大数目的执行路径,这又称为路径状态空间爆炸。对于这样的情况,针对各个执行路径逐一求解其约束组来生成测试用例的方法由于效率的低下而变得不够实用。
[0005]另一方面,软件程序的编写是逐步完成的。开发人员(对于大型软件来说,通常是多个开发人员)不断地向程序源代码提交修改记录(track),从而对源代码进行修改、补充和完善。为了确保经过多次修改的软件程序能够正常运行,需要对软件程序进行回归测试(regress1n testing),以确定出导致程序出现问题的修改记录。根据现有技术,在回归测试过程中,利用同样的测试用例集对不同版本的程序进行测试。然而,实际上,对程序的每次修改都有可能导致程序的执行路径发生改变。因此,有可能出现这样的情况:适用于原版本程序中特定执行路径的测试用例有可能不再适用于修改后的程序,相反,由于程序修改而生成的新的执行路径不能找到适用的测试用例。为此,希望针对修改后的程序对测试用例集进行更新,从而提供适用的测试用例。然而,如前所述,一方面程序的逻辑越来越复杂,执行路径的数量巨大;另一方面,程序的修改非常频繁。这两方面的因素使得针对程序的每次修改重新生成测试用例的成本非常高昂。
[0006]因此,希望提出新的方案,能够更加有效地针对程序的修改提供适用的测试用例。


【发明内容】

[0007]鉴于以上提出的问题,提出本发明,旨在提供一种方案,能够在原有测试用例的基础上,针对修改的程序提供适用的测试用例,从而克服现有技术中的至少一部分问题。
[0008]根据本发明一个实施例,提出了一种为修改的程序提供测试用例的方法,包括:获取对程序的上一版本进行修改的修改项;将所述修改项定位到插入在程序中的多个测试探针中的第一测试探针之后和第二测试探针之前;获取修改后的程序在所述第一测试探针和第二测试探针之间与所述修改相关的执行路径以及所述执行路径对应的约束组;获取所述第一测试探针输出的利用原有测试用例执行所述上一版本的程序的执行结果;以及基于所述执行结果和所述约束组,确定适用于所述执行路径的测试用例。
[0009]根据另一实施例,提出了一种用于为修改的程序提供测试用例的装置,包括:修改项获取单元,配置为获取对程序的上一版本进行修改的修改项;定位单元,配置为将所述修改项定位到插入在程序中的多个测试探针中的第一测试探针之后和第二测试探针之前;路径获取单元,配置为获取修改后的程序在所述第一测试探针和第二测试探针之间与所述修改相关的执行路径以及所述执行路径对应的约束组;执行结果获取单元,配置为获取所述第一测试探针输出的利用原有测试用例执行所述上一版本的程序的执行结果;以及确定单元,配置为基于所述执行结果和所述约束组,确定适用于所述执行路径的测试用例。
[0010]利用上述方法和装置,基于原有测试用例,针对程序的修改部分提供适用的测试用例。由于避免了针对整个程序重新生成新的测试用例,提高了提供测试用例的效率,相应地,促进了程序的回归测试过程。

【专利附图】

【附图说明】
[0011]通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
[0012]图1示例性示出一个程序的控制流图和对应的执行路径;
[0013]图2示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图;
[0014]图3示出根据本发明一个实施例的为修改的程序提供测试用例的方法的流程图;
[0015]图4示意性示出两个测试探针之间的控制流图和执行路径;
[0016]图5示出确定适用的测试用例的子步骤;
[0017]图6示意性示出约束组和组合的约束组的例子;以及
[0018]图7示出根据本发明一个实施例的提供测试用例的装置的框图。

【具体实施方式】
[0019]在附图中显示了本公开的一些优选实施方式,下面将参照附图更详细地描述这些优选实施方式。然而,可以以各种形式实现本公开,其不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
[0020]所属【技术领域】的技术人员知道,本发明可以实现为系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
[0021]可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是一但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPR0M或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0022]计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0023]计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括一但不限于一无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0024]可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言一诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言一诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络一包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0025]下面将参照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,这些计算机程序指令通过计算机或其它可编程数据处理装置执行,产生了实现流程图和/或框图中的方框中规定的功能/操作的装置。
[0026]也可以把这些计算机程序指令存储在能使得计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令就产生出一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instruct1nmeans)的制造品(manufacture)。
[0027]也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令能够提供实现流程图和/或框图中的方框中规定的功能/操作的过程。
[0028]图2示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图。图2显示的计算机系统/服务器12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0029]如图2所示,计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
[0030]总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
[0031]计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机系统/服务器12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
[0032]系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图2中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如⑶-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
[0033]具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
[0034]计算机系统/服务器12也可以与一个或多个外部设备14 (例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口 22进行。并且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其它模块通信。应当明白,尽管图中未示出,可以结合计算机系统/服务器12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
[0035]下面结合附图描述本发明的各个实施例。在这些实施例中,在程序中插入多个测试探针(instrument),用于检测和输出程序的执行状态信息。在对程序进行修改的情况下,将所述修改定位到插入在程序中的两个测试探针之间,例如在第一测试探针之后和第二测试探针之前,并获取修改后的程序在两个测试探针之间的执行路径。由此,从整个程序中“提取”出了与修改相关的执行路径。另一方面,获取修改前的程序在第一测试探针处的执行结果,也就是前一版本的程序在上述执行路径的开端的执行结果。于是,利用符号执行的方式,结合上述执行结果考虑执行路径的约束组,就可以确定适用于上述执行路径的测试用例。
[0036]现在参看图3,其示出根据本发明一个实施例的为修改的程序提供测试用例的方法的流程图。如图所示,该实施例中提供测试用例的方法包括以下步骤:步骤31,获取对程序的上一版本进行修改的修改项;步骤32,将所述修改项定位到插入在程序中的多个测试探针中的第一测试探针之后和第二测试探针之前;步骤33,获取修改后的程序在所述第一测试探针和第二测试探针之间与所述修改相关的执行路径以及所述执行路径对应的约束组;步骤34,获取所述第一测试探针输出的利用原有测试用例执行所述上一版本的程序的执行结果;以及步骤35,基于所述执行结果和所述约束组,确定适用于所述执行路径的测试用例。下面结合具体例子描述以上各个步骤的执行方式。
[0037]首先,在步骤31,获取对程序的上一版本进行修改的修改项。在一个例子中,一个修改项对应于对程序代码的一行进行的修改。在另一个例子中,一个修改项对应于对程序的一个程序块或一个执行条件进行的修改。在利用符号执行将程序执行过程抽象为控制流图的情况下,一个修改项可以对应于对程序的一个节点或一个有向边的修改。
[0038]为了便于描述,假定已经通过测试的程序的上一版本为vl。相应地,Vl版本的程序具有对应的测试用例集Tl,其中包含多个测试用例,分别适用于Vl版本的程序的不同执行路径。如前所述,在软件开发过程中,开发人员会不断地提交修改记录(track),从而对程序代码进行修改。一般地,一个修改记录可以包括若干个修改项。假定在vl版本的程序通过测试之后,开发人员分别提交了多项修改记录,由此形成了 v2版本的程序。
[0039]通常,可以通过修改记录资料库(track knowledge base),或称为版本管理系统对提交的修改记录进行管理。版本管理系统的例子包括,ClearCase, CVS, Endevor, RTCz等。上述的版本管理系统可以记录并管理各个修改记录的信息。这些信息包括,修改记录的提交人,修改记录的提交时间,修改记录中的各个修改项的信息。修改项的信息可以包括,修改发生的位置,修改的具体内容等。在一个实施例中,可以通过上述各种版本管理系统来获取修改记录的信息,进而获取修改项的信息,从而执行步骤31。在另一种实施方式中,在步骤31,可以直接捕获开发人员对修改记录的提交,从而获取修改项。在另一实施例中,在步骤31,也可以通过直接扫描和对比程序的上一版本vl和当前版本v2的代码,来获取修改项的信息。
[0040]对于如上所述获取的修改项,在步骤32,将所述修改项定位到插入在程序中的多个测试探针中的第一测试探针之后和第二测试探针之前。为了执行步骤32,需要预先执行在程序中插入测试探针的步骤。在软件测试领域中,在程序中插入测试探针(又称为“打桩”)从而监视程序的执行状态是一种常用的测试方法。一般地,测试探针可以检测测试探针所在位置处的运行时状态信息,并输出相关结果。在一个实施例中,在程序的源代码中插入多个测试探针。在另一实施例中,测试探针被插入在基于程序的源代码生成的中间代码中,从而在不改变源代码的情况下对测试用例的执行情况进行追踪。由于插入测试探针的方法在本领域中已经熟知,在此不再描述测试探针的代码形式、插入过程等细节。需要说明的是,为了使得所插入的测试探针更好地应用于本发明实施例的方法,应注意测试探针的插入间隔和插入位置。实际上,在程序中插入多个测试探针相当于利用测试探针位置将整个程序划分为不同长度的程序段,从而实现对程序的分段监测和控制。因此,适当的测试探针间隔对应于适当长度的程序段。测试探针间隔太小会使得划分的程序段太短,并且相应地,测试探针数目过多也会影响程序的执行效率。而测试探针间隔太大则会使得划分的程序段太长,难以起到分段监测和控制的目的。因此,应根据程序本身的长度、分支等特点来确定测试探针插入间隔和插入位置。在一个实施例中,以上插入测试探针的步骤作为本发明方法的一部分在图3的步骤31,32之前执行。在另一实施例中,插入测试探针的步骤在执行本发明的方法之前预先进行,从而为本发明的方法的执行提供基础。
[0041]在程序中已经插入了多个测试探针的基础上,在步骤32,将步骤31获取的修改项定位到插入在程序中的两个测试探针之间。特别地,这两个测试探针中位于修改项之前的测试探针被称为第一测试探针,位于修改项之后的测试探针被称为第二测试探针,或者说,修改项被定位在第一测试探针之后,第二测试探针之前。在一个实施例中,在步骤32,从修改项的位置开始沿着程序代码向前回溯,所遇到的第一个测试探针可以被确定为上述第一测试探针;类似地,从修改项的位置沿着程序代码向后行进,所遇到的第一个测试探针可以被确定为上述第二测试探针。也就是说,第一测试探针和第二测试探针分别是位于修改项之前和之后、距离修改项最近的两个测试探针;在第一测试探针和第二测试探针之间不存在其他测试探针。然而,这并不是必须的。在其他实施例中,也可以将其他两个测试探针作为第一测试探针和第二测试探针,只要这两个测试探针所定义的程序段中包含有上述修改项。
[0042]在定位出第一测试探针和第二测试探针的基础上,在步骤33,获取修改后的程序在所述第一测试探针和第二测试探针之间与所述修改相关的执行路径以及所述执行路径对应的约束组。在一个实施例中,首先获取第一测试探针和第二测试探针之间的特定程序段,然后确定该特定程序段对应的执行路径。如前所述,插入在程序中的测试探针可以将整个程序划分为若干程序段。相应地,第一测试探针和第二测试探针限定了包含修改项在内的特定程序段。对于该特定程序段,可以利用现有技术中符号执行的方式,获取该特定程序段对应的执行路径。或者,在另一实施例中,可以首先获取整个程序的完整执行路径,然后从完整执行路径中截取出第一测试探针和第二测试探针之间的执行路径。如本领域技术人员所知,执行路径限定了程序中各个程序块(控制流图中的节点)的执行顺序和执行条件(连接节点的有向边)。通过组合程序块之间的执行条件,可以获得执行路径所对应的约束组。由此,在步骤33,从整个程序中提取出了与修改项相关的执行路径,并获取了与执行路径对应的约束组。
[0043]可以理解,修改后的程序在第一测试探针和第二测试探针之间可能具有多个不同的执行路径。并且,由于第一测试探针和第二测试探针限定的程序段涉及修改项,因此,第一测试探针和第二测试探针之间的至少一部分执行路径相对于程序上一版本的对应部分存在改变。图4示意性示出两个测试探针之间的控制流图和执行路径。具体地,第一测试探针位于节点Al之前,第二测试探针位于节点A9之后。图4A示出上一版本vl的程序在第一测试探针和第二测试探针之间的控制流图。根据该流控制图,上一版本的程序在第一测试探针和第二测试探针之间存在两个执行路径Pl和P2,其中pi经由有向边El,E2,E3,E4, E5, E9 执行节点序列 A1-A2-A3-A4-A5-A6-A9, p2 经由有向边 El, E2, E3, E4, E6, E7, E8执行节点序列A1-A2-A3-A4-A5-A7-A8-A9。假定经过修改,形成了修改后的版本,即当前版本v2的程序。图4B示出修改后的程序在第一测试探针和第二测试探针之间的控制流图。如图所示,相比于前一版本vl,版本v2修改了连接A5和A6的条件,即将有向边E5修改为E5’,添加了连接A7和A6的有向边E10,并将节点A8修改为A8’。由此,修改后的程序在第一测试探针和第二测试探针之间具有三个执行路径pl’,p2’和ρ3,其中路径ρΓ经由有向边 El, Ε2, Ε3, Ε4, Ε5,,Ε9 执行节点序列 Α1-Α2-Α3-Α4-Α5-Α6-Α9,路径 ρ2,经由有向边 El,Ε2, Ε3, Ε4, Ε6, Ε7, Ε8 执行节点序列 Α1-Α2-Α3-Α4-Α5-Α7-Α8’ -Α9,路径 ρ3 经由有向边 Ε1,Ε2, Ε3, Ε4, Ε6, Ε10, Ε9 执行节点序列 Α1-Α2-Α3-Α4-Α5-Α7-Α6-Α9。
[0044]在以上的三个路径中,路径P I’与上一版本的路径PI相比,经由不同的有向边组合执行了相同的节点序列。对此,可以将相对于原执行路径修改了执行条件但执行相同节点序列的执行路径称为修改的执行路径。因此,修改的执行路径ρΓ与原路径Pi相对应。路径Ρ2’与上一版本的路径ρ2相比,经由相同的有向边组合执行了类似的节点序列(仅是将节点AS修改为AS’)。由于执行路径所对应的约束组仅与有向边的组合相关,因此,路径Ρ2’实际上与原路径ρ2具有完全相同的约束组。在此意义上,将执行条件完全相同的路径称为相同的执行路径。因此,可以认为,路径Ρ2’相对于原路径ρ2未发生实质改变。而路径Ρ3与原有的任何路径相比,经由完全不同的有向边组合,执行了完全不同的节点序列,因此,被称为新建的执行路径。
[0045]可以理解,图4仅仅是以示例的方式示出第一测试探针和第二测试探针之间的执行路径。在其他例子中,两个测试探针之间可以具有更多、更复杂的执行路径。并且,出于示例的目的,图4Β同时示出了几种典型的修改。在其他例子中,修改项可以涉及以上修改类型的一部分,或者涉及其他修改内容。
[0046]如图4示例性示出的,通过程序的修改,第一测试探针和第二测试探针之间的多个执行路径相对于上一版本发生了改变。于是,适用于上一版本的程序的原有测试用例有可能不再适用于修改后的程序的执行路径,也就是步骤33所获取的执行路径。为此,在接下来的步骤34和35,基于原有测试用例,确定适用的测试用例。
[0047]具体地,在步骤34,获取第一测试探针输出的利用原有测试用例执行上一版本的程序的执行结果。如前所述,可以假定上一版本vl的程序已经通过测试,测试所使用的测试用例集为Tl。该测试用例集Tl中包含多个测试用例,分别适用于vl版本的程序的不同执行路径。由于已经在程序中插入有测试探针,在利用Tl中某个测试用例t测试并执行vl版本的程序时,所插入的测试探针可以输出测试探针所在位置在运行时的执行结果。因此,在步骤34,通过读取第一测试探针的输出,可以获取并记录利用原测试用例集中的原有测试用例执行上一版本的程序时,在第一测试探针处的执行结果。所输出的执行结果可以包括,程序在运行到第一测试探针的位置时各个变量和参数的取值、状态等。由于第一测试探针位于步骤33所获取的执行路径的开端,因此可以将这样的执行结果作为上述执行路径的初始条件,并结合执行路径本身对应的约束组,来确定执行路径适用的测试用例,也就是执行步骤35。
[0048]图5示出确定适用的测试用例的子步骤,即上述步骤35的子步骤。如图5所示,首先,在步骤351,利用步骤34获取的执行结果进一步限定步骤33获取的约束组,从而形成组合的约束组;在步骤352,对上述组合的约束组进行求解;并且,在步骤353,根据步骤352求解的结果,判断原有测试用例是否适用于执行路径。
[0049]具体地,假定步骤33获取了执行路径P,其对应的约束组为C。另一方面,在步骤34获取了利用原有测试用例t执行上一版本vl的程序时第一测试探针所输出的执行结果R0于是,在上述步骤351,将执行结果R作为约束组C的初始条件,也就是,用执行结果R进一步限定约束组C,由此形成组合的约束组C’。接着,在步骤352,与现有技术中约束组求解类似地,对组合的约束组C’进行求解。求解的结果可以用于判断上述原有测试用例t是否适用于执行路径P。
[0050]图6示意性示出约束组和组合的约束组的例子。具体地,图6的左侧示出了第一测试探针和第二测试探针之间的某个执行路径P对应的约束组。该约束组涉及多个变量,并限定了变量之间的关系。在这些变量中,将第一测试探针之前定义的变量,例如变量a和b,称为全局变量,并以“global”进行标识;将第一测试探针之后新定义的变量,例如变量X,1,X,称为局部变量,并以“local”进行标识。由于全局变量是在第一测试探针之前进行定义的,在利用测试用例运行到第一测试探针处时,全局变量可以被赋予具体的状态或取值。假定在利用原有测试用例t运行vl版本程序时,第一测试探针输出的执行结果R包括a=5,b=6,如图6所示。将执行结果R与执行路径P的约束组进行组合,就可以获得图6右侧所示的组合的约束组。该组合的约束组是对部分变量进行赋值的条件组,可以利用现有技术中的方法进行求解。可以理解,出于简单和清楚的目的,图6的约束组中仅示出了涉及全局变量和局部变量两者的条件,省略了仅与局部变量相关的局部条件组。局部条件组的添加并不影响与全局变量相关的条件的求解。并且,图6仅示出了一个特定例子。在其他实施例中,第一测试探针输出的执行结果可能涉及更多的全局变量。
[0051]对于例如图6所示的组合的约束组,可以利用常规约束组求解方法进行求解,并基于求解结果判断原有测试用例是否适用于执行路径。具体地,根据符号执行的原理,如果组合的约束组C’有解,则说明,在执行原有测试用例t的情况下,执行路径P仍然是可达的路径,也就是说,原有测试用例t适用于执行路径P。因此,进一步地,在一个实施例中,步骤353的判断包括步骤354,在上述组合的约束组有解的情况下,将原有测试用例确定为适用于执行路径的测试用例。另一方面,判断步骤353还可包括步骤355,在组合的约束组无解的情况下,确定上述原有测试用例不适用于执行路径。
[0052]在一个实施例中,确定适用的测试用例的步骤35还包括步骤356,基于原有测试用例,生成适用于上述执行路径的新的测试用例。该步骤356典型地适用于原有测试用例不适用于执行路径的情况下,因此,在图5中被示出为在步骤355之后执行。然而,在一个实施例中,也可以在原有测试用例适用于执行路径的情况下执行步骤356,从而进一步为执行路径提供更多适用的测试用例。
[0053]一般地,为了生成适用的新的测试用例,仍然要考虑组合的约束组。由于组合的约束组是基于测试用例的执行结果和执行路径对应的约束组,因此,可以通过修改执行结果和/或约束组来使得组合的约束组有解,从而产生新的测试用例。具体地,在一个实施例中,生成新的测试用例的步骤356包括,修改约束组中与局部变量相关的参数设置,使得组合的约束组有解;以及基于修改的参数设置生成新的测试用例。下面参照图6所示的例子描述以上过程。如图6所示,执行路径P所对应的约束组至少涉及全局变量a和b,以及局部变量x,y,x,并限定了这些变量之间的关系。另一方面,测试用例t的执行结果限定了全局变量a=5,b=6。在一个例子中,某个局部变量,例如x,被设置为读取自某个外部文件,或者接收自用户输入。通过修改该局部变量的参数设置,例如修改上述外部文件,或修改用户输入,可以使得该局部变量具有不同的取值,从而满足组合的约束组中的条件(例如满足(local) x〈 (global) b=6),也就是使得该组合的约束组有解。在此情况下,将原测试用例与修改的参数设置相结合,就可以获得适用于执行路径P的新的测试用例。
[0054]在另一个实施例中,生成新的测试用例的步骤356包括,修改执行结果,使得组合的约束组有解;从第一测试探针开始利用数据流分析向前回溯,确定产生修改的执行结果的测试用例,将其作为新的测试用例。下面依然参照图6所示的例子描述该实施例的过程。在图6中,原测试用例t的执行结果限定了全局变量a=5,b=6。假定该执行结果使得图6所示的组合的约束组无解。特别地,假定在b=6的情况下,组合的约束组由于其中的条件(local)x< (global)b无法得到满足而无解。为此,可以修改执行结果,特别是修改全局变量b的取值,使得组合的约束组有解。例如,假定将执行结果修改为a=5,b=10可以使得组合的约束组有解。对于如此修改的执行结果,可以利用数据流分析的方法,从第一测试探针的位置向前回溯,从而反过来确定,什么样的测试用例可以在第一测试探针处产生如上所述修改的执行结果。在一个实施例中,可以预先设定向前回溯的长度,例如向前回溯两个测试探针的程序段。此外,数据流分析的方法在本领域中已经公知,可以用于追踪各个变量的取值过程,从而确定相应的测试用例。如此确定出的产生修改的执行结果的测试用例必然可以满足组合的约束组中的条件,因此可以作为适用于上述执行路径的新的测试用例。
[0055]尽管以上给出了产生新的测试用例的具体例子,但是本发明并不限于具体例子所示出的方法。本领域技术人员可以对以上详细描述的方法进行修改、组合,从而利用更多种实施方式来产生新的测试用例。这些修改和组合的实施例也应包含在本发明构思之内。
[0056]此外,对于图5所示的步骤,可以理解,在不同实施例中,可以选择性地仅执行其中的一部分步骤,或者对部分步骤进行多次执行。在一个实施例中,对于特定执行路径P,可以分别针对原有测试用例集中的每个测试用例执行图5的步骤351-353,以分别判断各个测试用例是否适用于该执行路径P。在另一实施例中,一旦确定某个原有测试用例适用于该执行路径P,就不再判断原有测试用例集中的其他测试用例;也就是说,只要确保测试用例集中存在适用于执行路径P的原有测试用例即可。在一个实施例中,在确定原有测试用例中的所有测试用例均不适用于执行路径P的情况下,才执行步骤356。
[0057]根据一种实施方式,对于不同的执行路径进行不同的处理。在一个实施例中,步骤33获取的执行路径P与上一版本的程序中的某个原有路径相同。对此,可以直接将适用于所述原有路径的原有测试用例确定为适用于执行路径P的测试用例。例如,图4所示的执行路径P2’与上一版本中的原有路径p2相同。因此,可以将原有测试用例集中用于路径p2的测试用例确定为适用于P2’的测试用例。
[0058]在一个实施例中,步骤33获取的执行路径是与上一版本的特定原有路径相对应的修改的执行路径。例如,在图4中,执行路径ρΓ是与原有路径pi对应的修改的执行路径。此时,可以假定,在原有测试用例集中,适用于该特定原有路径(例如Pl)的特定原有测试用例更有可能适用于该修改的执行路径(例如ρΓ )。因此,首先针对该特定原有测试用例执行图5的方法。在一个实施例中,在该特定原有测试用例不适用的情况下,执行步骤356,基于该特定原有测试用例产生新的测试用例,而不再判断其他的原有测试用例;在另一实施例中,在该特定原有测试用例不适用的情况下,进一步利用图5的步骤判断原有测试用例集中的其他原有测试用例。
[0059]在一个实施例中,步骤33获取的执行路径是新建的执行路径,例如图4中的执行路径Ρ3。此时,可以利用图5的步骤351-353,逐一判断各个原有测试用例是否适用于该新建的执行路径。在确定原有测试用例集中的所有测试用例均不适用于该新建的执行路径的情况下,才执行步骤356,生成新的测试用例。
[0060]可以理解,对于生成的新的测试用例,可以将其添加到测试用例集中,从而对测试用例集进行更新,使其适用于修改的程序。
[0061]在一个实施例中,还将修改后程序不再需要的测试用例从原有测试用例集中删除,从而更新测试用例集。具体地,对于特定的原有测试用例t,逐一判断该原有测试用例t适用于第一测试探针和第二测试探针之间的哪个执行路径。在该原有测试用例t不适用于任一执行路径的情况下,将该原有测试用例t确定为不需要的测试用例,将其从测试用例集T中删除,从而更新测试用例集T。
[0062]通过以上的方法,为修改的程序提供了适用的测试用例。
[0063]基于同样的发明构思,本发明还提供一种用于提供测试用例的装置。图7示出根据本发明一个实施例的提供测试用例的装置的框图。如图所示,用于为修改的程序提供测试用例的装置总体上标注为700。具体地,装置700包括:修改项获取单元701,配置为获取对程序的上一版本进行修改的修改项;定位单元702,配置为将所述修改项定位到插入在程序中的多个测试探针中的第一测试探针之后和第二测试探针之前;路径获取单元703,配置为获取修改后的程序在所述第一测试探针和第二测试探针之间与所述修改相关的执行路径以及所述执行路径对应的约束组;执行结果获取单元704,配置为获取所述第一测试探针输出的利用原有测试用例执行所述上一版本的程序的执行结果;以及确定单元705,配置为基于所述执行结果和所述约束组,确定适用于所述执行路径的测试用例。
[0064]根据一个实施例,装置700还包括测试探针插入单元(未示出),配置为在所述程序中插入多个测试探针。
[0065]根据一个实施例,上述第一测试探针和第二测试探针分别是位于所述修改项之前和之后、距离修改项最近的测试探针。也就是说,在第一测试探针和第二测试探针之间不存在其他的测试探针。
[0066]根据一个实施例,上述确定单元705包括(未示出):形成模块,配置为利用所述执行结果进一步限定所述约束组以形成组合的约束组;求解模块,配置为对所述组合的约束组进行求解;判断模块,配置为根据求解的结果,判断所述原有测试用例是否适用于所述执行路径。
[0067]根据一个实施例,上述判断模块配置为,在组合的约束组有解的情况下,将所述原有测试用例确定为适用于所述执行路径的测试用例。
[0068]根据一个实施例,上述判断模块配置为,在组合的约束组无解的情况下,确定所述原有测试用例不适用于所述执行路径。
[0069]在一个实施例中,确定单元705还包括生成模块,配置为基于所述原有测试用例,生成适用于所述执行路径的新的测试用例。
[0070]根据一个实施例,上述生成模块配置为:修改所述约束组中与局部变量相关的参数设置,使得组合的约束组有解;以及,基于修改的参数设置生成新的测试用例。
[0071]根据一个实施例,上述生成模块配置为:修改所述执行结果,使得组合的约束组有解;从第一测试探针开始利用数据流分析向前回溯,确定产生修改的执行结果的测试用例,将其作为新的测试用例。
[0072]根据一个实施例,上述执行路径是与上一版本的程序中的特定原有路径相对应的修改的执行路径,上述原有测试用例适用于该特定原有路径。
[0073]上述单元和模块的具体执行方式对应于结合具体例子对图3和图5的各个步骤的描述,在此不再赘述。可以理解,图7中的各个单元是以功能进行划分的。尽管在图7中将这些单元示出为包含在装置700之内,但是这并不意味着所有的单元必须物理地驻留在同一平台上或包含在同一软件模块内。在一个实施例中,装置700作用为独立的装置或工具;在另一实施例中,装置700的部分单元可以结合到现有的工具或模块中。
[0074]利用本发明实施例的方法和装置,对于修改的程序,可以从整个程序中提取出修改相关路径,并基于原有测试用例,确定出适用于修改相关路径,进而适用于修改的程序的测试用例。由此,避免了针对整个程序重新生成新的测试用例所可能面临的路径状态空间爆炸,提高了提供测试用例的效率。
[0075]本领域技术人员可以理解,附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0076]以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本【技术领域】的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本【技术领域】的其它普通技术人员能理解本文披露的各实施例。
【权利要求】
1.一种为修改的程序提供测试用例的方法,包括: 获取对程序的上一版本进行修改的修改项; 将所述修改项定位到插入在程序中的多个测试探针中的第一测试探针之后和第二测试探针之前; 获取修改后的程序在所述第一测试探针和第二测试探针之间与所述修改相关的执行路径以及所述执行路径对应的约束组; 获取所述第一测试探针输出的利用原有测试用例执行所述上一版本的程序的执行结果;以及 基于所述执行结果和所述约束组,确定适用于所述执行路径的测试用例。
2.根据权利要求1的方法,还包括,在所述程序中插入多个测试探针。
3.根据权利要求1的方法,其中所述第一测试探针和第二测试探针分别是位于所述修改项之前和之后、距离修改项最近的测试探针。
4.根据权利要求1的方法,其中确定适用于所述执行路径的测试用例包括: 利用所述执行结果进一步限定所述约束组以形成组合的约束组; 对所述组合的约束组进行求解; 根据求解的结果,判断所述原有测试用例是否适用于所述执行路径。
5.根据权利要求4的方法,其中所述判断包括,在所述组合的约束组有解的情况下,将所述原有测试用例确定为适用于所述执行路径的测试用例。
6.根据权利要求4的方法,其中所述判断包括,在所述组合的约束组无解的情况下,确定所述原有测试用例不适用于所述执行路径。
7.根据权利要求4或6的方法,其中确定适用于所述执行路径的测试用例还包括,基于所述原有测试用例,生成适用于所述执行路径的新的测试用例。
8.根据权利要求7的方法,其中生成适用于所述执行路径的新的测试用例包括:修改所述约束组中与局部变量相关的参数设置,使得组合的约束组有解;以及,基于修改的参数设置生成新的测试用例。
9.根据权利要求7的方法,其中生成适用于所述执行路径的新的测试用例包括:修改所述执行结果,使得组合的约束组有解;从第一测试探针开始利用数据流分析向前回溯,确定产生修改的执行结果的测试用例,将其作为新的测试用例。
10.根据权利要求1的方法,其中所述执行路径是与所述上一版本的程序中的特定原有路径相对应的修改的执行路径,所述原有测试用例适用于该特定原有路径。
11.一种为修改的程序提供测试用例的装置,包括: 修改项获取单元,配置为获取对程序的上一版本进行修改的修改项; 定位单元,配置为将所述修改项定位到插入在程序中的多个测试探针中的第一测试探针之后和第二测试探针之前; 路径获取单元,配置为获取修改后的程序在所述第一测试探针和第二测试探针之间与所述修改相关的执行路径以及所述执行路径对应的约束组; 执行结果获取单元,配置为获取所述第一测试探针输出的利用原有测试用例执行所述上一版本的程序的执行结果;以及 确定单元,配置为基于所述执行结果和所述约束组,确定适用于所述执行路径的测试用例。
12.根据权利要求11的装置,还包括测试探针插入单元,配置为在所述程序中插入多个测试探针。
13.根据权利要求11的装置,其中所述第一测试探针和第二测试探针分别是位于所述修改项之前和之后、距离修改项最近的测试探针。
14.根据权利要求11的装置,其中所述确定单元包括: 形成模块,配置为利用所述执行结果进一步限定所述约束组以形成组合的约束组; 求解模块,配置为对所述组合的约束组进行求解; 判断模块,配置为根据求解的结果,判断所述原有测试用例是否适用于所述执行路径。
15.根据权利要求14的装置,其中所述判断模块配置为,在所述组合的约束组有解的情况下,将所述原有测试用例确定为适用于所述执行路径的测试用例。
16.根据权利要求14的装置,其中所述判断模块配置为,在所述组合的约束组无解的情况下,确定所述原有测试用例不适用于所述执行路径。
17.根据权利要求14或16的装置,其中所述确定单元还包括生成模块,配置为基于所述原有测试用例,生成适用于所述执行路径的新的测试用例。
18.根据权利要求17的装置,其中所述生成模块配置为:修改所述约束组中与局部变量相关的参数设置,使得组合的约束组有解;以及,基于修改的参数设置生成新的测试用例。
19.根据权利要求17的装置,其中所述生成模块配置为:修改所述执行结果,使得组合的约束组有解;从第一测试探针开始利用数据流分析向前回溯,确定产生修改的执行结果的测试用例,将其作为新的测试用例。
20.根据权利要求11的装置,其中所述执行路径是与所述上一版本的程序中的特定原有路径相对应的修改的执行路径,所述原有测试用例适用于该特定原有路径。
【文档编号】G06F11/36GK104252408SQ201310257810
【公开日】2014年12月31日 申请日期:2013年6月26日 优先权日:2013年6月26日
【发明者】梅立军, 李起成, 谢芳全, 王健, 朱子玉 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1