一种基于函数调用路径的测试用例复用方法转让专利

申请号 : CN201610140764.X

文献号 : CN105808438B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 牟永敏

申请人 : 北京信息科技大学牟永敏

摘要 :

本发明提供一种基于函数调用路径的测试用例复用方法,包括:步骤1、利用待测变更路径确定方法确定新版本软件中需要测试的变更路径集,所述待测变更路径确定方法包括:采集变更函数信息,并从变更路径集中选择变更路径,从而确定最终需要测试的变更路径集;步骤2、生成复用的测试用例。本发明实施例可以对测试用例进行复用以降低测试的工作量、提高测试效率。

权利要求 :

1.一种基于函数调用路径的测试用例复用方法,其特征在于,包括:步骤1、利用待测变更路径确定方法确定新版本软件中需要测试的变更路径集,所述待测变更路径确定方法包括:采集变更函数信息,并从变更路径集中选择变更路径,从而确定最终需要测试的变更路径集;

步骤2、生成复用的测试用例;

其中所述步骤2具体包括:

步骤21、根据路径相似度计算方法和相似函数调用路径选取算法,计算待测变更路径与原函数调用路径的相似度,选取相似度高的原函数调用路径;

步骤22、根据相似度的计算结果对变更路径分类,即结构变化的变更路径和结构未变化的变更路径;

步骤23、分析变更路径的变更函数,并根据变更函数的关联函数,修改不能覆盖对应待测变更路径的测试用例,从而确定最终可复用的测试用例集;

步骤24、对测试用例进行修改;

其中步骤21具体为:

步骤211、将待测变更路径和原函数调用路径作为一段字符串,将路径中的每个函数名称作为一个整体,且这个整体是字符串中的一个字符;

步骤212、使用Levenshtein距离计算原函数调用路径转换为待测变更路径需要操作的次数;其中Levenshtein距离是指由一个字符串转换成另一个字符串所需要编辑操作次数的最小值,编辑操作是指替换操作、添加操作和删除操作;

步骤213、使用公式(2.1)计算函数调用路径与待测变更路径的相似度Dsimilar,Dsimilar越大,表示函数调用路径与变更路径的相似度越高:其中,levenshitein(pathoriginal,pathchange)是原函数调用路径pathoriginal和变更路径pathchange之间的Levenshtein距离,|pathchange|是变更路径pathchange中的函数个数;

若比较的变更路径与原函数调用路径相同,则两者的相似度为1,相似度达到最大值,否则,相似度小于1。

2.根据权利要求1所述的基于函数调用路径的测试用例复用方法,其特征在于,所述步骤1具体包括:步骤11、分析变更部分代码,确定与变更函数存在依赖关系的函数;

步骤12、根据变更函数的依赖函数,确定变更函数的关联函数;

步骤13、通过变更函数和关联函数组成的关联函数对,从新版本软件程序的所有变更路径中选择变更路径,确定最终需要测试的变更路径集。

说明书 :

一种基于函数调用路径的测试用例复用方法

技术领域

[0001] 本发明涉及测试技术领域,特别是指一种基于函数调用路径的测试用例复用方法。

背景技术

[0002] 在软件版本进行升级时,一定会在编写完代码后进行各种测试,且测试的工作量通常非常大。在进行测试时,通常需要编写测试用例,以测试用例作为软件的输入来对软件进行测试。为了软件的稳定性和可靠性,通常需要在测试时编写大量的测试用例,这样导致软件测试通常需要耗费大量的人力物力。

发明内容

