当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于符号执行的带反馈测试用例生成方法技术

技术编号:7898101 阅读:232 留言:0更新日期:2012-10-23 04:19
本发明专利技术公开了一种基于符号执行的带反馈测试用例生成方法,其步骤为:(1)执行已有的测试用例并收集测试用例覆盖信息;(2)根据被测程序的控制流图确定符号执行的覆盖目标;(3)对被测试程序插桩,植入符号执行的控制代码;(4)从已有测试用例集中选择合适的种子测试用例;(5)针对覆盖目标应用符号执行方法生成新的测试用例,新生成的测试用例补充入测试用例集;(6)重复上述步骤,直至达到给定的测试用例生成目标。本发明专利技术可广泛应用于软件开发过程中的自动化测试,自动化生成测试用例,避免单纯符号执行的约束条件爆炸问题,提高效率;同时能够结合其他生成方法,缓解符号执行方法不能处理复杂数据结构的问题。

【技术实现步骤摘要】

本专利技术涉及软件自动化测试中的测试用例生成,特别涉及在现有测试用例基础上,应用符号执行方法,通过设定覆盖目标和选择种子测试用例,限制约束求解的范围,以反馈和迭代的方式高效率生成测试用例。
技术介绍
在软件测试过程中,测试用例生成是最重要的环节之一。有效的测试用例生成可以提高测试执行效果,同时降低测试成本和时间。目前测试用例生成基本靠人工来完成,耗时耗力,难以达到理想的程序覆盖率,因此需要有效的自动化测试用例生成方法。自动化测试用例生成的效果一般由程序覆盖率来度量,较高的覆盖率意味着更高的缺陷检测概率和软件质量保证能力。一个好的测试用例生成方法能够以较少的测试用例数量来达到较高的·程序覆盖率。现有的自动化测试用例生成方法包含三个类别随机测试、基于搜索的测试以及符合执行。其中随机测试方法采用随机的方式生成测试用例输入,常生成过多的测试用例,且难以完成对特定程序覆盖目标的处理;基于搜索的测试方法采用遗传算法等来达到指定程序路径的覆盖,常需要过多的时间来生成测试用例,且受到搜索空间的限制;符号执行方法采用符号变量来执行程序,通过求解约束表达式来达到程序覆盖目标;在面对较大规模程序时,常遇到约束条件爆炸问题,在现有约束求解技术下难以完成复杂约束表达式的求解。
技术实现思路
本专利技术的主要目的是针对传统自动化测试用例生成方法不能独立完成自动化测试用例生成任务的问题,提出,以反馈和迭代的方式,通过收集程序覆盖信息,设定覆盖目标,限制符号执行中约束求解的范围,高效率生成测试用例。为实现本专利技术所述目的,本专利技术采用如下的步骤 1)执行已有的测试用例并收集测试用例覆盖信息;确定每个测试用例在执行时覆盖的被测程序中的语句块,一个语句块指在任何程序输入下,执行情况都相同的一组语句;汇总所有测试用例所覆盖的语句块,确定被测程序中尚未覆盖的语句块集合; 2)根据被测程序的控制流图确定符号执行的覆盖目标;覆盖目标是被测程序中尚未覆盖的某个语句块; 3)对被测程序插桩,植入引导符号执行的控制代码;控制代码包括标记语句和判定语句; 4)从已有测试用例集中选择合适的种子测试用例,用于启动符号执行方法;5)针对覆盖目标应用符号执行方法生成新的测试用例;将新生成的多个测试用例补充到已有的测试用例集合中。上述5个步骤迭代执行,直至达到给定的测试用例生成目标。上述步骤2)中根据被测程序控制流图确定符号执行覆盖目标的处理过程是首先根据代码控制结构,将被测程序语句块组织成控制流图僅,图中的节点对应语句块,边代表语句块执行顺序;识别被测程序中每个函数/过程/方法中处于最高层次的子树,定义为上层子树;然后寻找覆盖率最低的函数/过程/方法(通过补充已有测试用例使其至少部分覆盖),在其对应的控制流图中确定第一个没有充分覆盖的上层子树;最后选择该上层子树中第一个没有被覆盖的语句块(对应非控制节点)作为本次符号执行的覆盖目标。上述步骤3)中被测程序插桩以植入引导符号执行的控制代码的处理过程是首先确定覆盖目标所在的函数/过程/方法,在其起始位置插入判定变量定义语句,判定变量 的初值置为“false”;然后在覆盖目标之前的位置插入判定变量赋值语句,将判定变量赋值为“true”;最后确定覆盖目标所处的上层子树,在上层子树之后的位置插入控制符号执行的判定语句;在符号执行中,判定语句根据判定变量的取值决定是否继续补充约束条件以求解更复杂的约束表达式。上述步骤4)中从已有测试用例集中选择种子测试用例的处理过程是首先从已有测试用例中筛选覆盖了步骤2中覆盖目标的父节点的所有测试用例;令控制流图CFG中覆盖目标所对应的节点为%,父节点是fTG中位于节点%之前且直接与%相连接的节点(按步骤2中的处理方式,父节点有且仅有一个);然后从这些测试用例中筛选对覆盖目标所处之上层子树的覆盖程度最高的测试用例;最后在剩余的测试用例中选择覆盖语句块总数最少的测试用例作为种子测试用例。上述步骤5)中针对覆盖目标应用符号执行方法生成测试用例的处理过程是首先根据覆盖目标确定符号执行的入口,包括对应函数/过程/方法的名称和参数列表;然后识别或选择符号执行需要处理的输入参数,即参数处理类型,符号执行无法处理的非数值参数必须作为常量,其他作为符号变量;根据种子测试用例为输入参数赋初值并设置符号执行的配置信息;配置信息的具体内容取决于所采用的符号执行方法,其中的关键是符号执行入口和参数处理类型;最后以插桩程序为基础驱动符号执行方法生成新的测试用例。本专利技术利用人工、随机生成、或者历史积累的初始测试用例集,以迭代和反馈的方式,通过收集程序覆盖信息,设定覆盖目标,有效限制符号执行中约束求解的范围,从而降低约束表达式的复杂度,减少符号执行的规模和数量,高效率生成测试用例。为达到同等的程序覆盖率,同随机测试方法相比较,本专利技术方法无论在测试用例生成时间上,还是在测试用例生成数量上,都远小于随机测试方法;同单纯符号执行方法相比较,除生成的测试用例数量略多以外,本专利技术只需要更少的测试用例生成时间,就可以处理更大规模和复杂度的软件程序,可以灵活处理不需要或者不能够进行符号执行的输入参数。归纳起来,本专利技术的优点主要是可用于各个测试阶段的自动化测试生成工作;可用于各种类型软件程序测试,不依赖于编程语言和测试环境;可充分利用被测程序已有的测试用例集;在自动化测试生成过程中,便于人工干预或引入其他的测试用例生成方法,具有较好的灵活性、可扩展性和适应性。附图说明图I是基于符号执行的带反馈测试用例生成方法的结构 图2是根据控制流图确定符号执行覆盖目标的工作流程 图3是一个程序代码示例及其对应的控制流 图4是被测程序插桩并植入符号执行控制代码的工作流程 图5是程序代码示例和基于JPF工具的控制代码插桩示意 图6是从已有测试用例集中选择种子测试用例的工作流程 图7是应用符号执行方法生成新测试用例的工作流程图; 图8是针对程序代码示例的部分JPF工具配置信息示意图。具体实施例方式下面结合附图进行详细说明。如图I所示,本专利技术方法由五个步骤组成其一,收集已有测试用例的程序覆盖信息;其二,根据被测程序的控制流图确定符号执行的覆盖目标;其三,对被测程序插桩,植入引导符号执行的控制代码;其四,从已有测试用例集中选择合适的种子测试用例;其五,针对覆盖目标应用符号执行方法生成新的测试用例。新生成的测试用例补充入现有的测试用例集;其六,重复上述步骤,直至达到给定的测试用例生成目标,如100%语句覆盖率。本专利技术方法的输入包括被测程序、以及由人工或随机测试等方法生成的测试用例集;输出是达到了指定程序覆盖率的测试用例集。步骤一是收集已有测试用例的程序覆盖信息。确定每个测试用例在执行时覆盖的程序语句块,一个语句块(或代码块)指在任何程序输入下,执行情况都相同的一组语句。汇总所有测试用例所覆盖的语句块,可以确定被测程序中尚未覆盖的语句块集合。步骤二是根据被测程序的控制流图确定符号执行的覆盖目标,过程如图2所示。根据代码控制结构,被测程序的语句块可以组织成为控制流图CFG =其中JV为控制流图的节点集合,每个节点对应一个语句块为控制流图的边集。对于任意两个语句块&;和%,有向边< >€ 表示W和\之间存在顺序关系,即\可本文档来自技高网...

【技术保护点】
一种基于符号执行的带反馈测试用例生成方法,其特征在于包括以下步骤:1)执行已有的测试用例并收集测试用例覆盖信息;确定每个测试用例在执行时覆盖的被测程序中的语句块;汇总所有测试用例所覆盖的语句块,确定被测程序中尚未覆盖的语句块集合;2)根据被测程序的控制流图确定符号执行的覆盖目标;覆盖目标是被测程序中尚未覆盖的某个语句块;3)对被测程序插桩,植入引导符号执行的控制代码;控制代码包括标记语句和判定语句;4)从已有测试用例集中选择合适的种子测试用例,用于启动符号执行方法;5)针对覆盖目标应用符号执行方法生成新的测试用例;将新生成的多个测试用例补充到已有的测试用例集合中;6)上述5个步骤迭代执行,直至达到给定的测试用例生成目标。

【技术特征摘要】

【专利技术属性】
技术研发人员:顾庆庄元汤九斌陈道蓄
申请(专利权)人:南京大学
类型:发明
国别省市:

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

1