一种基于测试用例构建决策树的程序条件语句自动化修复系统及方法技术方案

技术编号:17032647 阅读:22 留言:0更新日期:2018-01-13 19:14
本发明专利技术涉及一种基于测试用例构建决策树的程序条件语句自动化修复系统及方法,针对程序的条件语句,从测试用例集的执行信息产生用于训练的数据集,引入决策树进行监督学习的方法产生补丁代码进行修复,并且利用一定的搜索策略克服了错误的条件语句多次执行的困难。通过本发明专利技术进行自动化修复,可达到较高的修复成功率和较快的执行效率,同时学习训练和生成补丁的核心模块具有很高的通用性和鲁棒性,能够适用于多种程序语言和环境。

【技术实现步骤摘要】
一种基于测试用例构建决策树的程序条件语句自动化修复系统及方法
本专利技术涉及一种基于测试用例构建决策树的程序条件语句自动化修复系统及方法,属于软件测试与调试

技术介绍
软件测试和调试是保证软件质量的重要环节,也是最耗时和最困难的工作之一。对程序进行自动化的测试能够有效提高软件开发效率和质量,而对程序做自动化修复能够在非常节约人力成本的情况下让程序错误得到最大限度及时有效的修正。因此研究人员开始关注并提出了很多自动化生成补丁修复程序的思路与方法。程序的自动化修复可以从很多角度展开,例如可以在源代码级别或者中间代码甚至可执行代码级别,相应的也有静态的修复和动态运行时进行修复,有针对特定类型错误的也有面向通用程序和通用错误的。目前较常用的分类是基于约束的程序修复与基于测试用例集的程序修复,本专利技术提出的方法属于后者。基于测试用例的修复首要目标是在发现有失败测试用例即发现了程序错误之后,对源代码进行修改以使测试用例全部通过。其基本假设是测试用例相对足够充分,且测试用例的产生遵循了一定的规则例如等价类划分、边界值、分支覆盖等,这样一套完善的测试用例集足够将程序的预期行为都覆盖到并且做出隐含的描述,因此通过了全部测试用例可以认为等价于在各种输入下都可正常执行。目前基于测试用例的自动化修复主要有基于搜索的方法、基于语义分析和约束求解的方法以及基于先验知识和特征的方法等。这些方法仍往往面临一些困难,例如搜索空间巨大和条件组合爆炸问题、约束求解器的性能和功能的限制以及修复方法的鲁棒性和通用性问题等。
技术实现思路
本专利技术技术解决问题:克服现有技术的不足,提供一种基于测试用例构建决策树的程序条件语句自动化修复系统及方法,通过本专利技术进行自动化修复,可达到较高的修复成功率和较快的执行效率,同时学习训练和生成补丁的核心模块具有很高的通用性和鲁棒性,能够适用于多种程序语言和环境。本专利技术技术解决方案:一种基于测试用例构建决策树的程序条件语句自动化修复系统,全自动的进行错误定位修复和验证无需人工干预,无需任何先验知识和人的经验完全基于测试用例集的数据进行学习,对条件语句进行翻转来获得执行并获得训练数据集,利用决策树进行训练并产生修复代码,利用决策树的剪枝和训练集搜索过滤算法。所述系统包括:可疑条件语句定位模块,程序预处理模块,训练数据收集模块,模型学习和补丁生成模块,补丁验证和回归测试模块;其中:可疑条件语句定位模块:根据测试用例集,利用程序插桩工具,运用基于程序覆盖的错误自动定位技术针对程序源代码中的条件语句按照可疑度由高到低进行排序,顺次作为可疑条件语句输入后续模块;程序预处理模块:对给定的可疑条件语句所在行,对条件表达式布尔值进行翻转获得程序原版本和变异版本程序,并收集在两个版本程序,即程序原版本和变异版本程序的当前位置中可访问到的程序变量列表,程序变量列表包括静态变量,全局变量,局部变量,常数定义和函数参数;利用插桩工具插入获取这些变量运行时状态和条件表达式结果值的语句,得到插桩后的两个版本程序源代码供训练数据收集模块产生训练数据集;训练数据收集模块:对程序预处理模块中所述两个版本程序分别执行测试用例集,收集每个变量在两个版本程序中执行每个测试用例的运行时值计入日志,过滤选取每个测试用例在两个版本中仅有一个为成功另一为失败的用例,并收集这些用例下两版本程序中成功的一方所打印出的变量值作为训练数据集;模型学习和补丁生成模块:将训练数据集中每个用例下的每个变量值作为不同的输入维组成一个输入向量,将每个用例下条件表达式的值作为输出值,对训练集进行基于决策树的二分类监督学习,可生成一颗二叉树结构的分类器,并解析这棵树生成补丁语句;补丁验证和回归测试模块:将生成的补丁语句应用到原程序中并运行整个测试用例集,如果全部通过则结束并成功进行修复,否则筛选训练数据集中的训练数据项以及限制决策树深度进行再次尝试直到成功修复或最终失败。本专利技术的一种基于测试用例构建决策树的程序条件语句自动化修复方法,实现步骤如下:(1)对C程序使用编译程序进行编译,使可执行程序中带有记录源代码中每条语句的执行次数的覆盖信息,执行完全部测试用例集之后可收集到每行被成功和失败用例分别执行的次数,利用可疑度计算公式如Tarantula计算每行可疑度并按行进行排序;(2)利用词法和语法分析工具将该条件表达式取反即其结果做一次翻转产生一个变异版本,再使用程序静态分析工具获得指定语句上可访问到的变量列表,并插入输出语句将运行时这些变量在这一点的值作为一个输入向量,以及条件表达式的结果值作为输出,这样每个测试用例将执行这个条件语句零至多次,每次执行将产生一个分类训练的样本,原版本和对应变异版本产生的同一条训练样本,只有输出不同;(3)执行两个版本程序的被测程序,分别得到两份变量运行时状态收集日志,对于每个测试用例在两份日志中可能存在多条训练样本,选取两个版本中只有其中之一为成功另外一个为失败的用例所对应的那份日志中该用例的全部训练样本,这样的全部训练样本合在一起作为学习分类器的最终训练数据集;(4)使用决策树算法在收集到的训练数据集上进行训练,如果生成的决策树深度超过阈值则认为发生过拟合,进一步对训练集进行筛选,过滤掉在单个测试用例中可疑条件语句执行次数超过某阈值的用例所对应的训练样本,并对生成决策树的最大深度做出限制,多次修改阈值参数反复进行训练直到得出满足要求的分类器,并将该决策树解析为一个布尔表达式,或者未找到该分类器则对该可疑条件语句修复失败,回到程序预处理模块采用下一可疑条件语句尝试修复;(5)将模型学习和补丁生成模块产生的布尔表达式作为可疑条件语句的补丁替换原有表达式,执行回归测试,如果修改后的程序通过全部测试用例则修复成功,否则回到模型学习和补丁生成模块继续调整参数进行训练。本专利技术与现有技术相比的优点在于:(1)准确度高:由于基于测试用例集的程序自动化修复所追求的的目标为让全部测试用例通过,而决策树的学习算法通常具有的过拟合的缺点此时恰好转化为提升准确率的优势,同时通过筛选训练集的阈值调整和补丁验证可将拟合程度控制在恰好的状态,保证了修复结果的通用性和准确性;(2)语义清晰:由于决策树的分类器结构逻辑上完全等效于条件语句的判断过程,因为通过决策树来构建条件语句的补丁代码具有很强的可读性和可解释性;而且合理产生的测试用例的输入能很好地反应不同情况下的输入边界,决策树可以很好地将其挖掘出来;(3)快速:针对条件语句的修复搜要搜索的可疑语句比通常少一个数量级,能有效加快错误定位的速度;同时对指定的语句利用收集好的训练集去学习获得分类器再转化为补丁代码,避免了盲目生成补丁再反复运行测试用例去验证的最耗时的步骤,速度提升非常明显;(4)鲁棒性强:利用数据和监督学习生成决策树的模块是该方法的核心,这将对程序的分析从不同的程序语言、运行平台等隔离出来,仅需对其他部分做少量适配即可实现不同语言平台的自动化修复,具有很强的可移植性和鲁棒性;(5)轻量级:避免进行复杂的程序静态分析和形式化方法及约束求解等较繁琐的操作,也无需对目标空间进行穷举的搜索,仅需少量程序预处理工作就可接入到通用的模型学习和补丁生成模块,环境配置简单轻量。附图说明图1为本专利技术系统的体系结构图;图2本文档来自技高网...
一种基于测试用例构建决策树的程序条件语句自动化修复系统及方法

