基于控制流交集的缺陷自动定位装置及其自动定位方法

文档序号:6607768阅读:171来源:国知局
专利名称:基于控制流交集的缺陷自动定位装置及其自动定位方法
技术领域
本发明涉及软件测试领域,具体涉及一种基于控制流交集的缺陷自动定位装置及 其自动定位方法。
背景技术
程序缺陷定位技术是指明一个有缺陷的程序产生异常行为原因的技术。程序缺陷 包括程序错误(error)和程序bug。传统的手工缺陷定位技术包括以下几个基本步骤在 程序中设置断点;再次执行程序;检测程序状态以定位产生不正确输出的原因。显然,这样 的缺陷定位方式耗费大量的时间、人力和物力。并且针对规模较大的程序,这样的工作手工 完成相当困难。因此,如何定位缺陷成为程序开发过程中的瓶颈。在自动缺陷定位领域,已有许多不同的技术被提出并应用到实践当中。总的来说, 这些技术可以被分为两类静态程序分析和动态缺陷定位。静态程序分析是指在不执行程 序的情况下,通过程序分析手段找出程序缺陷的技术。而动态缺陷定位技术是指在程序运 行时,通过检测程序行为发现缺陷的技术。静态程序分析的主要手段有代码走读、模型检测等。代码走读是指程序员逐行的 审查程序源码,显然,这仍然是一种耗费大量的时间、人力和物力的低效手段。模型检测是 指对被测程序建模,基于模型穷举程序所有可达的状态,并通过检测模型属性发现潜在缺 陷的技术。由于穷举程序所有可达的状态会导致程序状态转移成指数增长,随着程序规模 的不断扩大,可能的程序状态转移将越来越趋于无穷。因此穷举程序所有可达状态的工作 随程序规模扩大而难度不断增大。由于静态程序分析存在着费时费力和程序状态转移成指数增长等问题。目前动态 缺陷定位越来越成为人们关注的焦点。目前已有的主要动态缺陷定位有几类包括基于程序数据流的动态不变式发现技 术定位程序缺陷,利用最近邻概念定位缺陷,基于程序切片定位缺陷等几种。这些方法存在以下问题
第一、许多技术仍停留在理论阶段,没有形成实际应用和已发布的具体装置。如动态不 变式发现技术、利用最近邻概念定位技术。第二、某些已有技术,如最近邻和程序切片等技术,对最终报告的所有可能含有缺 陷的缺陷嫌疑点并不排序,使得程序员认为各缺陷嫌疑点等可能地含有缺陷,不利于排错。第三,已有技术定位缺陷的准确率不高,需要进一步提高准确率,以有效地帮助程 序员定位缺陷。因此目前的缺陷定位技术尚难以满足高效定位的应用需求,对开发效率有不利影 响。