[0003] 针对现有技术中需要编写大量测试用例以对软件性测试的问题,本发明实施例提出了一种基于函数调用路径的测试用例复用方法,可以对测试用例进行复用,提高工作效率并降低工作量。
[0004] 为了达到上述目的,本发明实施例提出了一种基于函数调用路径的测试用例复用方法,包括:
[0005] 步骤1、利用待测变更路径确定方法确定新版本软件中需要测试的变更路径集,所述待测变更路径确定方法包括:采集变更函数信息,并从变更路径集中选择变更路径,从而确定最终需要测试的变更路径集;;
[0006] 步骤2、生成复用的测试用例。
[0007] 其中,所述步骤1具体包括:
[0008] 步骤11、分析变更部分代码,确定与变更函数存在依赖关系的函数;
[0009] 步骤12、根据变更函数的依赖函数,确定变更函数的关联函数;
[0010] 步骤13、通过变更函数和关联函数组成的关联函数对,从新版本软件程序的所有变更路径中选择变更路径,确定最终需要测试的变更路径集。
[0011] 其中,步骤2具体包括:
[0012] 步骤21、根据路径相似度计算方法和相似函数调用路径选取算法,计算待测变更路径与原函数调用路径的相似度,选取相似度高的原函数调用路径;
[0013] 步骤22、根据相似度的计算结果对变更路径分类,即结构变化的变更路径和结构未变化的变更路径;
[0014] 步骤23、分析变更路径的变更函数,并根据变更函数的关联函数,修改不能覆盖对应待测变更路径的测试用例,从而确定最终可复用的测试用例集。
[0015] 其中,所述步骤2还包括:
[0016] 步骤24、对测试用例进行修改。
[0017] 本发明实施例可以对测试用例进行复用以降低测试的工作量、提高测试效率。

附图说明

[0018] 图1为本发明实施例中待测变更路径确定方法的流程示意图;
[0019] 图2为本发明实施例中生成可复用的测试用例的流程示意图;
[0020] 图3为本发明实施例中待测变更路径与测试用例的对应关系;
[0021] 图4a为原版本程序函数调用关系图,图4b为新版本软件的修改后的变更程序函数调用关系图;
[0022] 图5为变更路径的结构变化的示意图;
[0023] 图6为示例性的C语言程序变更前和变更后的源代码与其相应的函数调用关系图。

具体实施方式

