本发明专利技术涉及一种基于函数调用路径的覆盖率动态跟踪方法及装置,实现方案为:对被测源代码进行插桩预处理,得到函数对象列表和控制关键字对象列表;得到源代码的函数调用基本路径集;执行测试用例,并运行插桩后的源代码,获得由源代码的执行路径的桩点数据流组成的动态路径;对动态路径进行拆分,得到测试用例所覆盖的函数调用路径子集;将函数调用路径子集与函数调用基本路径集进行匹配;将所有函数调用路径子集作为一个动态路径集,优化该动态路径集;计算优化后的动态路径集占函数调用基本路径集的比率,得到覆盖率。本发明专利技术将路径覆盖粒度由语句扩展到函数级别,避免了传统路径覆盖路径集庞大而无法完全测试每条路径的问题。
【技术实现步骤摘要】
【专利摘要】本专利技术涉及一种基于函数调用路径的覆盖率动态跟踪方法及装置,实现方案为:对被测源代码进行插桩预处理,得到函数对象列表和控制关键字对象列表;得到源代码的函数调用基本路径集;执行测试用例,并运行插桩后的源代码,获得由源代码的执行路径的桩点数据流组成的动态路径;对动态路径进行拆分,得到测试用例所覆盖的函数调用路径子集;将函数调用路径子集与函数调用基本路径集进行匹配;将所有函数调用路径子集作为一个动态路径集,优化该动态路径集;计算优化后的动态路径集占函数调用基本路径集的比率,得到覆盖率。本专利技术将路径覆盖粒度由语句扩展到函数级别,避免了传统路径覆盖路径集庞大而无法完全测试每条路径的问题。【专利说明】—种基于函数调用路径的覆盖率动态跟踪方法及装置
本专利技术涉及软件测试的覆盖分析
,特别是涉及一种基于函数调用路径的覆盖率动态跟踪方法及装置。
技术介绍
以下是本领域中的一些名词解释,其使用范围仅限于本专利技术:函数调用关系:函数调用关系是以函数为基本单位,通过分析源程序里函数之间的逻辑关系得来的。函数调用基本路径集:是源代码按照函数调用关系进行分析得到的全部函数调用路径的集合,也就是函数调用关系图G中的所包含的所有函数调用路径,表示为B (S,O = IP1, P2,…,PJ,其中S是源代码,C是函数调用关系准则,Pi是函数调用路径。插桩:是指在静态测试阶段,借助向被测程序中插入操作来实现测试目的的方法,其基本原理是被测程序在保持原有逻辑完整性基础上在程序中插入一些探针,这些探针的本质是进行信息采集的代码段,可以是赋值语句或采集覆盖信息的函数调用。插桩技术的应用是为了记录软件运行时代码的执行路径,从而了解代码的执行情况,利用插桩信息分析软件代码的覆盖率。执行路径:源代码的执行路径是指输入参数后编译运行源代码所得到的函数之间的执行顺序。动态路径:动态路径是指输入测试数据、编译运行经过预处理的源代码所获得的路径,其中包含了函数之间的执行顺序和控制关键字。动态路径是由一系列的桩点数据流组成的,包含函数的起始桩点、结束桩点和控制逻辑关键字的真假桩点值。覆盖率:覆盖率是用来度量测试完整性的一个手段,通过覆盖率数据,可以知道测试工作是否充分,测试的弱点在哪些方面,进而指导设计能够增加覆盖率的测试用例,有效地提高测试质量。覆盖率中最常见的是代码覆盖率,而路径覆盖是代码覆盖方法里一种非常严格的覆盖准则。在实际代码测试中,一个较为复杂的程序包含的路径数目是相当庞大的,要完全达到路径覆盖是不可行的,实现自动化路径覆盖也是困难的。传统路径覆盖方法涉及的路径集庞大,且其针对每条路径至少测试一次的测试方法只停留在理论阶段,存在很大缺陷,无法完全测试出每条路径的问题。为解决上述问题,文档《基于函数调用的路径覆盖生成技术研究》(张志华,牟永敏.基于函数调用的路径覆盖生成技术研究.电子学报,2010,38(8):1808-1811)提出了基于函数调用路径思想,文中给出了静态、动态分析函数调用路径覆盖率的大体思路,但是并未对具体实现做详细的说明。本专利技术继承了函数调用路径思想,提出了一种适用于白盒回归测试的动态跟踪、分析测试用例覆盖率的方法及装置。
技术实现思路
本专利技术所要解决的技术问题是提供一种基于函数调用路径的覆盖率动态跟踪方法及装置,用于解决传统路径覆盖方法的路径集庞大且无法完全测试每条路径的问题。本专利技术解决上述技术问题的技术方案如下:一种基于函数调用路径的覆盖率动态跟踪方法,包括:步骤1,对被测源代码进行插桩预处理,得到函数对象列表和控制关键字对象列表;步骤2,获取源代码的函数调用基本路径集;步骤3,执行测试用例,并运行经步骤I插桩后的源代码,获得由源代码的执行路径的桩点数据流组成的动态路径;步骤4,根据函数对象列表和控制关键字对象列表提供的信息,对步骤3获得的动态路径进行拆分,得到测试用例所覆盖的函数调用路径子集;步骤5,将函数调用路径子集与函数调用基本路径集进行匹配,确保函数调用路径子集是属于函数调用基本路径集的子集;步骤6,将所有函数调用路径子集作为一个动态路径集,优化该动态路径集;步骤7,计算优化后的动态路径集占函数调用基本路径集的比率,得到覆盖率。本专利技术的有益效果是:本专利技术提出了基于函数调用的路径覆盖生成技术,将路径覆盖粒度由语句扩展到函数级别,避免路径的爆炸式增长,在保证充分单元测试的前提下,避免了传统路径覆盖路径集庞大而无法完全测试每条路径的问题,有利于提高自动化测试的可行性。同时,本专利技术对动态路径集进行了优化,再得出测试用例基于函数调用路径的覆盖率,基于覆盖率分析出未被覆盖的函数调用路径集,有利于指导测试人员针对未被覆盖的函数调用路径设计测试用例。在上述技术方案的基础上,本专利技术还可以做如下改进。进一步,所述步骤I具体包括:步骤11,选择插桩点;步骤12,设计桩函数,并将桩函数插入到选择的插桩点中;步骤13,存放插入桩函数后生成的插桩信息,包括函数对象列表信息和控制关键字对象列表信息。采用上述进一步方案的有益效果是:根据函数调用路径的特点在完成插桩点的选择、桩函数的设计以及插桩信息存放后,完成了对源代码的插桩预处理,其只是在源代码内添加了桩函数,而桩函数并不会影响源代码原有的功能,插桩后的源代码仍然能够正常编译运行。上述方法易于实现,便于获得源代码在运行时的动态路径的相关信息。进一步,所述步骤11具体包括:基于块结构划分源代码,以源代码所包括的每个函数作为一个块结构,再针对每个块结构,将函数起始点、控制逻辑关键字所在点和函数结束点作为插桩点。采用上述进一步方案的有益效果是:通过函数的起始点和结束点可以唯一的标识一个函数及标识函数的当前状态。选择控制关键字作为插桩点表明了标识出函数之间的执行顺序是基于何种函数调用关系的。这样既能保证桩点的紧凑精干,又能保证收集的信息全面无冗余。进一步,所述步骤4中对动态路径进行拆分具体包括:步骤41,分别读入动态路径、函数对象列表及控制逻辑关键字对象列表;步骤42,将动态路径包含的每个桩点值存放到ArrayList数组里,将函数对象列表和控制逻辑关键字对象列表的信息分别存放到哈希表中;步骤43,将动态路径里的桩点值分别与函数对象列表和控制关键字对象列表进行比较,根据桩点值类型的不同对动态路径进行不同的拆分处理。采用上述进一步方案的有益效果是:动态路径是无法直接与函数调用基本路径集进行匹配,因此需对动态路径进行拆分,上述拆分方法结合了函数调用路径和动态路径的特点,易于实现,且保证了拆分的准确性。进一步,所述步骤5中将函数调用路径子集与函数调用基本路径集进行匹配具体包括:步骤51,将函数调用基本路径集里的函数调用路径存放到ArrayList数组中;步骤52,遍历ArrayList数组,将函数调用基本路径集里的函数调用路径构建成树形结构;步骤53,在函数调用基本路径集的树形结构中查找是否存在函数调用路径子集的函数调用路径,当且仅当一个函数调用路径子集中的所有函数调用路径都存在于树形结构中时,该函数调用路径子集能成功匹配函数调用基本路径集,否则匹配不成功,需重新对动态路径进行拆分。采用上述进一步方案的有益效果是:验证了拆分算法的正确性,保证了拆分后的函数调用路径子集是否是本文档来自技高网...
【技术保护点】
一种基于函数调用路径的覆盖率动态跟踪方法,其特征在于,包括:步骤1,对被测源代码进行插桩预处理,得到函数对象列表和控制关键字对象列表;步骤2,获取源代码的函数调用基本路径集;步骤3,执行测试用例,并运行经步骤1插桩后的源代码,获得由源代码的执行路径的桩点数据流组成的动态路径;步骤4,根据函数对象列表和控制关键字对象列表提供的信息,对步骤3获得的动态路径进行拆分,得到测试用例所覆盖的函数调用路径子集;步骤5,将函数调用路径子集与函数调用基本路径集进行匹配,确保函数调用路径子集是属于函数调用基本路径集的子集;步骤6,将所有函数调用路径子集作为一个动态路径集,优化该动态路径集;步骤7,计算优化后的动态路径集占函数调用基本路径集的比率,得到覆盖率。
【技术特征摘要】
【专利技术属性】
技术研发人员:牟永敏,
申请(专利权)人:北京信息科技大学,牟永敏,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。