CN104536895A - 一种面向Java函数调用路径的测试过程跟踪方法及系统 - Google Patents
一种面向Java函数调用路径的测试过程跟踪方法及系统 Download PDFInfo
- Publication number
- CN104536895A CN104536895A CN201510012676.7A CN201510012676A CN104536895A CN 104536895 A CN104536895 A CN 104536895A CN 201510012676 A CN201510012676 A CN 201510012676A CN 104536895 A CN104536895 A CN 104536895A
- Authority
- CN
- China
- Prior art keywords
- function
- path
- dynamic route
- function call
- java
- 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.)
- Granted
Links
Abstract
本发明公开了一种面向Java函数调用路径的测试过程跟踪方法及系统,所述方法包括:基于Soot技术分析被测Java代码,提取Java代码的函数调用关系,并根据提取的函数调用关系,生成函数调用路径;将预设的测试用例输入被测Java代码,再对Java代码进行插装,获取Java代码的动态路径;以及匹配Java代码的函数调用路径和动态路径,以实现路径跟踪。本发明能快速准确地跟踪出动态路径,进行动态路径与函数调用关系路径的匹配,从而准确得到已测试的路径,未测试的路径,以及去除冗余路径,并能准确的去除重复冗余的测试用例,以方便后续的回归测试。
Description
技术领域
本发明涉及软件测试技术领域,具体地,涉及一种面向Java函数调用路径的测试过程跟踪方法及系统。
背景技术
软件测试是软件项目中不可或缺的一环,是保证软件质量和可靠性的保证,因此出现了Bug的跟踪和定位。软件缺陷定位技术中包括软件测试的过程进行跟踪。然而现在国内的软件测试的测试过程跟踪主要在软件的缺陷跟踪与管理,对函数调用路径测试过程跟踪的研究屈指可数。
而随着科技发展,Java技术以其通用性、平台无关性、高效性等特征,吸引了众多软件开发者,占有了软件开发行业的很大份额,同时也对Java程序高效准确的测试提出了很大挑战。Java作为面向对象语言,具有封装、继承和多态等特性,传统的测试技术无法准确高效地进行测试。
因此,面向Java函数调用路径的测试过程跟踪是非常有意义的研究。
发明内容
本发明所要解决的技术问题是提供一种面向Java函数调用路径的测试过程跟踪方法及系统,用于解决基于函数调用路径进行Java函数的测试过程跟踪的问题。
本发明解决上述技术问题的技术方案如下:一种面向Java函数调用路径的测试过程跟踪方法,包括:基于Soot技术分析被测Java代码,提取Java代码的函数调用关系,并根据提取的函数调用关系,生成函数调用路径;将预设的测试用例输入被测Java代码,再对Java代码进行插装,获取Java代码的动态路径;以及匹配Java代码的函数调用路径和动态路径,以实现路径跟踪。
优选地,所述生成函数调用路径具体包括:根据Java代码的函数调用关系,获得局部函数调用关系图,并基于局部函数调用关系图,使用全局函数调用关系图生成算法获得全局函数调用关系图,得到全局函数的函数调用路径。
优选地,以邻接表存储方式存储局部函数调用关系图和全局函数调用关系图。
优选地,还包括:获取Java代码的动态路径后,从动态路径的集合中去除重复路径,并从测试用例库中删除重复路径对应的测试用例。
优选地,所述去除重复路径,具体包括:计算动态路径集合中所有动态路径数据流序列的长度,按长度不同分成不同的子集合;从动态路径子集合中选择一条动态路径装点数据流序列依次与其他动态路径装点数据流序列进行一一匹配;以及如果匹配完的路径得到的最长公共子序列的长度与路径的长度相同,则表明这两条路径是相同的,其中一条是重复的,故将重复的路径去除,否则表明两条路径不是重复路径,进行下一条动态路径的匹配。
优选地,所述获取Java代码的动态路径具体包括:运行插装后的Java代码,收集局部函数所对应的开始装点信息和结束装点信息以及局部函数内存在函数调用的分支语句处的开始装点信息和结束装点信息,并以HashMap的形式存储;在以HashMap的形式存储的过程中,以每个函数的开始装点和结束装点作为HashMap的key值,以该开始装点和结束装点对应的函数名作为HashMap的Value值,且以控制关键字的真假装点作为HashMap的key值,控制关键字作为value值;根据HashMap中装点信息与函数名的映射关系,将装点信息一一转换成对应的由函数名组成的动态路径。
优选地,所述匹配Java代码的函数调用路径和动态路径具体包括:若匹配成功,则判断动态路径是否已经匹配完,若是则记录已测试路径、未测试路径、重复路径及相应重复冗余测试用例,并计算函数调用路径覆盖率,否则匹配下一条动态路径。
优选地,该测试过程跟踪方法还包括进行测试过程管理,且所述测试过程管理又包括:将测试用例与其运行后的动态路径进行映射,以及将已跟踪到的动态路径和未跟踪到的动态路径分别存储输出已测试路径。
本发明的技术方案还包括一种面向Java函数调用路径的测试过程跟踪系统,包括:函数调用路径生成模块,用于基于Soot技术分析被测Java代码,提取Java代码的函数调用关系,并根据提取的函数调用关系,生成函数调用路径;动态路径生成模块,用于将预设的测试用例输入被测Java代码,再对Java代码进行插装,获取Java代码的动态路径;以及路径跟踪模块,用于匹配Java代码的函数调用路径和动态路径,以实现路径跟踪。
优选地,还包括测试过程管理模块,用于将测试用例与其运行后的动态路径进行映射,以及将已跟踪到的动态路径和未跟踪到的动态路径分别存储输出已测试路径。
本发明的有益效果是:本发明能快速准确地跟踪出动态路径,进行动态路径与函数调用关系路径的匹配,从而准确得到已测试的路径、未测试的路径,以及去除冗余路径,并能准确地去除重复冗余的测试用例,以方便后续的回归测试。这使得面向对象语言函数调用路径测试过程跟踪的研究不再是一种理论思想,而成为一种有利于软件测试领域和开发领域的一种具体可行的方法。
本发明的其他优点和有益效果将在具体实施方式中进一步说明。
附图说明
图1为本发明所述的一种面向Java函数调用路径的测试过程跟踪方法的流程示意图;
图2为本发明的具体实施方式中用于举例的的函数调用路径图;
图3为图2中main函数的局部函数调用关系图的邻接表存储方式示意图;
图4为对应图2的全局函数调用关系图的存储示意图。
图5为本发明的具体实施方式中跟踪路径方法的流程示意图;
图6为取测试数据t1=6时,图2对应的进行函数调用路径测试过程的可视化跟踪结果图;
图7为本发明的具体实施方式中测试过程的管理的流程示意图。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
为对本发明的原理和特征进行清楚描述,现给出下述具体实施方式中出现的部分术语的定义。这些术语的定义仅用于解释本发明,并不限定本发明的保护范围。
1、Soot:是一种开源的Java字节码分析工具,能够分析Java源程序的控制流信息、函数调用信息等。
2、插装:是指在保持被测程序原有逻辑完整性的基础上,借助插入到源程序中的探针来搜集程序运行信息。为了减少因程序插装而导致的对执行时效的影响,本发明对Java函数控制流分支跟踪插装,将Java源码装点被分为控制装点和非控制装点。控制装点是插装在分支语句(包括if‐else、switch‐case语句)和循环语句(包括for、while、do‐while语句)的装点。非控制装点就是函数的起始处、终止语句处的装点。
3、局部函数调用路径:是指根据函数调用关系得到的由程序入口点到出口点的一个函数名序列,表示为Pi={Fi0,Fi1,…Fim},Fij为函数名,Fij,Fij+1的相邻关系表示Fij调用了Fij+1。相应地,全局函数调用路径P={P0,P1,…Pi}。
4、动态路径:是指插装后输入测试数据后运行程序经过反馈的信息分析得到的函数调用路径,表示为L(S,ti)={F1,F2,…Fn},其中S是指插装后的源程序,ti表示输入相应的测试用例,Fn表示组成动态路径的函数。
5、动态路径集:是指运行多个测试用例得到的动态路径的集合,表示为L’={L(S,t1),L(S,t2),…L(S,ti)}。
6、测试用例:是指测试人员针对程序测试环境设计的,目的为验证程序功能有效性的一组条件或数据,表示为ti={<Ei,L(S,Di)>},Ei是指测试环境,L(S,Di)表示为输入测试数据后生成的动态路径,Di是指测试数据。
7、冗余测试用例:是指输入测试用例后得到的动态路径在动态路径集合中是重复的,那么该测试用例为冗余测试用例。即如果L(S,ti)=L(S,tj),则说明不同测试用例得到的动态路径是一样的,那么ti和tj其中有一个是冗余测试用例。
8、冗余路径:包括重复动态路径与包含动态路径。其中,重复动态路径是指对于测试数据Di,Dj,存在动态路径L(S,Di)=L(S,Dj)。包含动态路径是指对同一个测试用例数据Di运行生成一条动态路径L(S,Di),再次运行Di时生成一条动态路径L’(S,Di),而故L’(S,Di)是一条包含路径,应在动态路径中去掉包含动态路径。
9、函数调用关系:表示两个函数之间的调用关系。表示为R={<F1,F2>},F1、F2是函数,表示F1调用了F2,也说明F1与F2之间的关系性是1,若两函数互相不调用说明关系性是0。例如R={<F1,F2>,<F1,F3>}表示源函数中的函数调用关系为F1→F2→F3;如果出现分支语句,则使用形如R={<F1,F2/F3>}表示两条调用路径:F1→F2,F1→F3。
10、函数调用关系图:其为有向图,可以用三元组G(N,E,S)进行表示。这里N表示节点集合,每个节点都是一个函数;E表示边集合,E={<N1,N2>|N1,N2N,N1函数调用N2函数};S表示起始函数集合,即邻接表的所有表头的集合。所有函数的函数调用关系图根据main函数中的函数调用关系组合成为全局函数调用关系图。
11、单链表={Ai,<Vi1,…,Vin>},Ai表示当前函数,其数据结构表示为<key,link>,key表示为函数名签名,link表示为key指向第一个被调函数的地址;Vin表示被Ai调用的函数,被调函数的数据结构表示为<F,Bool,link>,F表示为被调函数,Bool为1表示遇到分支路径的另一条路径,Bool为0表示无分支路径或分支路径的第一条路径。邻接表则是把所有表头函数放在数组中后得到。
12、函数的起始装点ProbeS和结束装点ProbeE与函数名F是映射关系。即(ProbeS∪ProbeE)→F。其中ProbeS={s1,s2,…,sn|sn是8位16进制的数字信息},ProbeE={e1,e2,…,en|en是8位16进制的数字信息},F={f1,f2,…,fn}。同样控制关键字C例如if,while,switch等为真的装点ProbeT和为假的装点ProbeF与相应的控制关键字C也是映射关系,(ProbeT∪ProbeF)→C。
基于上述定义,如图1所示,本实施方式给出了一种面向Java函数调用路径的测试过程跟踪方法,包括以下步骤:基于Soot技术分析被测Java代码,提取Java代码的函数调用关系,并根据提取的函数调用关系,生成函数调用路径;将预设的测试用例输入被测Java代码,再对Java代码进行插装,获取Java代码的动态路径;以及匹配Java代码的函数调用路径和动态路径,以实现路径跟踪。
需说明的是,图1中示出的箭头仅示意各步骤的一种优选执行方式,并不限制各步骤的执行顺序,例如,也可先获得动态路径,再生成函数调用路径,或者两步骤同时进行。
此外,该测试过程跟踪方法还包括进行测试过程管理,且所述测试过程管理又包括:将测试用例与其运行后的动态路径进行映射、将已跟踪到的动态路径和未跟踪到的动态路径分别存储等。
对应地,本实施方式还给出了一种面向Java函数调用路径的测试过程跟踪系统,包括:函数调用路径生成模块,用于基于Soot技术分析被测Java代码,提取Java代码的函数调用关系,并根据提取的函数调用关系,生成函数调用路径;动态路径生成模块,用于将预设的测试用例输入被测Java代码,再对Java代码进行插装,获取Java代码的动态路径;路径跟踪模块,用于匹配Java代码的函数调用路径和动态路径,以实现路径跟踪;以及测试过程管理模块,用于将测试用例与其运行后的动态路径进行映射、将已跟踪到的动态路径和未跟踪到的动态路径分别存储输出已测试路径,以及计算函数调用路径覆盖率。
该面向Java函数调用路径的测试过程跟踪系统与其对应的测试过程跟踪方法的具体实施过程一致,因此下文重点介绍所述测试过程跟踪方法的具体实施过程。
即,该面向Java函数调用路径的测试过程跟踪方法主要分三个部分实现,分别为函数调用路径的生成、动态路径的生成和路径跟踪及管理。下面介绍这三个部分的具体实施过程。
一、函数调用路径的生成
函数调用路径的生成步骤主要是:根据Java代码的函数调用关系,获得局部函数调用关系图,并基于局部函数调用关系图,使用全局函数调用关系图生成算法获得全局函数调用关系图,得到全局函数的函数调用路径。
1)局部函数调用路径生成
为方便调用关系直观可视和为路径匹配提供好的数据结构类型,首先要获得Java代码的函数调用路径图。根据程序获得函数调用路径图为本领域的常用技术手段,因此本实施方式直接以图2所示的函数调用路径图为例进行说明。如图2所示,该函数调用路径图包含3条函数调用路径:P1={main,f0,f2,f1,f0,f4},P2={main,f0,f2,f3,f4},P3={main,f0,f2,f1,f4}。
单独对每个函数分析,即对局部函数分析,得到其函数内的调用关系。main函数内的调用关系:main→f0→f2;f2函数内的调用关系:f2→f1/f3→f4,f1函数内的调用关系为:f1→f0/f4。如果把main函数的函数内调用关系与其他函数的函数内调用关系联系起来,就可以得到上面的3条路径。因此全局函数调用关系图可以由程序内局部函数的函数调用关系组合得到。
为了便于计算机存储和读取数据,同时也为了加快下面要进行的路径跟踪的速度,这里使用图的邻接表来存储函数调用关系图。若函数N1与其他函数Ni的调用关系性为1,则将N1作为邻接表其中的一个表头,与N1关系性为1的其他函数Ni作为链表中的其他结点。当所有的函数单个分析完后,得到了每个函数的函数调用关系性为1的函数调用关系图。
对于图2的例子,f0、f3、f4函数没有调用其他函数,函数内调用关系性为0。f1函数内调用了f0函数,R={<f1,f0/f4>},对应的路径P1={f1,f0},P2={f1,f4}。f2函数内存在分支结构,R={<f2,f1/f3>,<f2,f4>},对应的路径为P3={f2,f1,f4},P4={f2,f3,f4}。main函数内调用了f0、f2,R={<main,f0>,<main,f2>},对应的路径为P5={main,f0,f2},图3示意了main函数的局部函数调用关系图的邻接表存储方式,其他函数的局部函数调用关系图的存储方式与此类似。
2)全局函数调用路径生成
首先,通过soot获取类信息——成员函数列表。通过分析每个成员函数Ni,获取Ni的执行语句,并遍历每个执行语句,如果有函数调用语句,则获取被调函数的信息,加入到局部函数调用关系图中。然后,找到main函数为表头的链表,循环遍历main函数的调用关系图中的每个节点函数Ni,查找当前节点的成员函数Ni是否对应函数调用关系图,如果存在这样的函数调用关系图,将这个图并入到main函数的函数调用关系图中。最后,经过组合得到Java程序的全局函数调用关系图,即将单链表的表头放入到数组中,组成了函数调用关系图的邻接表。
将Java程序内的所有的局部函数调用关系图组合成全局的函数关系调用图,即将单链表的表头放在一个数组Array中。于是得到了函数调用关系图如错误!未找到引用源。,其存储方式如图4所示。
将函数调用关系图输出,一条链表就代表一条局部函数调用路径。首先找到main函数为表头的函数调用路径,逐个访问它的节点函数N0i,若节点函数N0i为链表表头所对应的链表节点不为空,则应把函数N0i所对应的链表归并到main函数的调用路径中,再依次遍历N0i对应的链表的每个节点函数,按以上步骤找到有函数调用关系的函数并归并到main函数的调用路径中。遇到节点函数的函数调用关系性域为1的说明这里有遇到分支语句,有多条路径出现。例如图4中,main函数调用路径Pmain={main,f0,f2},f0函数对应的链表为空,说明f0无调用函数。f2对应的链表不为空,节点f1对应的链表不为空,于是将f1对应的函数调用关系归并到f2中然后归并到main函数中,又由于节点中有函数调用关系性域为1的函数,说明f1和f2有两条调用函数路径。于是得到的全局函数调用关系图的路径为:main->f0->f2->f1->f0->f4,main->f0->f2->f1->f4,main->f0->f2->f3->f4。此时全局函数调用路径P={P1,P2,P3}。
另外,本实施方式选择了邻接表的存储方式,具有三个方面的优点:第一,每个邻接表的表头可以当作是局部函数调用路径的起始函数,每条链接表是一条完整的局部函数调用路径;第二,把所有的表头放在一个数组中,这就组成了全局函数调用关系图的路径存储;第三,链表的结点结构可以根据需要定义相应的域。
二、动态路径生成
1)动态路径获取
因为插装得到的动态路径是由8位16进制数组成的序列,为了将其可视化出由函数名组成的动态函数调用路径,就需要将这些16进制数转换成其所对应的函数名。
运行插装后的程序,可以收集局部函数所对应的开始装点(例如函数名,以及函数名所对应的8位16进制数等)和结束装点信息,同样也可以得到局部函数内存在函数调用的分支语句处的开始装点信息和结束装点信息。因为HashMap允许空值、容量可变、速度比HashTable快速,于是将这些信息以HashMap的形式存储,以方便动态路径的提取。由于装点值是唯一的没有重复的,故将每个函数的开始装点sn和每个函数的结束装点en值作为HashMap的key值,sn和en所对应的函数名fn作为HashMap的value值,以及控制关键字的真假装点作为HashMap的key值,控制关键字作为value值。为了方便装点信息流的管理,将这些返回的信息以列表的方式存放。
上述动态路径的获取对应的算法实现如下:
在动态路径装点数据流序列里记录了一个函数fi的入口点si,但是下一个装点信息不是该函数的出口点ei,而是另外一个函数fj的入口点,说明此函数fi调用了其他的函数fj,该函数fi本身还没有结束。选择控制关键字作为插装点的目的是为了标识函数之间的执行顺序是基于何种函数调用关系的。例如,在动态路径里记录了函数f1的入口点,然后是if关键字的真装点,紧跟着的是函数f2的入口点,说明函数f2包含在函数f1里,且f2的执行是通过选择分支条件为真的情况发生调用的。另外,遇到循环结构和递归结构的函数调用时,,只当作一次循环和一次递归来处理。
根据装点数据流信息与函数名的映射关系,就可以将插装动态路径中的装点数据流信息一一转换成对应的由函数名组成的动态函数调用关系路径(动态路径)。
2)去除重复路径
本实施方式采用的去除重复的方法主要包括以下步骤:
步骤a,计算动态路径集合中所有动态路径数据流序列的长度,按长度不同分成不同的子集合。若是一定长度的路径只有一条就不用再进行下面的匹配。
步骤b,从动态路径子集合L’i中选择一条动态路径装点数据流序列Pi(i=0,1,2…n)依次与其他动态路径装点数据流序列Pn‐i进行一一匹配。
步骤c,如果只存在一条长度相同的,那么进行LCS算法进行比较;如果还存在多条长度相同的动态路径P’i,那么对每次随机选取互异K个位置进行路径间函数的比较,直到符合的路径数量不再减少。然后将Pi与剩下的路径一一进行LCS算法匹配。
步骤d,如果匹配完的路径得到的最长公共子序列(LCS)的长度与路径的长度相同,则说明这两条路径是相同的,其中一条是重复的,故将重复的路径Pj去除。并相应的记录此重复路径所对应的测试用例,以方便回归测试中去除重复冗余的测试用例。若最长公共子序列的长度与路径的长度不相同,说明这两条路径不是重复路径,然后进行下一条动态路径的匹配。
步骤e,重复步骤b,直到所有动态路径子集合中的路径都遍历完。
另外,从动态路径集中去除重复路径后,需相应地删除测试用例库中对应的测试用例。
例如图2,测试用例t1=6,t2=8,t3=11。将这3个测试用例分别进行测试,会发现t1与t2得到的动态路径都是L1=L2={main,f0,f2,f1,f0,f4},于是这两条路径是重复路径,相应地去掉一个测试用例t1=6;对应着t3=11得到的动态路径为L3={main,f0,f2,f3,f4},此路径不是重复路径。
三、路径跟踪及管理
1)路径跟踪
路径跟踪主要是对得到的动态路径集与得到的函数调用关系图中的函数调用路径进行准确的匹配,并输出哪些路径已经被测试覆盖,哪些路径测试时没有被覆盖到,并计算出函数调用路径覆盖率。
如图5所示,本实施方式的路径跟踪的算法描述如下:
比较动态路径Pi中的函数Fi与当前图中函数节点vi是否一致,若一致就标记为已经访问完,并继续往下比较,直到动态路径中的函数比较完成或图的遍历达到最大深度;若不一致回溯到该节点的前一个节点函数vi-1,查看此节点函数vi-1的其他邻接点vj是否被访问,若未被访问比较动态路径中函数Fi与该节点函数vj,若已被访问继续找下一个邻接点vj+1,如果所有邻接点都已被访问则回溯上一节点函数vi-2。重复以上过程直到回溯到全局函数调用关系图第2层。若直到动态路径中的函数匹配完或已经达到全局函数调用关系图的最大深度都没有找到相应的路径,说明该动态路径不符合函数调用关系路径,进行记录并查错。若找到符合的路径说明动态路径测试跟踪成功。
当所有的动态路径与以图的形式存储的全局函数调用路径进行了一一跟踪匹配,就可以得到已经覆盖(已跟踪到或已测试的)的函数调用路径和还未覆盖(未跟踪的或未测试的)的函数调用路径,并能相应地去除重复冗余的测试用例,还能计算出函数调用路径覆盖率。计算函数调用路径覆盖率的公式为:函数调用路径覆盖率=已经跟踪到的动态路径的条数÷全局函数调用路径条数。
同样以图2为例,取测试用例t1=6,t2=8,t3=11,按第二部分的动态路径生成中涉及的方法去除重复路径后,对比全局函数调用关系图进行动态路径跟踪,发现路径L2={main,f0,f2,f1,f4}没有测试到。此时,跟踪到的路径为2条,重复路径1条,未测试到(即未跟踪到)的路径1条。对没有测到的路径和重复路径所对应的测试用例进行输出记录。对于测试数据t1=6进行函数调用路径测试过程的可视化跟踪如图6所示。
2)测试过程管理
如图7所示,测试过程的管理包括测试用例的管理和测试路径的管理。测试用例的管理主要是针对冗余测试用例的管理和未测试用例的管理。如果有{N|(N>=2)}个测试用例运行后的动态路径是同一条,则有(N‐1)个测试用例是冗余的,这就需要对这N‐1个测试用例进行标记,在这里用r来进行标记,在下一次回归测试中就可以避开标记为r的测试用例,也可以选择从测试用例库中去除标记为r的冗余测试用例。另一种情况,对已通过的测试用例标记为1,如果在一定的时间内测试用例没有测完,将标记下一个需要测试的测试用例标记为g,以方便下一次测试时从标记为g的测试用例开始。
测试路径的管理,主要是将测试用例与其运行后的动态路径进行映射,以及对已跟踪到的动态路径和未跟踪到的动态路径分别存储,方便可视化管理哪些函数调用路径已测试,还有哪些函数调用路径未测到。当所有的测试用例都运行完,若检查未跟踪到的函数调用路径还存在,就需要对未测到的函数调用路径专门设计测试用例,并将设计的测试用例加到测试用例库中。如果对同一个测试数据ti运行多次的动态路径,存在L’(S,Di)L(S,Di)的关系。则需要标记此测试数据ti为c,方便此条函数调用路径的测试用例的重新设计以及查找此条函数调用路径的Bug,并将ti对应的路径L’(S,Di)从动态路径集中去掉。
把以上情况的管理记录存放在数据库,方便下一次测试的读取。同时,还可获得测试过程管理报告。
本实施方式能快速准确地跟踪出动态路径,进行动态路径与函数调用关系路径的匹配,从而准确得到已测试的路径、未测试的路径以及去除冗余路径,并能准确的去除重复冗余的测试用例以方便后续的回归测试。
以上结合附图详细描述了本发明的优选实施方式,但是,本发明并不限于上述实施方式中的具体细节,在本发明的技术构思范围内,可以对本发明的技术方案进行多种简单变型,这些简单变型均属于本发明的保护范围。
另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合,为了避免不必要的重复,本发明对各种可能的组合方式不再另行说明。
此外,本发明的各种不同的实施方式之间也可以进行任意组合,只要其不违背本发明的思想,其同样应当视为本发明所公开的内容。
Claims (10)
1.一种面向Java函数调用路径的测试过程跟踪方法,其特征在于,包括:
基于Soot技术分析被测Java代码,提取Java代码的函数调用关系,并根据提取的函数调用关系,生成函数调用路径;
将预设的测试用例输入被测Java代码,再对Java代码进行插装,获取Java代码的动态路径;以及
匹配Java代码的函数调用路径和动态路径,以实现路径跟踪。
2.根据权利要求1所述的一种面向Java函数调用路径的测试过程跟踪方法,其特征在于,所述生成函数调用路径具体包括:根据Java代码的函数调用关系,获得局部函数调用关系图,并基于局部函数调用关系图,使用全局函数调用关系图生成算法获得全局函数调用关系图,得到全局函数的函数调用路径。
3.根据权利要求2所述的一种面向Java函数调用路径的测试过程跟踪方法,其特征在于,以邻接表存储方式存储局部函数调用关系图和全局函数调用关系图。
4.根据权利要求1所述的一种面向Java函数调用路径的测试过程跟踪方法,其特征在于,还包括:获取Java代码的动态路径后,从动态路径的集合中去除重复路径,并从测试用例库中删除重复路径对应的测试用例。
5.根据权利要求4所述的一种面向Java函数调用路径的测试过程跟踪方法,其特征在于,所述去除重复路径,具体包括:
计算动态路径集合中所有动态路径数据流序列的长度,按长度不同分成不同的子集合;
从动态路径子集合中选择一条动态路径装点数据流序列依次与其他动态路径装点数据流序列进行一一匹配;以及
如果匹配完的路径得到的最长公共子序列的长度与路径的长度相同,则表明这两条路径是相同的,其中一条是重复的,故将重复的路径去除,否则表明两条路径不是重复路径,进行下一条动态路径的匹配。
6.根据权利要求1所述的一种面向Java函数调用路径的测试过程跟踪方法,其特征在于,所述获取Java代码的动态路径具体包括:
运行插装后的Java代码,收集局部函数所对应的开始装点信息和结束装点信息以及局部函数内存在函数调用的分支语句处的开始装点信息和结束装点信息,并以HashMap的形式存储;
在以HashMap的形式存储的过程中,以每个函数的开始装点和结束装点作为HashMap的key值,以该开始装点和结束装点对应的函数名作为HashMap的Value值,且以控制关键字的真假装点作为HashMap的key值,控制关键字作为value值;
根据HashMap中装点信息与函数名的映射关系,将装点信息一一转换成对应的由函数名组成的动态路径。
7.根据权利要求1所述的一种面向Java函数调用路径的测试过程跟踪方法,其特征在于,所述匹配Java代码的函数调用路径和动态路径还包括:若匹配成功,则判断动态路径是否已经匹配完,若是则记录已测试路径、未测试路径、重复路径及相应重复冗余测试用例,并计算函数调用路径覆盖率,否则进行下一条动态路径的匹配。
8.根据权利要求1至7中任一所述的一种面向Java函数调用路径的测试过程跟踪方法,其特征在于,该测试过程跟踪方法还包括进行测试过程管理,且该测试过程管理包括:将测试用例与其运行后的动态路径进行映射,以及将已跟踪到的动态路径和未跟踪到的动态路径分别存储。
9.一种面向Java函数调用路径的测试过程跟踪系统,其特征在于,包括:
函数调用路径生成模块,用于基于Soot技术分析被测Java代码,提取Java代码的函数调用关系,并根据提取的函数调用关系,生成函数调用路径;
动态路径生成模块,用于将预设的测试用例输入被测Java代码,再对Java代码进行插装,获取Java代码的动态路径;以及
路径跟踪模块,用于匹配Java代码的函数调用路径和动态路径,以实现路径跟踪。
10.根据权利要求9所述的一种面向Java函数调用路径的测试过程跟踪系统,其特征在于,还包括测试过程管理模块,用于将测试用例与其运行后的动态路径进行映射,以及将已跟踪到的动态路径和未跟踪到的动态路径分别存储。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510012676.7A CN104536895B (zh) | 2015-01-12 | 2015-01-12 | 一种面向Java函数调用路径的测试过程跟踪方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510012676.7A CN104536895B (zh) | 2015-01-12 | 2015-01-12 | 一种面向Java函数调用路径的测试过程跟踪方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104536895A true CN104536895A (zh) | 2015-04-22 |
CN104536895B CN104536895B (zh) | 2017-06-09 |
Family
ID=52852425
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510012676.7A Expired - Fee Related CN104536895B (zh) | 2015-01-12 | 2015-01-12 | 一种面向Java函数调用路径的测试过程跟踪方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104536895B (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106020848A (zh) * | 2016-06-07 | 2016-10-12 | 北京信息科技大学 | 面向c#的函数调用路径生成方法 |
CN106547520A (zh) * | 2015-09-16 | 2017-03-29 | 腾讯科技(深圳)有限公司 | 一种代码路径分析方法及装置 |
CN106776348A (zh) * | 2017-02-06 | 2017-05-31 | 腾讯科技(深圳)有限公司 | 测试用例管理方法和装置 |
CN107038025A (zh) * | 2016-09-28 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 基于soa架构的系统调用方法及装置 |
CN107506299A (zh) * | 2017-08-09 | 2017-12-22 | 平安科技(深圳)有限公司 | 一种代码分析方法及终端设备 |
CN108446220A (zh) * | 2018-03-02 | 2018-08-24 | 国网吉林省电力有限公司信息通信公司 | 一种测试用例的生成方法和装置 |
CN108762749A (zh) * | 2018-05-24 | 2018-11-06 | 福州大学 | 基于代码分析的系统对象图自动生成方法 |
WO2019200800A1 (zh) * | 2018-04-17 | 2019-10-24 | 平安科技(深圳)有限公司 | 测试案例的测试效果展示方法、电子装置及存储介质 |
CN110727597A (zh) * | 2019-10-15 | 2020-01-24 | 杭州安恒信息技术股份有限公司 | 一种基于日志排查无效代码补全用例的方法 |
CN111290950A (zh) * | 2020-01-22 | 2020-06-16 | 腾讯科技(深圳)有限公司 | 程序测试中测试点获取方法、装置、存储介质和设备 |
CN111831541A (zh) * | 2019-04-22 | 2020-10-27 | 西安邮电大学 | 一种基于风险轨迹的软件缺陷定位方法 |
CN112597007A (zh) * | 2020-12-14 | 2021-04-02 | 中国航发控制系统研究所 | 一种嵌入式软件集成测试完整性分析方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2001236246A (ja) * | 1999-12-28 | 2001-08-31 | Ge Medical Systems Global Technology Co Llc | ワークステーション・ソフトウエアの自動化回帰試験 |
CN103473171A (zh) * | 2013-08-28 | 2013-12-25 | 北京信息科技大学 | 一种基于函数调用路径的覆盖率动态跟踪方法及装置 |
US20140053134A1 (en) * | 2012-08-16 | 2014-02-20 | Fujitsu Limited | Software regression testing using symbolic execution |
-
2015
- 2015-01-12 CN CN201510012676.7A patent/CN104536895B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2001236246A (ja) * | 1999-12-28 | 2001-08-31 | Ge Medical Systems Global Technology Co Llc | ワークステーション・ソフトウエアの自動化回帰試験 |
US20140053134A1 (en) * | 2012-08-16 | 2014-02-20 | Fujitsu Limited | Software regression testing using symbolic execution |
CN103473171A (zh) * | 2013-08-28 | 2013-12-25 | 北京信息科技大学 | 一种基于函数调用路径的覆盖率动态跟踪方法及装置 |
Non-Patent Citations (3)
Title |
---|
张志华等: "基于函数调用的路径覆盖生成技术研究", 《电子学报》 * |
李良杰等: "面向嵌入式系统函数动态调用路径拆分与匹配", 《数据通信》 * |
牟永敏等: "面向C程序插装的路径提取", 《计算机工程与应用》 * |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106547520A (zh) * | 2015-09-16 | 2017-03-29 | 腾讯科技(深圳)有限公司 | 一种代码路径分析方法及装置 |
CN106547520B (zh) * | 2015-09-16 | 2021-05-28 | 腾讯科技(深圳)有限公司 | 一种代码路径分析方法及装置 |
CN106020848A (zh) * | 2016-06-07 | 2016-10-12 | 北京信息科技大学 | 面向c#的函数调用路径生成方法 |
CN107038025A (zh) * | 2016-09-28 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 基于soa架构的系统调用方法及装置 |
CN107038025B (zh) * | 2016-09-28 | 2020-04-07 | 阿里巴巴集团控股有限公司 | 基于soa架构的系统调用方法及装置 |
CN106776348A (zh) * | 2017-02-06 | 2017-05-31 | 腾讯科技(深圳)有限公司 | 测试用例管理方法和装置 |
CN107506299B (zh) * | 2017-08-09 | 2021-04-02 | 平安科技(深圳)有限公司 | 一种代码分析方法及终端设备 |
CN107506299A (zh) * | 2017-08-09 | 2017-12-22 | 平安科技(深圳)有限公司 | 一种代码分析方法及终端设备 |
CN108446220A (zh) * | 2018-03-02 | 2018-08-24 | 国网吉林省电力有限公司信息通信公司 | 一种测试用例的生成方法和装置 |
CN108446220B (zh) * | 2018-03-02 | 2022-04-05 | 国网吉林省电力有限公司信息通信公司 | 一种测试用例的生成方法和装置 |
WO2019200800A1 (zh) * | 2018-04-17 | 2019-10-24 | 平安科技(深圳)有限公司 | 测试案例的测试效果展示方法、电子装置及存储介质 |
CN108762749B (zh) * | 2018-05-24 | 2021-12-21 | 福州大学 | 基于代码分析的系统对象图自动生成方法 |
CN108762749A (zh) * | 2018-05-24 | 2018-11-06 | 福州大学 | 基于代码分析的系统对象图自动生成方法 |
CN111831541A (zh) * | 2019-04-22 | 2020-10-27 | 西安邮电大学 | 一种基于风险轨迹的软件缺陷定位方法 |
CN111831541B (zh) * | 2019-04-22 | 2022-10-28 | 西安邮电大学 | 一种基于风险轨迹的软件缺陷定位方法 |
CN110727597A (zh) * | 2019-10-15 | 2020-01-24 | 杭州安恒信息技术股份有限公司 | 一种基于日志排查无效代码补全用例的方法 |
CN110727597B (zh) * | 2019-10-15 | 2023-03-10 | 杭州安恒信息技术股份有限公司 | 一种基于日志排查无效代码补全用例的方法 |
CN111290950A (zh) * | 2020-01-22 | 2020-06-16 | 腾讯科技(深圳)有限公司 | 程序测试中测试点获取方法、装置、存储介质和设备 |
CN111290950B (zh) * | 2020-01-22 | 2022-03-01 | 腾讯科技(深圳)有限公司 | 程序测试中测试点获取方法、装置、存储介质和设备 |
CN112597007A (zh) * | 2020-12-14 | 2021-04-02 | 中国航发控制系统研究所 | 一种嵌入式软件集成测试完整性分析方法 |
CN112597007B (zh) * | 2020-12-14 | 2023-10-03 | 中国航发控制系统研究所 | 一种嵌入式软件集成测试完整性分析方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104536895B (zh) | 2017-06-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104536895A (zh) | 一种面向Java函数调用路径的测试过程跟踪方法及系统 | |
Pham et al. | Complete and accurate clone detection in graph-based models | |
CN105787367B (zh) | 一种软件更新的补丁安全性检测方法及系统 | |
US20150370685A1 (en) | Defect localization in software integration tests | |
CN103116540A (zh) | 基于全局超级块支配图的动态符号执行方法及其装置 | |
CN105468517B (zh) | 一种基于黑盒测试用例约简的统计错误定位方法 | |
CN102968375B (zh) | 基于关联规则挖掘的不可达路径检测方法 | |
CN104516813B (zh) | 网络页面的测试节点的选取方法和装置 | |
Soetens et al. | An initial investigation into change-based reconstruction of floss-refactorings | |
He et al. | Enhancing spectrum-based fault localization using fault influence propagation | |
CN108038211A (zh) | 一种基于上下文的无监督关系数据异常检测方法 | |
CN113190220A (zh) | Json文件差异化对比方法及装置 | |
CN104424064A (zh) | 诊断测试方法、诊断装置及诊断系统 | |
Maisikeli et al. | Aspect mining using self-organizing maps with method level dynamic software metrics as input vectors | |
CN111045670A (zh) | 一种二进制代码与源代码间复用关系的识别方法与装置 | |
CN111488276B (zh) | 基于代码跟踪的软件可靠性测试方法和装置 | |
CN105630678A (zh) | 一种智能电能表软件的可靠性检测仪及其检测方法 | |
CN112380120A (zh) | 单元测试代码结构自动解析与路径分析方法 | |
CN105528296B (zh) | 一种面向对象软件的类簇测试方法 | |
Bogdanov et al. | Computing the structural difference between state-based models | |
CN102135940A (zh) | 一种基于有限自动机的行为自动建模方法 | |
CN101930398A (zh) | 基于Fuzzing技术的变异多维输入的软件脆弱性分析方法 | |
CN114153881A (zh) | 基于时序运维大数据的高召回因果发现方法、装置及设备 | |
CN114780374A (zh) | 一种基于细粒度优化选项配置差分的编译器缺陷定位方法 | |
CN110427320B (zh) | 一种轻量级嵌入式程序控制流异常定位检测方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170609 Termination date: 20180112 |