[0024] 为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
[0025] 首先对本发明实施例中的几个概念进行说明。
[0026] 1、变更函数的关联函数:是指与变更函数fc具有关联关系的函数,即与变更函数fc中的变更部分代码存在依赖关系的函数,同时,变更函数的关联函数是通过人工分析的方式确定的。为了确保变更程序的完整性与正确性,可以在某个函数被修改后,分析变更部分的程序代码,确定与变更部分存在依赖关系的函数,即变更部分所在函数的关联函数,以便测试人员验证关联函数是否受到程序变更的影响。在一个程序中,依赖关系分为数据依赖关系和控制依赖关系,数据依赖关系由同一个数据所引起,控制依赖关系决定着函数的执行顺序。2、函数调用关系:反映了软件程序中两个函数之间的关系,在程序理解与分析、软件测试与维护、编译优化、数据流分析以及许多其他软件工程领域中都有着广泛的应用。在函数调用路径的思想中,一条函数调用路径path={f0,f1,f2……fn}中的相邻两个函数f1和f2之间的关系有两种:函数调用关系和顺序执行关系。如果在函数f1的程序代码中调用了函数f2,
[0027] 那么可能有以下四种情况:
[0028] (1)函数f2的形式参数的值至少有一个是由函数f1中的变量传递的;
[0029] (2)函数f2的执行与函数f1中的变量或与经过函数f1处理过的变量有关;
[0030] (3)函数f2的执行与函数f1的控制条件有关,控制条件可能是if-else、while、for、switch-case等语句中任何一个语句的条件;
[0031] (4)以上三种情况的两种或三种。
[0032] 当出现以上四种可能情况中的任何一种时,则函数f1和f2存在依赖关系。当出现第一种或第二种情况时,函数f1和f2存在数据依赖关系;当出现第三种情况时,函数f1和f2存在控制依赖关系;但是当出现第四种情况时,函数f1和f2有可能存在数据依赖关系,有可能存在控制依赖关系,也有可能既存在数据依赖关系又存在控制依赖关系。
[0033] 除了函数调用关系可以使两个函数产生依赖关系以外,程序中的全局变量会使两个不存在函数调用关系的函数产生数据依赖关系。已知函数fc和函数fd不存在函数调用关系,但是函数fc和函数fd在执行时都需要使用全局变量g,且变量g经过函数fc处理后,被函数fd使用,则函数fc与函数fd存在数据依赖关系。
[0034] 关联函数对是指函数fc与其关联函数fr所组成的个数为2的函数集合,格式为(fc,fr)。函数fr1、fr2是函数fc的关联函数,则(fc,fr1)、(fc,fr2)是关联函数对。
[0035] 在本发明实施例中,原版本软件是指已有软件,而新版本软件是指在原版本软件基础上进行升级、修改或其他操作得到的软件。由于新版本软件对原版本软件进行了各种修改,因此必须对新版本软件进行测试以确定新版本软件是否能正常运行。
[0036] 本发明实施例提出的一种基于函数调用路径的测试用例复用方法,包括:
[0037] 步骤1、利用待测变更路径确定方法确定原版本软件和新版本软件的变更路径集,所述根据待测变更路径确定方法包括:采集变更函数相关信息,并从变更路径集中选择变更路径,从而确定最终需要测试的变更路径集;
[0038] 如图1所示的,具体包括:
[0039] 步骤11、分析变更部分代码,确定与变更函数存在依赖关系的函数;
[0040] 步骤12、根据变更函数的依赖函数,确定变更函数的关联函数;
[0041] 步骤13、通过变更函数和关联函数组成的关联函数对,从新版本软件程序的所有变更路径中选择变更路径,确定最终的变更路径集。
[0042] 在本发明实施例中,待测变更路径确定方法的基本思路为:首先,分析变更部分代码,确定与变更函数存在依赖关系的函数;然后,根据变更函数的依赖函数,确定变更函数的关联函数;最后,通过变更函数和关联函数组成的关联函数对,从新版本软件程序的所有变更路径中选择变更路径,确定最终的需要测试的变更路径集。
[0043] 待测变更路径的选择方法是在新版本程序的所有变更路径已经确定的基础上进行的。新版本程序的所有变更路径是指包含变更函数的所有函数调用路径。在新版本程序的部分变更路径中,除了变更函数,变更部分并不会对这类变更路径中其它函数的执行产生影响,这类变更路径不需要进行回归测试,因此,需要从新版本程序中的所有变更路径中将包含变更函数及其关联函数的变更路径选择出来,形成最终需要测试的变更路径集。
[0044] 待测变更路径选择方法将变更函数及其关联函数组成关联函数对,然后根据组成的关联函数对,从新版本程序的所有变更路径中,将包含关联函数对的变更路径依次选择出来形成变更路径集,该变更路径集就是最终需要测试的变更路径集。待测变更路径选择方法可以缩小回归测试的范围,降低回归测试用例的数量。
[0045] 步骤2、生成复用的测试用例。
[0046] 如图2所示的,本发明实施例中测试用例复用的基本思路是:
[0047] 步骤21、根据路径相似度计算方法和相似函数调用路径选取算法,计算待测变更路径与原函数调用路径的相似度,选取相似度高的原函数调用路径;
[0048] 步骤22、根据相似度的计算结果对变更路径分类,即结构变化的变更路径和结构未变化的变更路径;
[0049] 步骤23、分析变更路径的变更函数,并根据变更函数的关联函数,修改[0050] 不能覆盖对应待测变更路径的测试用例
[0051] ,从而确定最终可复用的测试用例集。
[0052] 进一步的,所述步骤2还包括:
[0053] 步骤24、对测试用例进行修改。
[0054] 步骤2中的测试用例复用方法的基本思路如图2所示。
[0055] 其中,在函数调用路径思想中,函数调用路径与测试用例有一种对应关系,根据这种对应关系和选取的相似函数调用路径,从原测试用例集中选择测试用例。待测变更路径与测试用例的对应关系如图3所示。
[0056] 以下针对步骤21-步骤23分别做出具体说明:
[0057] 步骤21、根据路径相似度计算方法和相似函数调用路径选取算法,计算待测变更路径与原函数调用路径的相似度,选取相似度高的原函数调用路径。
[0058] 这一步是确定可复用的原测试用例的前提。在原函数调用路径集中,可能有多条原函数调用路径经过添加函数、删除函数的操作可以转换为待测变更路径。因此本发明实施例中提出了一种路径相似度方法,通过该方法可以从原函数调用路径集中选取与待测变更路径最相似的原函数调用路径。本发明实施例中使用路径相似度表示原函数调用路径与待测变更路径相似程度的大小。
[0059] 其中,路径相似度是指原函数调用路径与待测变更路径的相似程度,主要是指函数调用路径中函数的个数、路径的结构等。
[0060] 该方法具体为:
[0061] 步骤21、将待测变更路径和原函数调用路径作为一段字符串,将路径中的每个函数名称作为一个整体,且这个整体是字符串中的一个字符;
[0062] 步骤22、使用Levenshtein距离计算原函数调用路径转换为待测变更路径需要操作的次数;其中Levenshtein距离是指由一个字符串转换成另一个字符串所需要编辑操作次数的最小值,编辑操作是指替换操作、添加操作和删除操作;
[0063] 步骤23、使用公式(2.1)计算函数调用路径与待测变更路径的相似度Dsimilar,Dsimilar越大,表示函数调用路径与变更路径的相似度越高:
[0064]
[0065] 其中,levenshitein(pathoriginal,pathchange)是原函数调用路径pathoriginal和变更路径pathchange之间的Levenshtein距离,
[0066] /pathchange/是变更路径pathchange中的函数个数;
[0067] 若比较的变更路径与原函数调用路径相同,则两者的相似度为1,相似度达到最大值,否则,相似度小于1;
[0068] 函数调用路径path1={main,f1,f2,f3,f4,f5,f7},path2={main,f1,f2,f3,f6,f5,f8},变更路径pathc={main,f1,f2,f3,f5,f8},将路径path1和path2看作一段字符串,将path1和path2中的函数(main,f1等)看作一个整体,根据公式(2.1)分别计算path1、path2与变更路径的相似度,path1和pathc的Levenshtein距离是2,则path1与变更路径pathc的相似度是0.71;path2和pathc的Levenshtein距离是1,则path1与变更路径pathc的相似度是0.86。
[0069] 在实际的软件开发项目中,软件变更大多是因为修改某个或某些函数内部代码、添加函数、删除函数等操作所引起的。因此本发明实施例所提出的路径相似度计算公式适用于计算这种软件变更情况下,待测变更路径与原函数调用路径的相似度。
[0070] 步骤22、根据相似度的计算结果对变更路径分类,即结构变化的变更路径和结构未变化的变更路径。
[0071] 由于软件变更大多是有三种修改情况:修改函数内部代码、添加函数、删除函数。根据软件中的函数变更情况,通过采集变更函数信息,确定变更路径,变更路径可分为两类:结构变化的变更路径、结构未变化的变更路径。本发明实施例中所指的结构变化的变更路径是指路径添加或删除了函数,不能在原函数调用路径集中查找到的变更路径;结构未变化的变更路径是指对函数的修改没有对路径中函数的个数以及路径结构产生影响,即路径的结构没有发生变化,并且能够在原函数调用路径集中查找到的变更路径。以循环队列程序为例,假设添加了函数PrintMg,并对函数DeQueue进行修改。如图4a和图4b为例子进行说明:图4a为原版本程序函数调用关系图,图4b为新版本软件的修改后的变更程序函数调用关系图。
[0072] 根据图4a原程序函数调用关系可知,原程序都有3条函数调用路径;而根据图4b的变更程序函数调用关系可知,变更程序有2条变更路径。原程序的函数调用路径集可以总结为如表2.1所示;而变更程序的变更路径集可以总结为表2.2所示。
[0073] 表2.1原函数调用路径集
[0074]编号/i 函数调用路径/pathi
1 main,Initial,EnQueue,IsFull,end
2 main,Initial,EnQueue,IsFull,Front,IsEmpty,end
3 main,Initial,EnQueue,IsFull,Front,IsEmpty,DeQueue,IsEmpty,end
[0075] 表2.2变更路径集
[0076]编号/i 变更路径/pathci
1 main,Initial,EnQueue,IsFull,printMg,end
2 main,Initial,EnQueue,IsFull,Front,IsEmpty,DeQueue,IsEmpty,end
[0077] 由于对函数DeQueue进行了修改,并添加了函数PrintMg,因此函数DeQueue和函数PrintMg是变更函数,则它们所在的函数调用路径为变更路径,即pathc1、pathc2。将变更路径pathc1、pathc2与原函数调用路径集中的函数调用路径进行比较,可以在原函数调用路径集中查找到与变更路径pathc2相同的函数调用路径,path3,则pathc2为结构未变化的变更路径;没有在原函数调用路径集中查找到与变更路径pathc1相同的函数调用路径,则pathc1为结构变化的变更路径。
[0078] 结构变化的变更路径是因为在修改程序时,添加、删除或修改了某个函数,使变更路径中的结点个数发生了变化。变更路径的结构变化有以下几种情况,如图5所示。
[0079] 步骤23、分析变更路径的变更函数,并根据变更函数的关联函数,修改控制逻辑变化的变更路径所对应的测试用例,从而确定最终可复用的测试用例集。
[0080] 确定变更路径后,需要与原函数调用路径集中的函数调用路径进行匹配,选取与变更路径相似的函数调用路径。在匹配过程中,需要计算原函数调用路径与变更路径的相似度,通过相似度的计算结果对变更路径进行分类。若能够在原函数调用路径集中查找到与变更路径相同的函数调用路径,则相似度为1,此变更路径为结构未变化的变更路径。对于不能在原函数调用路径集中查找到相同函数调用路径的变更路径,需要分析图5中列出的变更路径结构变化的几种情况,并通过对相似度计算的结果进行比较,找到与变更路径相似度最高的原函数调用路径。
[0081] 在图5中,变更路径结构发生变化后,有四种情况。如何为结构变化的变更路径查找相似函数调用路径,是相似函数调用路径选取方法的研究重点之一。以图5中第二列的(2)删除f2的变更路径为例,在选取相似函数调用路径的过程中,当遍历到函数f1之后,原函数调用路径中的f1的下一个函数f2与变更路径中的f1的下一个函数f3不相同,则需要遍历函数f2的下一个函数,直到找到与变更路径的函数f3相同的函数或遍历到原函数调用路径的最后一个函数为止。在选取相似函数调用路径的过程中,需要考虑到图5中的四种情况,并为找到不只一条相似函数调用路径的变更路径,计算相似函数调用路径与变更路径的相似度,选取相似度最高的原函数调用路径作为变更路径的相似函数调用路径。
[0082] 相似函数调用路径选取算法需要使用线性链表和图的存储结构—邻接表。线性链表是线性表的链式存储结构,邻接表是图的一种链式的存储结构。
[0083] 线性链表的存储结构如下:
[0084]
[0085] 邻接表的存储结构如下所示。
[0086]
[0087] 相似函数调用路径的选取算法描述如下:
[0088] 输入:pointSet_Ch:变更函数集
[0089] pathSet_Ch:变更路径头结点的集合
[0090] headArr:原函数调用关系图各结点的头结点
[0091] index:原函数调用关系图第一个结点的头结点
[0092] 输出:相同函数调用路径集-结构未变化的变更路径FCPS_Same
[0093] 相似函数调用路径集-结构变化的变更路径FCPS_Similar
[0094] 变量:path_point:当前查找相似函数调用路径的变更路径的结点[0095] point_Ch:当前查找相似函数调用路径的变更路径所对应的变更点[0096] point_AdjacNode:表结点
[0097] point_VertexNode:头结点
[0098] FCP_Similar:查找到的相似函数调用路径
[0099] index_Ch:变更路径头结点的集合的索引值
[0100] Begin
[0101] /*初始化FCPS_Same、FCPS_Similar和FCP_Similar*/
[0102] FCPS_Same=Null;
[0103] FCPS_Similar=Null;
[0104] FCP_Similar=Null;
[0105] executeFirst=false;
[0106] /*初始化index_Ch*/
[0107] index_Ch=0;
[0108] /*为path_point和point_Ch赋值*/
[0109] path_point=pathSet_Ch[index_Ch];
[0110] point_Ch=pointSet_Ch[index_Ch];
[0111] /*为变更路径查找相似FCP*/
[0112] while(index_Ch≠pathSet_Ch.length)do
[0113] /*在原函数调用路径集中查找相似的函数调用路径*/
[0114] point_VertexNode=headArr[index];
[0115] point_VertexNodeLast=point_VertexNode;
[0116] point_AdjacNode=point_VertexNode.first_adjac;
[0117] while(point_AdjacNode≠Null)do
[0118] if(executeFirst)then
[0119] point_VertexNode=headArr[point_AdjacNode.adjac_vertex];
[0120] if(point_VertexNode.data_vertex==path_point.data)then
[0121] point_AdjacNode=point_VertexNode.first_adjac;
[0122] FCP_Similar+=path_point.data;
[0123] path_point=path_point.nextnode;
[0124] point_VertexNodeLast=point_VertexNode;
[0125] end if
[0126] else
[0127] point_AdjacNode=point_AdjacNode.nextadjac;
[0128] end while
[0129] if(path_point.nextnode==Null)then
[0130] FCPS_Same+=FCP_Similar;
[0131] end if
[0132] else
[0133] /*为结构变化的变更路径查找相似度最高的原函数调用路径*/
[0134] FCPS_Similar+=findHighSimilar(path_point,point_Ch,FCP_Similar);
[0135] index_Ch++;
[0136] end while
[0137] 首先,从变更路径头结点的集合中的第一个头结点开始,依次与原函数调用路径的每个结点进行比较,直到最后一条变更路径的头结点。若能够在原函数调用路径集中查找到与变更路径相同的原函数调用路径,说明此变更路径是结构未变化的变更路径,则将查找到的原函数调用路径添加到相同函数调用路径集FCPS_Same中;若不能在原函数调用路径集中查找到与变更路径相同的函数调用路径,说明此变更路径是结构变化的变更路径,则使用方法findHighSimilar()对变更路径做进一步地处理,比较变更路径与原函数调用路径集中函数调用路径的相似度,将得到的最高相似度的原函数调用路径添加到相似函数调用路径集FCPS_Similar中。
[0138] 在使用相似函数调用路径选取算法为变更路径选取相似函数调用路径的过程中,有时会出现一条变更路径有多条高相似度的原函数调用路径,则这条变更路径就会对应多个原测试用例。对于这种情况,需要测试人员根据软件变更的具体情况,从选取的多个原测试用例中选择最适合变更路径的测试用例。
[0139] 步骤24、对测试用例进行修改。
[0140] 根据测试用例与函数调用路径之间的对应关系以及选取的相似函数调用路径集合,从原测试用例集中选择测试用例,确定复用测试用例集。在新版本程序中,由于对函数进行了删除、添加或修改的操作,则在执行选取的复用测试用例时,可能并不能够覆盖对应的待测变更路径,因此,在执行复用的测试用例之前,人工分析变更函数及其关联函数,手动修改不能覆盖待测变更路径的复用测试用例。
[0141] 根据测试用例与函数调用路径之间的对应关系以及选取的相似函数调用路径集合,从原测试用例集中选择测试用例,确定复用测试用例集。在新版本程序中,由于对函数进行了删除、添加或修改的操作,则在执行选取的复用测试用例时,可能并不能够覆盖对应的待测变更路径,因此,在执行复用的测试用例之前,人工分析变更函数及其关联函数,手动修改不能覆盖待测变更路径的复用测试用例。
[0142] 在相似函数调用路径的选取过程中,可综合考虑软件测试预算、设计测试用例开销和修改测试用例开销等因素,设定路径相似度阈值,对于待测变更路径的最大路径相似度值仍然小于路径相似度阈值的情况,需要为此类待测变更路径设计新的测试用例,以达到覆盖待测变更路径的效果。
[0143] 图6是一段C语言程序变更前和变更后的源代码与其相应的函数调用关系图,根据图6对如何修改测试用例做进一步地分析说明。
[0144] 根据原程序与变更程序的函数调用关系图,可以得到原程序与变更程序的函数调用路径;通过分析原程序的源代码并根据函数调用关系图,设计原测试用例。原程序的函数调用路径及测试用例如表2.3所示;变更程序的变更路径及变更函数如表2.4所示。
[0145] 表2.3原程序的函数调用路径及测试用例
[0146]编号/i 函数调用路径/pathi 测试用例/ti
1 main,funF,funS,end f=5,s=3;
2 main,funF,funS,funT,end f=5,s=4;
[0147] 表2.4变更路径及变更函数
[0148]编号/i 函数调用路径/pathci 变更函数
1 main,funF,funS,end funS
2 main,funF,funS,funT,end funS
3 main,funF,funS,funE,end funS,funE
[0149] 因为函数funS被修改,并添加了新的函数funE,所以funS和funE是变更程序的变更函数。根据待测变更路径选择方法确定的最终待测变更路径集为{pathc1、pathc2、pathc3},通过相似函数调用路径选取算法为待测变更路径pathc1、pathc2和pathc3选取的相似函数调用路径分别是path1、path2和path1,根据选取的相似函数调用路径和测试用例与函数调用路径的对应关系,待测变更路径pathc1、pathc2和pathc3相对应的复用测试用例分别是t1、t2和t1,则确定的复用测试用例集为{t1,t2}。在变更函数funS中,修改了funS的if控制语句的条件,并调用了函数funE,因此,执行复用测试用例不能覆盖对应的待测变更路径,分析变更函数funS中变更部分的代码,对不能覆盖对应待测变更路径的复用测试用例进行修改。
[0150] 修改后的复用测试用例及相应的待测变更路径如表2.5所示。
[0151] 表2.5变更路径及测试用例
[0152]编号/i 函数调用路径/pathci 测试用例/tci
1 main,funF,funS,end f=5,s=4;
2 main,funF,funS,funT,end f=5,s=5;
3 main,funF,funS,funE,end f=5,s=6;
[0153] pathc1的相似函数调用路径是path1,对应的复用测试用例为t1。路径path1对应控制条件是“sa%2==0”,待测变更路径pathc1对应的控制条件是“sa%3==0”,由于控制条件发生变化,执行复用测试用例t1(f=5,s=3)不能覆盖待测变更路径pathc1,因此,需要从函数funS开始,修改复用测试用例t1,将t1(f=5,s=3)修改为测试用例tc1(f=5,s=4),执行tc1后可以覆盖待测变更路径pathc1。同理,将待测变更路径pathc2和pathc3对应的复用测试用例t2(f=5,s=4)和t1(f=5,s=3)修改为tc2(f=5,s=5)和tc3(f=5,s=6),使修改后的复用测试用例可以覆盖对应的待测变更路径。
[0154] 以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。