【技术保护点】
一种基于测试用例构建决策树的程序条件语句自动化修复系统,其特征在于:所述系统包括:可疑条件语句定位模块,程序预处理模块,训练数据收集模块,模型学习和补丁生成模块,补丁验证和回归测试模块;可疑条件语句定位模块:根据测试用例集,利用程序插桩工具,运用基于程序覆盖的错误自动定位技术针对程序源代码中的条件语句按照可疑度由高到低进行排序,顺次作为可疑条件语句输入后续模块;程序预处理模块:对给定的可疑条件语句所在行,对条件表达式布尔值进行翻转获得程序原版本和变异版本程序,并收集在两个版本程序,即程序原版本和变异版本程序的当前位置中可访问到的程序变量列表,程序变量列表包括静态变量,全局变量,局部变量,常数定义和函数参数;利用插桩工具插入获取这些变量运行时状态和条件表达式结果值的语句,得到插桩后的两个版本程序源代码供训练数据收集模块产生训练数据集;训练数据收集模块:对程序预处理模块中所述两个版本程序分别执行测试用例集,收集每个变量在两个版本程序中执行每个测试用例的运行时值计入日志,过滤选取每个测试用例在两个版本中仅有一个为成功另一为失败的用例,并收集这些用例下两版本程序中成功的一方所打印出的变量值作为训练数据集;模型学习和补丁生成模块:将训练数据集中每个用例下的每个变量值作为不同的输入维组成一个输入向量,将每个用例下条件表达式的值作为输出值,对训练集进行基于决策树的二分类监督学习,可生成一颗二叉树结构的分类器,并解析这棵树生成补丁语句;补丁验证和回归测试模块:将生成的补丁语句应用到原程序中并运行整个测试用例集,如果全部通过则结束并成功进行修复,否则筛选训练数据集中的训练数据项以及限制决策树深度进行再次尝试直到成功修复或最终失败。...