发明内容
本发明针对现有缺陷定位技术存在的费时费力以及排错不便、定位缺陷的准确率不高等问题,提供了一种基于控制流交集的缺陷自动定位方法及其自动定位装置。本发明提供的基于控制流交集的缺陷自动定位装置,主要由类文件改装模块、测 试执行模块、成功与失败分类模块、Trace文件解析模块、失败执行交集模块、排序模块以及 源代码映射模块组成。类文件改装模块通过在相应的程序点自动加入相应的打印语句,对 输入的所有被测Java类文件进行改装,并将改装后的Java类文件和输入的测试用例输出 给测试执行模块;测试执行模块对所有测试用例执行改装后的Java类文件,收集每个测试 用例输出的trace文件输出给成功与失败分类模块;成功与失败分类模块根据测试执行模 块中测试用例执行结果正确与否将所有trace文件分为成功trace文件与失败trace文 件,并将这两类trace文件传送给Trace文件解析模块;Trace文件解析模块对所有成功 trace文件与所有失败trace文件进行解析处理,将构造的成功执行树形结构集与失败执 行树形结构集传递给失败执行交集模块;失败执行交集模块对所有失败执行树形结构求交 集,将在每一个失败执行树形结构中都出现的程序点作为缺陷嫌疑点得到失败执行交集, 并将失败执行交集与成功执行树形结构集传递给排序模块;排序模块针对失败执行交集中 的缺陷嫌疑点,根据每个缺陷嫌疑点在成功执行树形结构集中出现的频率从低到高进行排 序,将有序的所有缺陷嫌疑点输出给源代码映射模块;源代码映射模块将有序的所有缺陷 嫌疑点映射到Java源代码文件的相应位置,并最终将所有缺陷嫌疑点对应的源代码位置 按每个缺陷嫌疑点含有缺陷的可能性从大到小排序后,作为缺陷定位报告显示出来。本发明还提供一种基于控制流交集的缺陷自动定位方法,其定位处理过程包括如 下步骤
步骤一、类文件改装模块对所有的被测Java类文件改装,在三类程序点函数入口、函 数return语句和分支选择语句,自动加入相应的打印语句;
步骤二、测试执行模块将所有测试用例按照步骤一中改装后的Java类文件执行,并收 集每个测试用例输出的trace文件;
步骤三、成功与失败分类模块根据步骤二中各测试用例执行结果正确与否将所有 trace文件分为成功trace文件与失败trace文件两类;
步骤四、Trace文件解析模块对trace文件解析通过构造树形数据结构存储trace信 息,Trace文件解析模块解析所有的成功trace文件与所有的失败trace文件后,得到成功 执行树形结构集与失败执行树形结构集;
步骤五、失败执行交集模块通过对所有失败执行树形结构求交集,得出程序中所有缺 陷嫌疑点的集合;
步骤六、排序模块针对步骤五得到的缺陷嫌疑点,根据它们在成功执行中出现的频率 从低到高对它们排序;所述的频率的数值是一个大于等于0,小于等于1的实数,定义为该 缺陷嫌疑点在成功执行树形结构集出现的次数与所有成功测试用例的个数的比值;
步骤七、源代码映射模块将排序后的各缺陷嫌疑点映射到Java源代码文件的相应位 置,并将所有缺陷嫌疑点对应的源代码位置按每个缺陷嫌疑点含有缺陷的可能性从大到小 排序后显示。本发明一种基于控制流交集的缺陷自动定位装置及其自动定位方法的优点在 于
(1)所述的装置直接作用于Java类文件,不需要提供有关于程序设计的具体业务逻辑和设计方案。(2)所述的装置所有缺陷定位过程实现了自动化,不需要人工干预,节省了大量人 力,物力,从而提高了程序的开发效率。(3)本发明提供的缺陷自动定位方法采用了一种新型有效的缺陷定位方法来定位 缺陷,并对诊断得出的缺陷嫌疑点进行排序,提高了排错效率,并使得定位缺陷的准确率提
尚ο


