APP下载

一种基于行为规则的程序特征定位方法

2015-07-21宋艳王炜

科技与创新 2015年12期

宋艳++王炜

摘 要:程序特征定位是成功实施动态演化意图的前提条件,其核心是识别代码集合与特征之间的映射关系。将程序运行时有规律的消息传递模式抽象为规则,通过规则获取和注释识别了程序特征与代码集合之间的映射关系,提出了规则空间用于刻画程序特征间存在的大小和层次等粒度属性,并基于此实现了对复杂程序特征的层次化理解,完成了特征定位。通过对Eclipse3.0的45个测试用例(含4822个对象)进行分析,在置信度和支持度设置为75%和30%的情况下,生成了645条规则和规则空间,实现了特征定位。其平均准确率为34.33%,这证明该方法是可行的。

关键词:软件动态演化;程序特征;行为规则;特征定位

中图分类号:TP311.5 文献标识码:A DOI:10.15913/j.cnki.kjycx.2015.12.001

特征定位(Feature Location)是指构建程序特征与软件代码之间映射关系的过程,它将来自系统问题域的特征映射到了系统实现域的代码实体(Source Code Entities)。IEEE 829认为,程序的特征是“一个软件项目的显著特点”,例如功能、可移植性或性能特性。文献2中指出,在长生命周期软件系统中,50%~75%的系统成本和相关费用用于软件维护,其中1/2以上的工作量用于特征定位。

各国研究人员针对特征定位开展了广泛而深入的研究,提出了静态、动态和基于文本的特征定位方法。其中,由于动态方法具有比较高的查准率,所以,其被广泛应用于特征定位领域。1995年,Wilde提出了最早的动态特征定位方法——软件侦测技术。该方法关注获取特征与代码实体之间的特定追踪关系。对每个需要定位的特征设计两组测试用例,一组测试用例的执行展示该特征,而另外一组测试用例的执行不会涉及这个系统的特征。两组测试用例所对应的执行迹之差便是特征所对应的代码。程序切片技术可以应用于动态特征定位,而程序切片是指影响程序中某个兴趣点变量取值的所有语句和控制谓词组成的一个程序子集。Wong、张迎周、徐宝文等学者基于程序切片技术提出了各自的程序理解方法。Eisenberg基于特征迹(Dynamic Feature Traces)方法进行特征定位研究。该方法赋予了执行迹中的成对调用关系一个权值,利用这个权值确定了该执行迹属于某个程序特征的程度。此方法在3个Java系统上进行了测试,结果表明,该方法的效率比软件侦测效率高。Safyallah和Sartipi提出了一种将数据挖掘技术运用到执行迹抽取的方法。Bohnet等人提出了一种将执行信息可视化的技术,依靠该技术可以完成观察特征的实现。刘奕明结合领域建模方法提出了一种基于本体的动态软件特征建模方法,并给出了其元模型和基于推理的模型一致性验证方法。开发者可以对动态软件系统的业务逻辑共性、运行时业务逻辑的可变性和这些可变性之间的约束关系建模,从而为动态软件系统提供高层次、抽象的软件演化业务逻辑视图。Eisenbarth等人基于概念格(Concept Lattice)进行了特征定位研究。该方法对场景、测试用例与代码实体间的二元关系进行了形式化的概念分析,为其建立了一个概念格结构,并将其可视化。

虽然各国学者从不同角度提出了动态特征定位方法,但是,当前的研究成果大多都着眼于建立用例与代码间的映射关系。然而,任何一个用例都是由一个或多个软件功能组成的,因此,传统的动态特征定位方法无法实现软件功能与代码之间的映射关系。另外,在进行特征定位时,一个测试用例往往对应着大量的执行迹,而现有的方法无法量化表示上述执行迹间的因果关系,所以,后续分析无从下手。

针对上述2个缺陷,本文基于行为规则提出了动态特征定位方法。

1 方法综述

如图1所示,本文采用的方法可以分为3个部分:①产生测试用例,并收集程序执行迹;②生成行为规则集;③构造行为规则空间,实现特征定位。

图1 基于行为规则的软件特征理解方法流程

1.1 产生测试用例并收集程序执行迹

动态特征定位的基础是执行迹。执行迹的获取有以下4个步骤:①编写测试用例,测试用例应覆盖软件的所有功能点或执行路径;②在源代码中,设置检查点(Check Point),用来观察程序运行时的状态信息,并编译带有检查点的代码,从而形成可执行文件;③执行测试用例,观测并收集与测试用例相关的数据;④建立执行迹与测试用例之间的映射关系。

实现特征定位首先要生成测试用例。

定义1:有限非空集合U={u1,u2,…,un},n∈N为一个测试用例集合。二元组ui=(IDi,BDi)是一个测试用例,其中,IDi定义为该测试用例的标示符,有限非空集合BDi包含了对该测试用例的描述。

通过对含有检查点的可执行文件执行测试用例,可以获取对应的执行迹。执行迹不仅是刻画程序运行时代码实体间消息传递关系的载体,同时,它还反映了程序功能单元的实现过程。

定义2:有限非空集合T={t1,t2,…,tn},n∈N是程序的执行迹集合。其中,ti是与测试用例ui相对应的执行迹。

定义3:执行迹可以描述为一个三元组,即ti=(Oi,

当前,有多种工具可以完成对执行迹的获取,例如Flat3 等。表1给出使用Flat31获取的一个执行迹片段示例。

表1 执行迹片段示例

0:0:46:26 mouseEntered -- org.gjt.sp.jedit.textarea.Gutter$MouseHandler

0:0:46:26 mouseExited -- org.gjt.sp.jedit.textarea.Gutter$MouseHandler