【技术特征摘要】
1.一种基于测试用例构建决策树的程序条件语句自动化修复系统,其特征在于:所述系统包括:可疑条件语句定位模块,程序预处理模块,训练数据收集模块,模型学习和补丁生成模块,补丁验证和回归测试模块;可疑条件语句定位模块:根据测试用例集,利用程序插桩工具,运用基于程序覆盖的错误自动定位技术针对程序源代码中的条件语句按照可疑度由高到低进行排序,顺次作为可疑条件语句输入后续模块;程序预处理模块:对给定的可疑条件语句所在行,对条件表达式布尔值进行翻转获得程序原版本和变异版本程序,并收集在两个版本程序,即程序原版本和变异版本程序的当前位置中可访问到的程序变量列表,程序变量列表包括静态变量,全局变量,局部变量,常数定义和函数参数;利用插桩工具插入获取这些变量运行时状态和条件表达式结果值的语句,得到插桩后的两个版本程序源代码供训练数据收集模块产生训练数据集;训练数据收集模块:对程序预处理模块中所述两个版本程序分别执行测试用例集,收集每个变量在两个版本程序中执行每个测试用例的运行时值计入日志,过滤选取每个测试用例在两个版本中仅有一个为成功另一为失败的用例,并收集这些用例下两版本程序中成功的一方所打印出的变量值作为训练数据集;模型学习和补丁生成模块:将训练数据集中每个用例下的每个变量值作为不同的输入维组成一个输入向量,将每个用例下条件表达式的值作为输出值,对训练集进行基于决策树的二分类监督学习,可生成一颗二叉树结构的分类器,并解析这棵树生成补丁语句;补丁验证和回归测试模块:将生成的补丁语句应用到原程序中并运行整个测试用例集,如果全部通过则结束并成功进行修复,否则筛选训练数据集中的训练数据项以及限制决策树深度进行再次尝试直到成功修复或最终失败。2.一种基于测试用例构建决策树的程序条件语句自动化修复方法,...

【专利技术属性】
技术研发人员:刘誉臻张震宇
申请(专利权)人:中国科学院软件研究所
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1