图1为本发明缺陷自动定位装置的架构示意图; 图2为本发明缺陷自动定位方法的步骤流程图3为一个含有bug的示例程序mid ();
图4为图3中的示例程序经本发明缺陷自动定位方法改装后的程序; 图5为本发明缺陷自动定位方法步骤二中各用例执行改装后示例程序mid ()产生打 印输出的位置示意图6为本发明缺陷自动定位方法步骤二执行测试用例[1]输出的trace文件的示例
图7为本发明缺陷自动定位方法步骤四中trace解析模块解析trace文件后形成的树 形结构的一个示例图8为本发明中失败执行交集模块计算程序所有缺陷嫌疑点的集合的结果示意图; 图9为本发明中排序模块计算各缺陷嫌疑点频率并排序的结果示意图。
具体实施例方式下面将结合附图对本发明作进一步的详细说明。本发明的目的是提出一种基于控制流交集的缺陷自动定位装置及其自动定位方 法,其思想是一个缺陷对程序执行产生影响,当且仅当程序执行了该缺陷所在的代码行, 所以要发现一个缺陷,可以通过对所有的失败测试用例求交集,落在交集中的程序点是缺 陷可能存在的点,使得缺陷定位更加准确。本发明提供的一种基于控制流交集的缺陷自动定位装置,如图1所示,包括类文 件改装模块1、测试执行模块2、成功与失败分类模块3、Trace文件解析模块4、失败执行交 集模块5、排序模块6以及源代码映射模块7。将需要缺陷检测的Java类文件和其对应的测试用例输入类文件改装模块1中,类 文件改装模块1对输入的所有待测的Java类文件改装,在相应的程序点自动加入相应的打 印语句。类文件改装模块1将改装后的Java类文件和输入的测试用例输出给测试执行模 块2。所述的程序点有三类函数入口、函数return语句和分支选择语句,在执行到该相应 的程序点时,打印语句将输出打印内容至trace文件。测试执行模块2依据改装后的Java类文件执行所有测试用例,收集每个测试用例 输出的trace文件输出给成功与失败分类模块3。成功与失败分类模块3根据测试执行模块2中各测试用例执行结果正确与否将所 有trace文件分为成功与失败两类,并将分得的成功trace文件与失败trace文件传送给Trace文件解析模块4。Trace文件解析模块4对trace文件进行解析处理,使得trace文件能被后续模块 识别与处理。所述解析处理后的trace文件将以树形结构组织,其中树的根节点是测试用 例信息,分支与叶节点是三类程序点信息。每个测试用例的trace文件构造相应的一个树 形数据结构存储。Trace文件解析模块4解析成功trace文件与失败trace文件,并分别构 造为成功执行树形结构与失败执行树形结构。所有的成功执行树形结构构成成功执行树形 结构集,所有的失败执行树形结构构成失败执行树形结构集。Trace文件解析模块4将失败 执行树形结构集与成功执行树形结构集传递给失败执行交集模块5。失败执行交集模块5通过对所有失败执行树形结构求交集,得出程序中所有可能 含有缺陷的缺陷嫌疑点的集合形成失败执行交集。所述的缺陷嫌疑点是指在每一个失败执 行树形结构中都出现的程序点。失败执行交集模块5将失败执行交集与成功执行树形结构 集传递给排序模块6。排序模块6针对失败执行交集中的缺陷嫌疑点,根据每个缺陷嫌疑点在成功执行 树形结构集中出现的频率从低到高进行排序,将形成的有序的可能含缺陷的所有程序点即 有序的所有缺陷嫌疑点输出给源代码映射模块7。其中,所述频率的数值是一个大于等于 0,小于等于1的实数,定义为该缺陷嫌疑点在成功执行树形结构集出现的次数/所有成功 测试用例的个数。其中,成功执行树形结构集是成功执行树形结构的集合,某缺陷嫌疑点在 成功执行树形结构集出现的次数等于成功执行树形结构集中含有该缺陷嫌疑点的成功执 行树形结构的数目。源代码映射模块7将按照接收到的有序的缺陷嫌疑点集合中的各缺陷嫌疑点映 射到Java源代码文件的相应位置,将所有缺陷嫌疑点对应的源代码位置按每个缺陷嫌疑 点含有缺陷的可能性从大到小排序后,作为缺陷定位报告显示给程序员。其中每个缺陷嫌 疑点含有缺陷的可能性采用一个数值来表征,该数值是一个大于等于0,小于等于1的实 数,其值等于1减去频率的值。可以看出,频率的值越小,对应缺陷嫌疑点含有缺陷的可能 性越高。本发明还提供一种应用上述缺陷自动定位装置的缺陷自动定位方法,如图2所 示,包括如下步骤
步骤一将需要缺陷检测的Java类文件和其对应的测试用例输入类文件改装模块1 中,类文件改装模块1对所有的被测Java类文件进行改装,在相应的程序点自动加入相应 的打印语句。本步骤将Java类文件中的特殊程序点与打印语句代码绑定。当执行到该程 序点时,打印语句将输出打印内容至trace文件。被改装的程序点有三类函数入口、函数 return语句和分支选择语句。如图3所示,为说明本发明的过程所使用的一个示例程序mid (),程序mid ()每 次输入3个整数参数,输出3个整数中处于中间位置的整数值。程序在第7行中存在一个 bug,if语句的条件表达式正确的形式应该是“x<z”。图4为改装后的示例程序mid()。经 改装,程序中的函数入口、函数return语句和分支选择语句会自动加入相应的打印语句。 如图4所示,图4中(1)是对程序中的函数入口的改装,使之在执行时输出标识“Method_ Call”及函数名,记录该函数被调用;图4中(6)是对程序中的函数return语句的改装,使 之在执行时输出标识“MethocLEnd”及函数名,记录该函数调用过程结束;图4中(2)和(3)记录if分支选择语句调用过程,其中(2)输出标识“IF_Call”、if分支对应的源代码行号 和分支语句内容“if (y < ζ) ”,记录该分支被调用,其中,该if分支对应的源代码行号为如 图3中源代码的第4行;(3)输出标识“IF_0ut”及if分支对应的源代码行号和分支语句 内容,记录该分支调用结束;同理,图4中(4)和(5)记录else分支选择语句调用过程。需 要进一步说明的是(a)程序mid ()的其他分支语句,如mid ()源代码中的第5行的if 分支选择语句等也如同上述第4行if分支选择语句那样被改装,这里不再赘述;(b)本发 明直接作用于Java类文件,为了便于说明,仍采用源代码形式展示,实际的改装效果与图 示相同。步骤二 测试执行模块2将所有测试用例按照步骤一中改装后的Java类文件执 行,并输出trace文件。如图5所示,本发明实施例的测试用例一栏中共有6个测试用例,每个测试用例的 编号以方括号表示,每个测试用例的首栏中3个数字依次表示输入的3个整数参数。每个圆形实心黑点表示执行每个测试用例时,改装后的mid ()程序输出打印信息 的位置。其中,第1行为函数mid ()的入口,第14行则是函数mid ()的return语句,标 注圆形实心黑点的其他行表示分支语句调用时,输出打印信息的位置,如图5中第4行。每个测试用例的最后一栏标明了用例执行成功与失败的情况,“F”表示执行失败, “P”表示执行成功。如图5所示,测试用例[1]、[3]、[4]执行成功;测试用例[2]、[5]、[6] 执行失败。通过输入测试用例和改装后的Java类文件,测试执行模块2执行所有测试用例, 并收集每个测试用例输出的trace文件。如图6所示为输入测试用例[1],3个整数分别为1,2,3时,输出的trace文件的 内容。结合图5中的第一个测试用例的打印信息输出位置示意可知,trace文件真实的反 映了程序函数调用和分支选择等控制状态的转移情况。步骤三成功与失败分类模块3根据步骤二中各测试用例执行结果正确与否将所 有trace文件分为成功trace文件与失败trace文件两类。通过判读trace文件中是否报 告执行错误或程序执行结果是否与预期结果一致自动将trace文件分为成功trace文件与 失败trace文件两类。其中,如果trace中报告发生错误或者程序执行结果与预期结果不一 致,则该trace文件划入失败trace文件一类;否则trace文件划入成功trace文件一类。如图5所示,测试用例中用例[1]、[3]、[4]产生的trace文件划为成功trace文 件一类,测试用例[2]、[5]、[6]产生的trace文件划为失败trace文件一类。步骤四=Trace文件解析模块4对步骤三中分类后的trace文件进行解析,使得解 析后的trace文件能被后续模块识别与处理。所有的trace信息将以树形结构组织,其中 树的根节点是测试用例信息,分支与叶节点是步骤一中的三类程序点信息。每个测试用例 产生的trace文件构造为相应的一个树形数据结构存储。如图7所示,图为测试用例[1]产生的trace文件被解析后形成树形结构,其中树 的根节点是测试用例[1],分支与叶节点均是步骤一中的程序点信息。第1层为方法mid() 的调用,第2层为源代码第4行的if调用,第3层为源代码第5行的if调用。树形结构的 层次关系表示了调用关系,例如测试用例[1]调用了方法mid ()。该树中第3层为树叶节 点,不再有子节点。完成解析后,树形结构使trace中的信息不丢失且能被后续模块识别与处理。Trace文件解析模块4解析所有的成功trace文件与所有的失败trace文件后,得 到成功执行树形结构集与失败执行树形结构集。步骤五失败执行交集模块5计算所有失败执行的交集,找到所有缺陷嫌疑点。该 模块通过对所有失败执行树形结构求交集,得出程序中所有缺陷嫌疑点的集合。本发明中 认为在每一个失败的测试用例中都被执行到的或者说每一个失败执行树形结构中都出现 的程序点是缺陷嫌疑点。如图8所示,测试用例[2]、[5]、[6]均为失败的用例,对测试用例[2]、[5]、[6] 求交集,得到如图8所示的可能含有缺陷的所有缺陷嫌疑点,列于图8中“嫌疑点”一栏,缺 陷嫌疑点有程序第1行、第4行、第5行、第7行以及第14行。需要说明的是第1行被视 为函数mid ()的入口,而第14行则是函数mid ()的return语句,均加入缺陷嫌疑点集合中。步骤六排序模块6针对步骤五找到的缺陷嫌疑点,根据它们在成功执行树形结 构集中出现的频率由低到高对它们排序。频率的数值是一个大于等于0,小于等于1的实 数,定义为该缺陷嫌疑点在成功执行树形结构集出现的次数/所有成功测试用例的个数。 其中,成功执行树形结构集是成功执行树形结构的集合,某缺陷嫌疑点在成功执行树形结
构集出现的次数等于成功执行树形结构集中含有该缺陷嫌疑点的成功执行树形结构的数目。如图9所示,本步骤针对每一个步骤五中报告的缺陷嫌疑点,根据它们在成功的 测试用例产生的trace文件中的出现频率对它们排序,频率越低含有缺陷的可能性越大, 排序越靠前。例如第5行缺陷嫌疑点只在1个成功的测试用例产生的trace文件中出现, 即在测试用例[1]中出现,总的成功的测试用例产生的trace文件数为3个,则该缺陷嫌疑 点的在成功的测试用例产生的trace文件中的出现频率为1/3。所有缺陷嫌疑点的频率列 于图9中“频率” 一栏。根据每个缺陷嫌疑点的频率从低到高对它们排序。所有缺陷嫌疑 点的在序列中的位置列于图9中“排序”一栏。如图9所示,按照频率从低到高排序后的缺 陷嫌疑点为程序第7行、第5行、第1行、第4行以及第14行。步骤七源代码映射模块7将步骤六中排序后的各缺陷嫌疑点映射到Java源代码 文件的相应位置,并将排序后的所有缺陷嫌疑点对应的源代码位置以及每个缺陷嫌疑点含 有缺陷的可能性顺序显示出来。其中每个缺陷嫌疑点含有缺陷的可能性,其数值是一个大 于等于0,小于等于1的实数,其值等于1减去步骤六中频率的值。即步骤六中的频率值越 小,每个语句含有缺陷的可能性越高。如图9所示,排序后第7行将作为最终报告的第一个 缺陷嫌疑点告知程序员,程序员能马上定位程序缺陷。
权利要求
一种基于控制流交集的缺陷自动定位装置,其特征在于,该缺陷自动定位装置主要由类文件改装模块、测试执行模块、成功与失败分类模块、Trace文件解析模块、失败执行交集模块、排序模块以及源代码映射模块组成;类文件改装模块通过在相应的程序点自动加入相应的打印语句,对输入的所有被测Java类文件进行改装,并将改装后的Java类文件和输入的测试用例输出给测试执行模块;测试执行模块对所有测试用例执行改装后的Java类文件,收集每个测试用例输出的trace文件并输出给成功与失败分类模块;成功与失败分类模块根据测试执行模块中各测试用例执行结果正确与否将所有trace文件分为成功trace文件与失败trace文件,并将这两类trace文件传送给Trace文件解析模块;Trace文件解析模块对所有成功trace文件与所有失败trace文件进行解析处理,将构造的成功执行树形结构集与失败执行树形结构集传递给失败执行交集模块;失败执行交集模块对所有失败执行树形结构求交集,将在每一个失败执行树形结构中都出现的程序点作为缺陷嫌疑点得到失败执行交集,并将失败执行交集与成功执行树形结构集传递给排序模块;排序模块针对失败执行交集中的缺陷嫌疑点,根据每个缺陷嫌疑点在成功执行树形结构集中出现的频率从低到高进行排序,将形成的有序的所有缺陷嫌疑点输出给源代码映射模块;源代码映射模块将有序的所有缺陷嫌疑点映射到Java源代码文件的相应位置,并最终将所有缺陷嫌疑点对应的源代码位置按每个缺陷嫌疑点含有缺陷的可能性从大到小排序后,作为缺陷定位报告显示出来。
2.根据权利要求1所述的一种基于控制流交集的缺陷自动定位装置,其特征在于,所 述的程序点包括三类函数入口、函数return语句和分支选择语句。
3.根据权利要求1或2所述的一种基于控制流交集的缺陷自动定位装置,其特征在于, 所述解析处理后的trace文件将以树形数据结构的形式组织,其中树形结构的根节点是测 试用例信息,分支与叶节点是三类程序点信息。
4.根据权利要求1所述的一种基于控制流交集的缺陷自动定位装置,其特征在于,所 述频率,其数值等于该缺陷嫌疑点在成功执行树形结构集出现的次数与所有成功测试用例 的个数的比值。
5.根据权利要求1或4所述的一种基于控制流交集的缺陷自动定位装置,其特征在于, 所述的每个缺陷嫌疑点含有缺陷的可能性,其数值等于1减去频率的值。
6.应用权利要求1所述的缺陷自动定位装置的缺陷自动定位方法,其特征在于,包括 以下步骤步骤一、类文件改装模块对所有的被测Java类文件改装,在三类程序点函数入口、函 数return语句和分支选择语句,自动加入相应的打印语句;步骤二、测试执行模块将所有测试用例按照步骤一中改装后的Java类文件执行,并收 集每个测试用例输出的trace文件;步骤三、成功与失败分类模块根据步骤二中各测试用例执行结果正确与否将所有 trace文件分为成功trace文件与失败trace文件两类;步骤四、Trace文件解析模块对trace文件解析,通过构造树形数据结构存储trace信 息,Trace文件解析模块解析所有的成功trace文件与所有的失败trace文件后,得到成功 执行树形结构集与失败执行树形结构集;步骤五、失败执行交集模块通过对所有失败执行树形结构求交集,得出程序中所有缺陷嫌疑点的集合;步骤六、排序模块针对步骤五得到的缺陷嫌疑点,根据它们在成功执行中出现的频率 从低到高对它们排序;所述的频率的数值为该缺陷嫌疑点在成功执行树形结构集出现的次 数与所有成功测试用例的个数的比值;步骤七、源代码映射模块将排序后的各缺陷嫌疑点映射到Java源代码文件的相应位 置,并将排序后的所有缺陷嫌疑点对应的源代码位置以及每个缺陷嫌疑点含有缺陷的可能 性顺序显示出来。
7.根据权利要求6所述的缺陷自动定位方法,其特征在于,步骤四中所述的树形数据 结构存储trace信息,具体为树形结构的根节点是测试用例信息,分支与叶节点是步骤一 中的三类程序点信息。
8.根据权利要求6所述的缺陷自动定位方法,其特征在于,步骤五中所述的缺陷嫌疑 点指在每一个失败执行树形结构中都出现的程序点。
9.根据权利要求6所述的缺陷自动定位方法,其特征在于,步骤七中所述的可能性,其 数值等于1减去步骤六中所述的频率的值。
全文摘要
本发明公开一种基于控制流交集的缺陷自动定位装置及其方法。该装置包括类文件改装模块、测试执行模块、成功/失败分类模块、Trace文件解析模块、失败执行交集模块、排序模块和源代码映射模块,将被测Java类文件经类文件改装模块改装,在测试执行模块执行各测试用例得到trace文件,成功/失败分类模块、Trace文件解析模块对trace文件进行处理,由失败执行交集模块、排序模块找到缺陷嫌疑点并对其进行排序,最后源代码映射模块将缺陷嫌疑点映射到Java源代码的相应位置。该方法通过对改装的Java类文件执行测试用例,对得到的trace文件进行分类、解析,找到缺陷嫌疑点并排序,最后将缺陷嫌疑点映射到Java源代码文件对应位置。本发明节省了大量人力,物力,提高了排错效率。
文档编号G06F11/36GK101894073SQ20101025463
公开日2010年11月24日 申请日期2010年8月17日 优先权日2010年8月17日
发明者余丹, 叶钢, 周家杰, 李重文, 马世龙 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1