CN114780439B - 一种面向参数路径流图的相似程序间测试用例的重用方法 - Google Patents
一种面向参数路径流图的相似程序间测试用例的重用方法 Download PDFInfo
- Publication number
- CN114780439B CN114780439B CN202210659622.XA CN202210659622A CN114780439B CN 114780439 B CN114780439 B CN 114780439B CN 202210659622 A CN202210659622 A CN 202210659622A CN 114780439 B CN114780439 B CN 114780439B
- Authority
- CN
- China
- Prior art keywords
- parameter
- program
- path
- similarity
- flow graph
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/12—Computing arrangements based on biological models using genetic models
- G06N3/126—Evolutionary algorithms, e.g. genetic algorithms or genetic programming
Abstract
本发明提出一种面向参数路径流图的相似程序间测试用例的重用方法,该方法包括如下步骤:步骤一,参数路径流图构建,以函数块为单位进行构建以得到待测程序的参数路径流图;步骤二,生成最大公共子路径图;步骤三,程序相似度计算,根据预设公式计算得到最大公共子路径图的相似度,根据最大公共子路径图的相似度计算得到待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度;根据待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度计算得到程序相似度;步骤四,测试用例的生成与重用。本发明能够对程序间的相似性进行有效检测,且扩大了可检测相似程序的范围,提高了测试用例的利用率。
Description
技术领域
本发明涉及程序测试技术领域,特别涉及一种面向参数路径流图的相似程序间测试用例的重用方法。
背景技术
在进行软件测试时,人们更加注重软件测试效率,而提升测试效率的关键之一是恰当地选择与生成测试用例。目前,测试用例生成方面的研究较为广泛,但随着软件层出不穷,各大企业拥有大量测试用例,却存在无法充分共享的问题,这使得测试用例使用不充分。通过挖掘程序间的相似性,寻找符合重用条件的程序并重用测试用例,不仅可提高优秀用例的利用率,节省测试成本,还有助于提高相似程序间的用例生成效率,提升软件质量。
目前,程序代码相似性研究已趋于成熟,可从程序语义层次分析相似性,也可从图和序列等角度判定程序相似性。其中,图结构是较为高级的语法特征,可将繁琐的程序提炼为精简的表达方式。在简化程序相似性比较的同时,也可保证检测结果的准确性。从现有研究看,一方面,使用图或序列等结构化形式比较程序间的相似度具有可行性;另一方面,相似程序间具有用例重用的基础。
然而,已有研究在程序相似性检测与测试用例重用方面未考虑程序中参数(包括输入参数、自定义变量、常量等)之间的关联性以及输入参数与测试数据之间的相关性。程序相似性检测方法的准确性极大地影响着测试用例重用效率。若相似性检测方法不准确或检测错误,不仅无法找到合适的测试数据来提高测试效率,反而会重用到不相似程序的测试用例进行演化,导致测试生成过程的整体效率降低。此外,在重用相似程序的测试用例时,程序中的输入参数所流经的路径对应测试数据所需的覆盖路径,若仅研究输入参数,可检测出适用于测试用例重用的相似程序十分有限,且检测结果的准确性较低,故需涵盖程序中的多种信息,包括输入参数、定义参数、关键字等。这不仅考虑了程序的数据流,也兼顾了其控制结构,相比于数据流图和控制流图,涉及因素相对较多。同时,通过分析参数间的关系可使得程序内部的相似性比较更为细致。
综上,程序的参数路径(包括输入参数与定义参数的路径)、结构和测试用例之间存在一定联系。然而,现有技术中,仍缺少一种行之有效的能同时结合参数路径、结构以及测试用例之间的关系来检测相似程序,并将相似程序的优秀测试用例充分重用到待测程序中的方法。
发明内容
鉴于上述状况,本发明的主要目的是为了提出一种面向参数路径流图的相似程序间测试用例的重用方法,以解决上述技术问题。
本发明实施例提供了一种面向参数路径流图的相似程序间测试用例的重用方法,其中,所述方法包括如下步骤:
步骤一,参数路径流图构建:
以函数块为单位进行构建以得到待测程序的参数路径流图;
步骤二,生成最大公共子路径图:
在构建得到的参数路径流图中选择程序块,判断已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型是否相似;
若相似,则搜索所述参数路径流图,根据所述参数路径流图的节点层记录参数路径;
根据所述参数路径经过的节点数计算得到参数依赖度,并判断所述参数依赖度是否高于阈值;
若是,则通过参数择优方式筛选出符合相似度计算的最佳参数路径组,根据已知程序与待测程序的最佳参数路径组生成对应的状态转移矩阵,并根据所述状态转移矩阵计算得到最大公共子路径图;
步骤三,程序相似度计算:
根据预设公式计算得到所述最大公共子路径图的相似度,并根据所述最大公共子路径图的相似度计算得到待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度,其中所述待测程序中包含多个待测程序块,所述已知程序中包含多个已知程序块;
根据待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度计算得到程序相似度;
步骤四,测试用例的生成与重用:
根据所述程序相似度判断程序之间的相似性,若相似,则生成测试用例并进行重用。
本发明提出一种面向参数路径流图的相似程序间测试用例的重用方法,以程序块为单位,构建参数路径流图,通过参数路径流图的最大公共子路径图计算程序相似度。本发明可将程序间的差异性缩小,并兼顾参数间的关联性和程序的结构与功能,能够对程序间的相似性进行有效检测;
再者,本发明能够充分使用已有优秀个体,优化遗传进化过程中的过拟合问题,完成待测程序的测试用例生成,以提升测试用例生成的效率;
最后,本发明利用PPFD检测程序相似性不限制程序输入参数的类型和个数。对于一些参数特征不同的程序,仍可进行相似性检测和测试用例重用,扩大了可检测相似程序的范围,提高了测试用例的利用率。
所述一种面向参数路径流图的相似程序间测试用例的重用方法,其中,在所述步骤一中,所述参数路径流图的构建方法包括如下步骤:
输入已知程序的源代码,记录源代码的关键字与符号,并将所述已知程序进行格式化处理;
根据格式化后的已知程序,先识别源代码中用于划分程序类的关键字class,以构建参数路径流图的根节点;若存在关键字class,则将包含关键字class的语句中的参数保存在根节点中;若不存在关键字class,则将根节点记为Null;其中,根节点仅记录已知程序中以class定义的类名所涉及的参数;
在根节点构建完成后,继续识别源代码中用于划分函数块的关键字def,以构建参数路径流图的第一层节点;若存在关键字def,则将包含关键字def的语句中的所有参数保存在第一层节点中;若不存在关键字def,则将第一层节点记为null;其中,第一层节点用于记录以def定义的函数名所涉及的参数;
在第一层节点构建完成后,以函数块为单位,依次构建参数路径流图的第二层节点及第二层之后的节点;按行进行搜索,记录每个函数块中所有的参数路径;若当前行包含关键字,将涉及的对应参数保存在对应层的节点中,继续搜索下一行;若当前行不包含关键字,则将当前行所涉及的参数保存在上一层的节点中;依次逐行进行搜索,直至所有函数块的参数均保存在对应节点中,即完成所述参数路径流图的构建。
所述一种面向参数路径流图的相似程序间测试用例的重用方法,其中,在所述步骤二中,参数类型包括粗粒度类型与细粒度类型,判断已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型是否相似的方法包括如下步骤:
判断已知程序的输入参数的粗粒度类型是否与待测程序的程序块中参数的粗粒度类型是否相似;
若相似,则继续判断已知程序的输入参数的细粒度类型是否与待测程序的程序块中参数的细粒度类型是否相似;
若相似,则判定已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型相似;
其中,所述粗粒度类型中,字符串类型和字典类型互为不相似参数类型,数字类型、元组类型、列表类型和集合类型互为相似参数类型;所述细粒度类型中,int、float与complex互为相似参数类型。
所述一种面向参数路径流图的相似程序间测试用例的重用方法,其中,在所述步骤二中,所述参数依赖度的表达式为:
所述一种面向参数路径流图的相似程序间测试用例的重用方法,其中,在所述步骤三中,所述最大公共子路径图的相似度的计算公式为:
其中,为最大公共子路径图的相似度,为待测程序的程序块中的第m个非空子路径图,为已知程序的程序块中的第n个非空子路径图,为待测程序的非空子路径图的节点数,为已知程序的非空子路径图的节点数,为最大公共子路径节点数,m为待测程序的程序块中的非空子路径图的序号,n为已知程序的程序块中的非空子路径图的序号,为待测程序块的参数路径流图中的参数个数与已知程序块的参数路径流图中的参数个数之间的最大值。
所述一种面向参数路径流图的相似程序间测试用例的重用方法,其中,在所述步骤三中,待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度的表达式为:
其中,为待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度,为待测程序块的参数路径流图中的参数个数,为已知程序块的参数路径流图中的参数个数,为待测程序块的参数路径流图,为已知程序块的参数路径流图。
所述一种面向参数路径流图的相似程序间测试用例的重用方法,其中,在所述步骤三中,根据待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度计算得到程序相似度的表达式为:
所述一种面向参数路径流图的相似程序间测试用例的重用方法,其中,测试用例的生成与重用的方法包括如下步骤:
初始化遗传参数,将多点交叉的概率设置为0.9,单点变异的概率设置为0.1,初始种群的规模设置为40,最大进化代数设置为1000;
将随机生成的测试用例转化为二进制编码;
判断种群进化代数是否达到进化代数阈值,若未达到进化代数阈值,则对种群个体进行适应度计算;
根据适应度与轮盘赌法选择可进行交叉的较优测试用例;
经过交叉后的种群个体再进行多点变异,进而产生新的种群,并对新的种群采用十进制编码,输入至待测程序中以用于覆盖目标路径;
若种群进化代数达到进化代数阈值,或已覆盖目标路径,则完成测试用例的重用。
所述一种面向参数路径流图的相似程序间测试用例的重用方法,其中,对种群个体进行适应度计算的步骤中,存在如下表达式:
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实施例了解到。
附图说明
图1为本发明提出的面向参数路径流图的相似程序间测试用例的重用方法的流程图;
图2为本发明中程序相似性检测与测试用例重用的原理框架图;
图3为本发明中程序相似性检测的原理图;
图4为本发明中两个示例源程序的代码示意图;
图5为本发明中两个示例程序的参数路径流图;
图6为本发明中相似参数类型的示意图;
图7为本发明中参数择优的示意图;
图8为本发明中测试用例生成及重用过程的原理示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
参照下面的描述和附图,将清楚本发明的实施例的这些和其他方面。在这些描述和附图中,具体公开了本发明的实施例中的一些特定实施方式,来表示实施本发明的实施例的原理的一些方式,但是应当理解,本发明的实施例的范围不受此限制。相反,本发明的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。
请参阅图1,本发明提出一种面向参数路径流图的相似程序间测试用例的重用方法。此外,如图2所示,本发明的工作原理主要分为两个模块,即程序相似性检测模块与测试用例重用模块。其中,程序相似性检测模块包括参数路径流图构建与参数路径相似度比较(即,为了计算程序的相似度),测试用例重用模块即重用相似程序的优秀测试用例。需要说明的,程序相似性检测是测试用例重用的前提,本发明将参数路径相似度作为程序块的相似度,具体检测过程如图3所示。
具体的,上述的面向参数路径流图的相似程序间测试用例的重用方法包括如下步骤:
S101,参数路径流图构建。
其中,以函数块为单位进行构建以得到待测程序的参数路径流图。参数路径流图(Parameter Path Flow Diagram,PPFD),由参数路径组成,是形如(root, function, p)的三元组结构,其中root是根节点且唯一,用于存储程序类,若不存在则记为null;function表示程序块,记录其涉及的参数;p表示参数路径,列表类型,用于记录每个程序块中参数路径上的节点。
为了更清晰地展示参数路径构建过程,在此以冒泡排序和简单选择排序为例进行说明,程序源代码见图4所示。需要说明的是,本发明的实验对象均为Python编程语言编写的源程序。根据图4绘制的两个示例程序的参数路径流图,如图5所示。
在步骤S101中,参数路径流图的构建方法包括如下步骤:
S1011,输入已知程序的源代码,记录源代码的关键字与符号,并将所述已知程序进行格式化处理。
S1012,根据格式化后的已知程序,先识别源代码中用于划分程序类的关键字class,以构建参数路径流图的根节点;若存在关键字class,则将包含关键字class的语句中的参数保存在根节点中;若不存在关键字class,则将根节点记为Null;其中,根节点仅记录已知程序中以class定义的类名所涉及的参数。
S1013,在根节点构建完成后,继续识别源代码中用于划分函数块的关键字def,以构建参数路径流图的第一层节点;若存在关键字def,则将包含关键字def的语句中的所有参数保存在第一层节点中;若不存在关键字def,则将第一层节点记为null;其中,第一层节点用于记录以def定义的函数名所涉及的参数。
S1014,在第一层节点构建完成后,以函数块为单位,依次构建参数路径流图的第二层节点及第二层之后的节点;按行进行搜索,记录每个函数块中所有的参数路径;若当前行包含关键字,将涉及的对应参数保存在对应层的节点中,继续搜索下一行;若当前行不包含关键字,则将当前行所涉及的参数保存在上一层的节点中;依次逐行进行搜索,直至所有函数块的参数均保存在对应节点中,即完成所述参数路径流图的构建。
举例说明:参数路径流图构建过程示例(以冒泡排序为例,其参数路径流图见图5中的左边的图a)。
由冒泡排序的源代码(如图4所示)可知,该程序不包含以class定义的类,则PPFD的根节点Root记为Null;第1行是以def定义的函数方法名,包含参数lst,故将lst保存在PPFD的第一层节点中;第2行是for定义的循环语句,包含参数n和lst,则将这两个参数保存在第二层节点中;第3行是for定义的循环语句,其包含参数i和n,则将这两个参数保存在第三层节点中;第4行是if定义的判定语句,且第5-7行是该if语句的复合语句块,不再包含关键字,则将4-7行涉及的参数lst, i, t保存在第四层节点中;第8行是return返回语句,包含参数lst,则将lst保存在第五层节点中。此时,已遍历完所有语句,冒泡排序的PPFD构建完成。
S102,生成最大公共子路径图。
具体的,步骤S102包括如下分步骤:
S1021,在构建得到的参数路径流图中选择程序块,判断已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型是否相似。
如上所述,构建源程序的参数路径流图后,记录参数路径流图中的参数路径,为比较程序相似性做准备。在此之前,需判断程序块的输入参数是否符合相似参数类型(即,经适当转换后可用于用例重用的参数类型)。例如,元组类型和列表类型为相似参数类型,整型和浮点型为相似参数类型。具体相似参数类型如图6所示。
其中,参数类型包括粗粒度类型与细粒度类型,判断已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型是否相似的方法包括如下步骤:
S1021a,判断已知程序的输入参数的粗粒度类型是否与待测程序的程序块中参数的粗粒度类型是否相似;
S1021b,若相似,则继续判断已知程序的输入参数的细粒度类型是否与待测程序的程序块中参数的细粒度类型是否相似;
S1021c,若相似,则判定已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型相似。
其中,所述粗粒度类型中,字符串类型和字典类型互为不相似参数类型,数字类型、元组类型、列表类型和集合类型互为相似参数类型;所述细粒度类型中,int、float与complex互为相似参数类型。
需要说明的是,请参阅图6,粗粒度类型中的数字类型用于初步界定程序输入的参数是否为数字,由于元组、列表、集合等类型的单个数值均可能为数字或字符串等类型,因此需进一步展开细粒度类型的比较,即通过int、float与complex再次界定经粗粒度类型判定后为相似类型的参数是否为数字类型。boolean为布尔类型。
举例说明:相似参数类型判定(以冒泡排序和简单选择排序为例)。
在冒泡排序和简单选择排序中,输入参数均为粗粒度类型中的列表类型,细粒度类型中的数字类型(即int, float, complex类型)。故这两个程序参数类型相似,可进行参数路径比较。
S1022,若相似,则搜索所述参数路径流图,根据所述参数路径流图的节点层记录参数路径。
随着程序规模增大,参数个数不断增加,若逐一比较,这必将花费大量时间。因此,需筛选出较优的参数路径,并生成最大公共子路径图,作为程序相似性比较的对象。此外,考虑到待测程序中部分参数对相似性检测存在一定的干扰,例如定义用于计数的变量以及初始化程序类的参数等。
鉴于上述情况以及参数间的关联性,本发明在参数路径流图的基础上,通过参数择优算法寻找最优参数路径组(Optimal Parameter Path Group, OPPG),优化参数路径相似度的比较过程,参数择优操作如图7所示。
图7中,程序A和程序B均存在最优参数路径组。例如,程序A中的参数lst和i的依赖度达到阈值,即其最优参数路径组为lst和i的路径。分别筛选出程序A和程序B的最优参数路径组后,生成最大公共子路径图逐一比较它们的参数路径,计算程序相似度。需要指出的是,由于以class定义的类名中很少涉及参数,即使存在,该参数出现在函数块中的频率也非常低,但根节点在PPFD中作为划分程序结构又是必不可少的因素。因此,为简化参数路径相似度比较过程,本发明从第一层节点开始表示参数路径。如上操作不仅可划分程序结构,也便于找到相似程序。
在本步骤中,搜索参数路径流图,依据参数路径流图的节点层记录参数路径。若参数在该节点层出现,则将该参数的路径记为1;若未出现,则记为0。以函数块为单位,记录所有参数路径。
S1023,根据所述参数路径经过的节点数计算得到参数依赖度,并判断所述参数依赖度是否高于阈值。
具体的,上述的参数依赖度的表达式为:
S1024,若是,则通过参数择优方式筛选出符合相似度计算的最佳参数路径组,根据已知程序与待测程序的最佳参数路径组生成对应的状态转移矩阵,并根据所述状态转移矩阵计算得到最大公共子路径图。
举例说明:参数路径记录方式(以冒泡排序为例)。
如图5中的左图a所示,冒泡排序中包含4个参数,它们的路径分别为:[1,1,0,1,1](参数lst)、[0,1,1,0,0](参数n)、[0,0,1,1,1](参数i)和[0,0,0,0,1](参数t),其中“1”表示该参数经过某一层节点,“0”则表示未经过。例如,参数lst经过的节点为第一层节点、第二层节点、第四层节点和第五层节点,未经过第三层。
举例说明:参数依赖度计算(以冒泡排序为例)。
在冒泡排序中,参数lst的路径为[1,1,0,1,1],参数n的路径为[0,1,1,0,0],其中同时经过的路径节点数SN为1,同时未经过的路径节点数DN为0,最长路径节点数LN为5,则参数lst与n的依赖度Dep=(1+0)/5*100%=20%。
S103,程序相似度计算。
S1031,根据预设公式计算得到所述最大公共子路径图的相似度,并根据所述最大公共子路径图的相似度计算得到待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度。
其中,所述待测程序中包含多个待测程序块,所述已知程序中包含多个已知程序块。
所述最大公共子路径图的相似度的计算公式为:
其中,为最大公共子路径图的相似度,为待测程序的程序块中的第m个非空子路径图,为已知程序的程序块中的第n个非空子路径图,为待测程序的非空子路径图的节点数,为已知程序的非空子路径图的节点数,为最大公共子路径节点数,m为待测程序的程序块中的非空子路径图的序号,n为已知程序的程序块中的非空子路径图的序号,为待测程序块的参数路径流图中的参数个数与已知程序块的参数路径流图中的参数个数之间的最大值。
S1032,根据待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度计算得到程序相似度。
待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度的表达式为:
其中,为待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度,为待测程序块的参数路径流图中的参数个数,为已知程序块的参数路径流图中的参数个数,为待测程序块的参数路径流图,为已知程序块的参数路径流图。
进一步的,程序相似度的表达式为:
举例说明:两个程序相似度计算(以冒泡排序和简单选择排序为例,它们的源代码见图4,参数路径流图见图5)。
根据图5可知,在冒泡排序中,非空子路径图D 1包括子路径D 11:[0,0,1,1,1],参数个数mpc 1=1;简单选择排序的非空子路径图D 2包含两条子路D 21:[0,1,1,1,0]和D 22:[0,0,1,1,1],参数个数mpc 2=2。最大公共子路径为mcs 1(D 11,D 21)=[0,1,1,1],mcs 2(D 11,D 22)=[0,0,1,1,1],距离分别为J 1(D 11,D 21)=1-4/5=0.2、J 2(D 11,D 22)=1-1/1=0;
则程序块的非空子路径图D 1和D 2的相似度S(D 1, D 2)=S(D 11,D 21)+S(D 11,D 22)=
((1-0.2)/2+(1-0)/2)*100%=90%,故函数块的相似度为Sim=S(D 1 ,D 2)/mpc 1=(0.9*
100%)/1=90%。即,冒泡排序和简单选择排序的相似度为90%。
S104,测试用例的生成与重用。
根据所述程序相似度判断程序之间的相似性,若相似,则生成测试用例并进行重用。通过构建参数路径流图以及计算参数路径路径相似度后可检测出相似程序,再利用遗传算法实现相似程序间测试用例的重用,进而提高待测程序测试用例生成效率。在传统遗传算法上通过改进其适应度函数,引入已有程序中适应度值较高的种群个体(即,优秀个体)执行进化操作,过程如图8所示。
具体的,测试用例的生成与重用的方法包括如下步骤:
S1041,初始化遗传参数,将多点交叉的概率设置为0.9,单点变异的概率设置为0.1,初始种群的规模设置为40,最大进化代数设置为1000。
S1042,将随机生成的测试用例转化为二进制编码。
该设置以便种群个体基因进行交叉变异等操作,使得基因丰富多样。
S1043,判断种群进化代数是否达到进化代数阈值,若未达到进化代数阈值,则对种群个体进行适应度计算。
对种群个体进行适应度计算的步骤中,存在如下表达式:
其中,为适应度函数,为最大分支路径数,为适应度,为分支路径数的取值。由适应函数的计算公式可推算出,测试用例的适应度值与分支节点覆盖率成正比例关系。特别地,当待测程序的每个分支节点均被覆盖时,该测试用例的适应度为100%。
S1044,根据适应度与轮盘赌法选择可进行交叉的较优测试用例。
在此过程中,不仅与原种群个体进行交叉,同时引入已知相似程序的优秀测试用例(已转换为二进制编码)进行交叉操作。由于不同程序间测试用例的长度以及类型存在一定差异,具有相同规格的测试用例十分稀少,若在初始化种群过程中引入已有优秀用例,无法直接进行重用,同时还加大了整个测试用例重用的难度,降低重用效率。
S1045,经过交叉后的种群个体再进行多点变异,进而产生新的种群,并对新的种群采用十进制编码,输入至待测程序中以用于覆盖目标路径。
S1046,若种群进化代数达到进化代数阈值,或已覆盖目标路径,则完成测试用例的重用。
举例说明:冒泡排序和简单选择排序经检验为一组相似程序。在此假设已知程序为简单选择排序,待测程序为冒泡排序。其中,简单选择排序的一个测试用例为:list =[7,9,8,1],将list中的4个数字转换为二进制编码,通过进化算法给待测程序(即,冒泡排序)生成覆盖目标路径的测试用例时,在种群交叉过程中引入这些二进制编码辅助进化操作。
本发明提出一种面向参数路径流图的相似程序间测试用例的重用方法,以程序块为单位,构建参数路径流图,通过参数路径流图的最大公共子路径图计算程序相似度。本发明可将程序间的差异性缩小,并兼顾参数间的关联性和程序的结构与功能,能够对程序间的相似性进行有效检测;
再者,本发明能够充分使用已有优秀个体,优化遗传进化过程中的过拟合问题,完成待测程序的测试用例生成,以提升测试用例生成的效率;
最后,本发明利用PPFD检测程序相似性不限制程序输入参数的类型和个数。对于一些参数特征不同的程序,仍可进行相似性检测和测试用例重用,扩大了可检测相似程序的范围,提高了测试用例的利用率。
应当理解的,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、 “示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (9)
1.一种面向参数路径流图的相似程序间测试用例的重用方法,其特征在于,所述方法包括如下步骤:
步骤一,参数路径流图构建:
以函数块为单位进行构建以得到待测程序的参数路径流图;
步骤二,生成最大公共子路径图:
在构建得到的参数路径流图中选择程序块,判断已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型是否相似;
若相似,则搜索所述参数路径流图,根据所述参数路径流图的节点层记录参数路径;
根据所述参数路径经过的节点数计算得到参数依赖度,并判断所述参数依赖度是否高于阈值;
若是,则通过参数择优方式筛选出符合相似度计算的最佳参数路径组,根据已知程序与待测程序的最佳参数路径组生成对应的状态转移矩阵,并根据所述状态转移矩阵计算得到最大公共子路径图;
步骤三,程序相似度计算:
根据预设公式计算得到所述最大公共子路径图的相似度,并根据所述最大公共子路径图的相似度计算得到待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度,其中所述待测程序中包含多个待测程序块,所述已知程序中包含多个已知程序块;
根据待测程序块的参数路径流图与已知程序块的参数路径流图之间的相似度计算得到程序相似度;
步骤四,测试用例的生成与重用:
根据所述程序相似度判断程序之间的相似性,若相似,则生成测试用例并进行重用。
2.根据权利要求1所述的一种面向参数路径流图的相似程序间测试用例的重用方法,其特征在于,在所述步骤一中,所述参数路径流图的构建方法包括如下步骤:
输入已知程序的源代码,记录源代码的关键字与符号,并将所述已知程序进行格式化处理;
根据格式化后的已知程序,先识别源代码中用于划分程序类的关键字class,以构建参数路径流图的根节点;若存在关键字class,则将包含关键字class的语句中的参数保存在根节点中;若不存在关键字class,则将根节点记为Null;其中,根节点仅记录已知程序中以class定义的类名所涉及的参数;
在根节点构建完成后,继续识别源代码中用于划分函数块的关键字def,以构建参数路径流图的第一层节点;若存在关键字def,则将包含关键字def的语句中的所有参数保存在第一层节点中;若不存在关键字def,则将第一层节点记为null;其中,第一层节点用于记录以def定义的函数名所涉及的参数;
在第一层节点构建完成后,以函数块为单位,依次构建参数路径流图的第二层节点及第二层之后的节点;按行进行搜索,记录每个函数块中所有的参数路径;若当前行包含关键字,将涉及的对应参数保存在对应层的节点中,继续搜索下一行;若当前行不包含关键字,则将当前行所涉及的参数保存在上一层的节点中;依次逐行进行搜索,直至所有函数块的参数均保存在对应节点中,即完成所述参数路径流图的构建。
3.根据权利要求1所述的一种面向参数路径流图的相似程序间测试用例的重用方法,其特征在于,在所述步骤二中,参数类型包括粗粒度类型与细粒度类型,判断已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型是否相似的方法包括如下步骤:
判断已知程序的输入参数的粗粒度类型是否与待测程序的程序块中参数的粗粒度类型是否相似;
若相似,则继续判断已知程序的输入参数的细粒度类型是否与待测程序的程序块中参数的细粒度类型是否相似;
若相似,则判定已知程序的输入参数的参数类型与所述待测程序的程序块中的参数类型相似;
其中,所述粗粒度类型中,字符串类型和字典类型互为不相似参数类型,数字类型、元组类型、列表类型和集合类型互为相似参数类型;所述细粒度类型中,int、float与complex互为相似参数类型。
8.根据权利要求1所述的一种面向参数路径流图的相似程序间测试用例的重用方法,其特征在于,测试用例的生成与重用的方法包括如下步骤:
初始化遗传参数,将多点交叉的概率设置为0.9,单点变异的概率设置为0.1,初始种群的规模设置为40,最大进化代数设置为1000;
将随机生成的测试用例转化为二进制编码;
判断种群进化代数是否达到进化代数阈值,若未达到进化代数阈值,则对种群个体进行适应度计算;
根据适应度与轮盘赌法选择可进行交叉的较优测试用例;
经过交叉后的种群个体再进行多点变异,进而产生新的种群,并对新的种群采用十进制编码,输入至待测程序中以用于覆盖目标路径;
若种群进化代数达到进化代数阈值,或已覆盖目标路径,则完成测试用例的重用。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210659622.XA CN114780439B (zh) | 2022-06-13 | 2022-06-13 | 一种面向参数路径流图的相似程序间测试用例的重用方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210659622.XA CN114780439B (zh) | 2022-06-13 | 2022-06-13 | 一种面向参数路径流图的相似程序间测试用例的重用方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114780439A CN114780439A (zh) | 2022-07-22 |
CN114780439B true CN114780439B (zh) | 2022-09-27 |
Family
ID=82421757
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210659622.XA Active CN114780439B (zh) | 2022-06-13 | 2022-06-13 | 一种面向参数路径流图的相似程序间测试用例的重用方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114780439B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114968824B (zh) * | 2022-07-28 | 2022-09-30 | 江西财经大学 | 一种基于链式多路径覆盖的测试方法与系统 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102063374A (zh) * | 2011-01-07 | 2011-05-18 | 南京大学 | 一种使用半监督信息进行聚类的回归测试用例选择方法 |
CN102708047A (zh) * | 2012-04-23 | 2012-10-03 | 福建师范大学 | 数据流测试用例生成方法 |
CN103729297A (zh) * | 2013-12-31 | 2014-04-16 | 北京理工大学 | 一种基于分层遗传算法的测试用例生成方法 |
CN103902449A (zh) * | 2012-12-28 | 2014-07-02 | 百度在线网络技术(北京)有限公司 | 一种用于生成搜索引擎相关性排序测试用例的方法与设备 |
CN105138335A (zh) * | 2015-08-28 | 2015-12-09 | 牟永敏 | 一种基于控制流图的函数调用路径提取方法及装置 |
CN105808438A (zh) * | 2016-03-11 | 2016-07-27 | 北京信息科技大学 | 一种基于函数调用路径的测试用例复用方法 |
CN110262957A (zh) * | 2019-04-12 | 2019-09-20 | 江西财经大学 | 一种相似程序间测试用例的重用方法及其实现系统 |
CN110377511A (zh) * | 2019-07-11 | 2019-10-25 | 河海大学 | 一种面向数据流的测试用例生成方法 |
CN111240995A (zh) * | 2020-01-21 | 2020-06-05 | 江西财经大学 | 结合关键点概率与路径相似度的多路径覆盖方法及系统 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8819642B2 (en) * | 2012-05-17 | 2014-08-26 | Cognizant Technology Solutions India Pvt. Ltd. | Method and system for generating and processing black box test cases |
US8949795B2 (en) * | 2012-08-23 | 2015-02-03 | International Business Machines Corporation | Generating test cases for covering enterprise rules and predicates |
IN2013CH05995A (zh) * | 2013-12-20 | 2015-06-26 | Infosys Ltd | |
US10705943B2 (en) * | 2017-09-08 | 2020-07-07 | Devfactory Innovations Fz-Llc | Automating identification of test cases for library suggestion models |
-
2022
- 2022-06-13 CN CN202210659622.XA patent/CN114780439B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102063374A (zh) * | 2011-01-07 | 2011-05-18 | 南京大学 | 一种使用半监督信息进行聚类的回归测试用例选择方法 |
CN102708047A (zh) * | 2012-04-23 | 2012-10-03 | 福建师范大学 | 数据流测试用例生成方法 |
CN103902449A (zh) * | 2012-12-28 | 2014-07-02 | 百度在线网络技术(北京)有限公司 | 一种用于生成搜索引擎相关性排序测试用例的方法与设备 |
CN103729297A (zh) * | 2013-12-31 | 2014-04-16 | 北京理工大学 | 一种基于分层遗传算法的测试用例生成方法 |
CN105138335A (zh) * | 2015-08-28 | 2015-12-09 | 牟永敏 | 一种基于控制流图的函数调用路径提取方法及装置 |
CN105808438A (zh) * | 2016-03-11 | 2016-07-27 | 北京信息科技大学 | 一种基于函数调用路径的测试用例复用方法 |
CN110262957A (zh) * | 2019-04-12 | 2019-09-20 | 江西财经大学 | 一种相似程序间测试用例的重用方法及其实现系统 |
CN110377511A (zh) * | 2019-07-11 | 2019-10-25 | 河海大学 | 一种面向数据流的测试用例生成方法 |
CN111240995A (zh) * | 2020-01-21 | 2020-06-05 | 江西财经大学 | 结合关键点概率与路径相似度的多路径覆盖方法及系统 |
Non-Patent Citations (2)
Title |
---|
A Strategy for Multi-target Paths Coverage by Improving Individual Information Sharing;Zhongsheng Qian等;《https://koreascience.kr/article/JAKO201905959990568.pdf》;20191130;5464-5488 * |
面向关键字流图的相似程序间测试用例的重用;钱忠胜等;《软件学报》;20210924;第32卷(第9期);2691-2712 * |
Also Published As
Publication number | Publication date |
---|---|
CN114780439A (zh) | 2022-07-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107229563B (zh) | 一种跨架构的二进制程序漏洞函数关联方法 | |
Kreimer | Adaptive detection of design flaws | |
US7801924B2 (en) | Decision tree construction via frequent predictive itemsets and best attribute splits | |
CA2868236C (en) | Editing and compiling business rules | |
US8370808B2 (en) | Apparatus and a method for generating a test case | |
CN112579477A (zh) | 一种缺陷检测方法、装置以及存储介质 | |
CN103729580A (zh) | 一种检测软件抄袭的方法和装置 | |
CN101739335A (zh) | 建议的应用评估系统 | |
JPH08241193A (ja) | コード・セグメント解析方法。 | |
CN114780439B (zh) | 一种面向参数路径流图的相似程序间测试用例的重用方法 | |
CN111966817B (zh) | 基于深度学习及代码上下文结构和文本信息的api推荐方法 | |
CN114185769A (zh) | 基于双向长短期记忆神经网络的软件缺陷预测方法及终端 | |
CN112364352A (zh) | 可解释性的软件漏洞检测与推荐方法及系统 | |
CN114327609A (zh) | 一种代码补全方法、模型和工具 | |
CN114064487A (zh) | 一种代码缺陷检测方法 | |
CN115248769A (zh) | 一种测试用例优化方法、装置、设备及存储介质 | |
CN117591913A (zh) | 基于改进的R-Transformer的语句级软件缺陷预测方法 | |
CN114780103B (zh) | 一种基于图匹配网络的语义类代码克隆检测方法 | |
Cummins et al. | Deep data flow analysis | |
CN113076089B (zh) | 一种基于对象类型的api补全方法 | |
CN115525899A (zh) | 面向持续集成平台的漏洞误报消除方法 | |
CN114780443A (zh) | 微服务应用自动化测试方法、装置、电子设备及存储介质 | |
CN114115878A (zh) | 一种工作流节点推荐方法及装置 | |
KR102081867B1 (ko) | 역 색인 구성 방법, 역 색인을 이용한 유사 데이터 검색 방법 및 장치 | |
US20050160055A1 (en) | Method and device for dividing a population of individuals in order to predict modalities of a given target attribute |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |