1. 引言
模型转换(Model Transformation)是模型驱动软件架构(Model Driven Architecture, MDA)的核心与灵魂。作为一种新兴的软件开发模式,MDA [1] 主张在整个软件开发生命周期围绕模型展开,以此为基础将系统的业务模型与具体的实现细节分离。相比传统的软件开发过程,MDA能更好地适应多变的需求、不断增长的系统规模、以及日益复杂的系统环境,并能使得所开发的软件具备更好的可重用性和可移植性。这些优势使得基于MDA的软件开发模式在多个领域(如分布式系统,电信领域应用,网络应用,国防与航天应用,无线传感器网络等)得到广泛应用和推广 [2] [3]。
基于MDA的软件开发过程如图1所示。MDA利用不同层次的模型从不同角度来描述软件系统:计算无关模型(Computation Independent Model, CIM)关注系统的业务功能描述;平台无关模型(Platform Independent Model, PIM)从软件系统实现的角度来描述系统业务功能;平台相关模型(Platform Specific Model, PSM)描述利用特定的技术对系统的实现。基于MDA的软件开发过程实质上就是实现从CIM到PIM,从PIM到PSM,进而从PSM到代码的映射。而不同模型之间的映射则通过模型转换来自动实现。
在MDA中,不同模型之间的转换实质上是通过在模型转换平台上运行模型转换程序来自动实现的。也就是说,模型转换的过程就是执行模型转换程序的过程。显然,在MDA中要保障最终软件的质量,归根结底在于如何保障模型转换程序的质量。
由于模型转换自身的特点 [4] [5],应用于传统软件上的质量保障技术大部分都不能直接应用于模型转换,因此需要针对模型转换研究适合并有效的质量保障技术。研究者很早就意识到模型转换质量的重要性,并且持续有新的研究成果被发掘,但是目前大部分研究工作主要关注于缺陷检测 [6] [7] [8] [9] 以及缺陷定位 [10] [11] [12] [13] [14]。针对模型转换程序的自动化缺陷修复,当前工作聚焦于典型的语义或者语法错误。但是,由于模型转换调试所面临的Oracle问题 [9],当前的方法主要采用人工定义规约或者已有的示例输入–输出来扮演Oracle的角色,在应用上有一定的局限性 [15] [16] [17]。

Figure 1. MDA based software development
图1. 基于MDA的软件开发过程
鉴于这种情况,我们立足于一类常用的模型转换程序,ATL (ATLAS Transformation Language)模型转换 [18]。针对其功能性缺陷,本文提出并实现一种自动化缺陷修复方法,旨在缓解其所面临的Oracle问题。本文的主要贡献如下:
1) 利用蜕变关系来描述模型转换程序相关源模型及其对应目标模型所应满足的属性,在此基础上应用蜕变测试技术来实现补丁的验证,以缓解ATL程序自动化缺陷修复中的Oracle问题;
2) 针对ATL程序设计并实现9种变异操作以支持自动化的补丁生成,并应用随机搜索算法来驱动自动化的缺陷修复过程;
3) 实现针对ATL程序的自动化缺陷修复工具AMTRepair,并在公共数据集上开展实验分析。实验结果表明针对目标程序,AMTRepair的缺陷修复率约为51%,其正确补丁生成率为30%。
2. 背景知识
2.1. ATL模型转换程序
模型转换的目的实现不同模型之间的自动化变换。而模型转换程序是由具体的程序语言来实现的。目前,已经有多种模型转换语言包括Henshin [19],AGG [20],Maude [21],AToM3 [22],QVT [23] 和ATL [24] 等。其中,ATL (ATLAS Transformation Language)是一种基于文本规则的模型转换语言,它提供声明式和命令式的语言概念,提供元模型标准支持并能快速集成到开发平台。这些使得ATL在学术领域和工业界都得到广泛的应用。本文将聚焦于ATL模型转换程序,并研究其自动化的缺陷修复方法。
模型转换的过程如图2所示。一个ATL模型转换程序的输入为一个源模型,其输出为对应的目标模型。源(目标)模型遵循相应的源(目标)元模型的定义。一个ATL程序主要由一系列rule和helper组成。其中rule描述了如何从特定的源模型元素生成目标模型的对应元素,而helper实现了某些辅助功能。

Figure 2. Procedure of model transformation
图2. 模型转换基本过程
图3展示了一个ATL 模型转换示例Class2Relational,它实现了从Class模型(源元模型如图3(a)所示)到Relational模型(目标元模型如图3(b)所示)的转换。一个Class模型由一个或多个Class构成,每个Class包含一组Attribute,Attributes分为单值和多值。一个Relational模型由一个或多个Table构成,每个Table包含一组Columns,并对其有键的引用;类Column有一个对Type的引用。
一个ATL程序中包含多个rule。如图3(c)所示,Class2Relational程序片段中展示了2个rule:DataType2Type,SingleValuedDataTypeAttribute2Column。一个rule由几个部分组成,包括:1) 源模型的被映射元素inElement,由from关键字引导,声明被该rule匹配的源模型元素;2) 源模型的元素筛选条件SM Filter condition,描述该rule所针对的源模型元素所需要满足的条件;3) 目标模型元素outElement,声明所生成的目标元素;4) 与outElment相关的一系列bingdings,描述目标模型元素值的获取方式。以图3(c)中的rule SingleValuedDataTypeAttribute2Column为例(9~19行)。其inElement为Class!Attribute,即Class模型中的Attribute元素(11行),SM Filter condition是单值属性(12行)。该rule的outElement为Relational模型中的Column元素(15行),其相应的bindings 声明了Column元素每个属性值的获取方法(16~17行)。
随着模型转换技术在不同领域的应用和发展,其质量问题也得到广泛关注。然而,对其进行质量评估与维护面临诸多挑战,其中之一就是Oracle问题,即很难评判模型转换程序输出的正确性 [9]。
2.2. 蜕变测试
蜕变测试(Metamorphic Testing, MT) [25] 已被成功应用到大量的软件系统以有效地缓解Oracle问题。蜕变测试的核心概念是蜕变关系(Metamorphic Relations, MRs),蜕变关系是对目标程序相关输入和对应的输出之间关系的一种描述,是程序必要属性的反映。蜕变测试的核心思想是借助蜕变关系从初始输入中构造衍生输入,进而通过判断相关初始输出和衍生输出之间是否符合蜕变关系来判断程序是错误的。通常,利用蜕变测试组(Metamorphic Test Group, MTG)来表示与给定蜕变关系相关的一组初始输入和衍生输入。
以一个程序P (实现了正弦函数sin的计算)为例。对于任取的一个x值,很难确定P(x)的正确性,即测试P面临Oracle问题。从蜕变测试的角度,可以考虑sin函数所满足的一些特性,比如
。借助此特性,可以构造的一个蜕变关系:
,进而对P进行测试。例如,给定一个初始输入37,根据蜕变关系构建其衍生输入为143,然后比较P(37)与P(143),如果它们不相等,此蜕变关系被违反,即说明程序P是错误的。
经过几十年的发展和研究,蜕变测试已经被广泛应用于众多领域中,包括编译器的测试、搜索引擎和机器学习等。
3. ATL模型转换程序自动化缺陷修复
3.1. 方法概述
鉴于调试ATL模型转换程序所面临的Oracle问题,我们将结合蜕变测试技术来缓解修复ATL程序缺陷所面临的Oracle问题。本文提出一种基于蜕变测试技术的缺陷修复方法AMTRepair,总体框架如图4所示。基于给定的错误ATL程序P、一组蜕变关系MRs,以及一些初始的测试用例tcs。AMTRepair首先基于MRs构造MTG集合S。在本文中一个MTG为一个初始源模型和它对应的衍生源模型。然后,AMTRepair应用MT以及S来对P进行测试并收集相关的覆盖信息。在此基础上,AMTRepair应用基于频谱的错误定位(spectrum-based fault localization, SBFL)方法 [26] 来对P中的规则的可疑度进行计算,从而获得一个可疑的规则的列表。最后,AMTRepair应用随机搜索算法,随机选择变异的操作对可疑的规则中的代码进行修改生成候选补丁,进而采用MT对补丁进行验证,直至生成一个满足S中所有MTGs的补丁。
(a) Class
(b) Relational元模型
(c) 模型转换程序(片段)
Figure 3. Illustrative example: Class2Relational
图3. 说明型示例:Class2Relational
3.2. 蜕变关系选取
蜕变关系是MT的核心部分,因此将MT应用到模型转换上的关键点在于MR的构造。我们前期的工作已经将MT应用到ATL程序测试以及缺陷定位中 [27] [28]。以此为基础,本文使用以下三类蜕变关系。

Figure 4. Overall framework of AMTRepair
图4. AMTRepair总体框架
1) MR-M:通过更改初始源模型的一些元素属性值来构造衍生源模型,则初始输出和衍生输出中相关元素值相应不同。
2) MR-A:通过向初始源模型中添加一个元素来构造衍生源模型,则衍生输出比初始输出包含多的元素。
3) MR-D:通过删除初始源模型中的一个元素来构建衍生源模型,则相比初始输出,衍生输出中包含相应多的元素。
针对一个目标ATL程序,AMTRepair应用多个蜕变关系,旨在获得高质量的补丁。
3.3. 变异操作
AMTRepair采用程序变异的方法来生成补丁。我们基于ATL程序的特点,设计了3类变异操作,分别作用于ATL rule的四个主要部分,inElement,OutElement,SM filter condition,以及bindings。
1) 删除操作(deletion, D):删除一条语句或者表达式。
2) 修改操作(Modification, M):修改语句的部分表达式。对于inElement或者outElement,修改主要在子元素(也就是“!”后的部分)上进行,而对于bindings,修改操作用于赋值运算符“<-”右边的表达式。
3) 插入操作(Insertion, I):插入一条语句或者表达式。

Figure 5. Mutation operations against ATL programs
图5. 针对ATL程序的变异操作
图5为我们截取实验中被测程序的片段,其中我们标记了对程序进行的变异操作所对应的位置及变异方法。
3.4. 基于随机搜索的补丁生成
AMTRepair应用随机搜索来驱动补丁生成和验证过程。随机搜索驱动的补丁生成算法如算法1所示。该算法的输入为目标ATL程序P,MTG集合S以及规则可疑度列表L。主要思想为根据可疑规则列表对模型转换程序语句应用变异操作并生成候选补丁,进而利用MT对候选补丁进行验证。如果该补丁通过验证则返回该补丁,否则继续生成其他候选补丁。
Algorithm 1. Random search-based defect repair
算法1. 基于随机搜索的缺陷修复
在一次随机搜索过程中,首先基于给定程序P和错误定位给出的可疑rule列表L来生成候选补丁。即选择被操作rule (可疑度越高的rule有越高的机会被选择)以及相应的操作。一方面,变异操作将对ATL程序中对应位置进行修改,例如删除某个rule中的一条语句,在满足语法要求的情况下生成新的程序(第3行)。另一方面,crossover操作将结合所生成的候选补丁进行重组,以生成新的补丁(第10行)。由于这两次选择的随机性,结果的候选补丁candidate中,可能包含一个或者多个修改。每一个候选补丁生成后,MTG集S被用来对其进行评估以确定是否是合格的补丁(5行和14行)。我们的评估标准是:满足S中所有的MTG的补丁为一个合格补丁。当一个合格补丁被生成,整个补丁生成过程结束。否则,以上过程一直重复直至所有的可能候选补丁都被生成并被验证。
3.5. 原型工具实现
我们实现一个原型工具AMTRepair。AMTRepair主要基于Java开发,融合了ATL模型转换的执行、追踪等机制。AMTRepair主要包含以下部分。
1) 自动化蜕变测试框架。基于给定蜕变关系和目标程序,自动实施蜕变测试。一方面,实现3.2章所设计的蜕变关系,实现衍生模型的自动生成,以及初始、衍生目标模型的自动化检查。另一方面,基于ATL engine和ATL core API实现从java中直接运行ATL程序。
2) 基于频谱的错误定位框架。一方面,选取并实现Tarantula公式 [29] 来进行规则可疑度的计算。另一方面,应用ATL模型转换Trace mechanism [30] 收集ATL程序运行时的覆盖信息,从而实现错误定位。
3) ATL语句自动化变异操作。利用parser实现ATL程序文件到ATL模型的转换,在次基础上实现各类变异操作。

Figure 6. Mutation operations against ATL programs
图6. 针对ATL程序的变异操作
AMTRepair的操作界面如图6所示。左边是显示缺陷修复过程中的一些重要信息,右边包含进行缺陷修复所需要的一些配置信息。用户可以在界面右侧输入错误程序的路径位置,设置的MR的数量,使用的测试用例的数量以及修复的程序的编号这些信息。点击start后该工具开始运行并在左侧展示信息。首先会展示此时正在修复的程序的位置、该程序违反的MR的数量以及错误定位所确定的该程序中规则的可疑度列表等基本信息。此外,紧跟着会展示当前进行变异操作的位置,即针对哪些规则进行变异操作,以及生成的候选补丁的数量及被验证通过的补丁的保存位置等详细信息,方便用户实时了解修复过程中的每个阶段及相关信息。
4. 实验结果分析
我们开展实验来评估AMTRepair修复错误的能力。本节报告了我们的实验结果,并展示了基于实验结果进行进一步的分析。
4.1. 实验设计与配置
4.1.1. 目标程序
实验选择3个公开的ATL项目作为研究对象:Class2Relational [9],Class2Table [31],BibTex2DocBook [14]。Class2Relational和Class2Table均实现了从Class模型到Relational Table模型的转换。BibTex2DocBook实现了从BibTeXML模型到DocBook组成文档的转换。其中,BibTeXML是BibTeX书目工具的一种基于xml的格式,而DocBook是一种基于xml的文档组合格式。3个项目的具体信息如表1所示。基于3个项目,我们一共针对70个错误ATL程序进行缺陷修复。
4.1.2. ATMRepair配置
ATMRepair的输入包含被测错误程序、可疑度列表以及MTG。而MTG的构造则使用了3.3节中的蜕变关系来生成。ATMRepair利用变异操作来生成候选补丁。在3.4节中我们介绍了三大类变异操作,我们使用了这三大类变异操作中共9种变异操作,具体如表2所示。对于每一个目标程序,我们通过随机测试模型生成方法为其准备100个初始源模型,并一个用对应的蜕变关系来构造相应的衍生源模型。

Table 1. Information of target programs
表1. 目标程序信息

Table 2. Information of mutation operator
表2. 变异操作信息
4.1.3. 补丁评价方法
为了评价AMTRepair的修复效率,我们参照相关工作统计它所生成的补丁数量及正确补丁数量 [16] [17]。在验证补丁时我们设定的是生成的补丁能否通过所有的测试用例,如果通过,则认为是成功生成补丁。然而在这些补丁应用的程序中,存在通过所有测试用例但其实并未完全正确修复的情况。因此为了客观评价程序实验的结果,我们会对程序进行进一步的查验,人工地去分析判断最后程序是否被成功修复,以此分析AMTRepair的有效性。
4.2. 实验结果
我们利用AMTRepair对每一个错误版本进行修复,修复结果统计在表3中。我们在进行数据统计时将修复程序的个数分为被修复的个数和被正确修复的个数两个部分。其中,被修复的个数指的是生成的补丁能够通过所有的测试用例所修复的程序个数。而通过人工检查,在被修复的程序中被正确修复的程序个数,我们统计为被正确修复的个数。从表3可以看出,对于目标程序BibTeX2DocBook,修复率(被修复个数/错误版本数)为50%,正确修复率(被正确修复的个数/错误版本数)为20%,其中正确修复个数占修复个数的40%;程序Class2Relational修复率和正确修复率约为60%和47%,其中正确修复个数约占修复个数的78%;Class2Table中修复个数约占总数的47%,正确修复率为40%,正确修复数大约占修复数的86%。总体来看,AMTRepair可以修复大约51%的错误版本,其中正确修复的补丁占总体的30%,占修复个数约58%。
图7则展示了一个错误转换程序的修复案例,其中图7(a)为错误程序,我们可以看到该程序的错误发生在“name <-a.name”语句,它的正确版本应该是“name <- a.name + 'Id'”。而经过我们的工具修复,成功生成了修复补丁,如图7(b)所示。该补丁在该语句所在的rule中添加了语句“name <- a.name + 'Id'”,而这也成功通过了所有的测试用例,返回为修复版本。正如4.1中最后讨论的那样,存在一些被修复但并未正确修复的情况,这一般是因为此次修复恰好通过了所有的测试用例,但实际它修复的位置可能不正确,甚至并未进行任何修复,因此我们需要对修复结果进行人工验证。
在后续对实验结果进行进一步分析时,我们发现除了那些正确修复缺陷程序的补丁外,那些通过指定的测试用例但并未完全修复错误程序的候选补丁并非是无用的,相反他们可以为开发人员在修复程序缺陷时提供一定的帮助。同时我们还发现,程序缺陷修复的正确率同时受到程序本身错误类别的影响,一方面是因为变异操作还不能完全覆盖程序所有的错误类别。因此无法生成正确的修复补丁;另一方面则是由于程序本身的结构或者错误点的特殊性导致测试用例无法发现该错误或修复无法达到该位置。此外实验结果显示,错误定位的准确性也影响着程序修复的效率。
(a)
(b)
Figure 7. Patch repair in Class2Table
图7. Class2Table补丁修复
5. 相关工作
在软件开发过程中,诸如需求上的理解错误、开发者本身的操作问题或者经验不足等原因,使得软件缺陷难以避免。这些缺陷可能会导致正在运行的软件发生错误甚至崩溃,从而带来严重的损失。因此,为了保证开发的软件质量,研发人员希望在没有人为干预的情况下自动修复缺陷,并通过设计高质量的测试用例来尽可能多的发现程序中的缺陷,这便是自动缺陷修复或自动补丁生成技术。此类技术的最终目的就是自动生成正确的补丁,以达到修复软件中的错误。
目前,程序自动修复大致分为两类:基于测试用例的程序错误修复和其他类型的程序错误修复 [32]。本文基于测试用例的程序错误修复。该修复技术的输入是待修复的程序和测试用例,基本过程为利用错误定位技术定位程序错误的位置,然后根据对应错位位置生成候选补丁,最后对候选补丁进行验证。由此可见,自动缺陷修复离不开错误定位技术的支持。往往错误定位技术的高准确率能够很大程度的提高自动缺陷修复的效率。
然而,针对模型转换程序的缺陷修复研究仍然处于雏形阶段。2015年,基于对模型转换程序实现过程,特殊性的观察和理解,Sánchez等发现大多数的模型转换程序实现过程中都需要手动的输入相关模型的特征(如属性等),而这一过程很容易引起语法错误。由此,他们洞差到自动化修复模型转换程序对于MDE领域的重要性,并提出一种快速修复ATL模型转换语法错误的方法 [33]。为了生成补丁,该方法对检测到的语法错误进行分类,并为每一类的错误提供预定义的修复模板。考虑到同一种错误可能可以通过不同的方法来修复,Sánchez等进一步扩大了错误分类,并引入可预测性分析方法来对可能的补丁进行排序 [15]。同样针对ATL模型转换程序的语法错误,VaraminyBahnemiry等提出将补丁看作是一系列编辑操作的序列,而缺陷修复需要满足两个目标,一是尽可能减少错误的数量,另外一个是保留模型转换的预期行为 [16]。基于这个思想,他们将缺陷修复转化为多目标优化问题,通过应用变异操作符来构造不同的候选补丁,并应用进化算法探索并选择满足目标的候选补丁。最后,通过定义四种不同的启发式规则来改善候选补丁以增加它们与修复目标的匹配度。
2021年,以自动化修复ATL模型转换的语义错误为目标,VaraminyBahnemiry等 [17] 进一步基于进化算法提出了解决方案。他们利用示例输入–输出模型来代表模型转换的预期行为规约,并旨在为给定模型转换程序生成满足预期行为规约的补丁。针对9类语义错误,他们相应的提出了11种修改操作。整个缺陷修复过程基于进化算法,在每次迭代中通过利用预定义的遗传算子来生成下新的下一代候选补丁,每一个候选补丁通过一个fitness函数来计算一个质量评分。鉴于需求改变及模型转换进化带来的问题,Rodriguez-Echeverria等提出利用基于contracts的测试方法来检测和修复该类问题,进而为开发者提供一系列候选的修复操作 [34]。此方法需要开发者手工的按照contracts的方式来说明模型转换的预期行为,进而自动化的从contracts中抽取出Oracles,最后通过比较分析模型转换执行轨迹和测试结果来推荐可行的修复操作。
现有的研究工作为自动修复模型转换程序奠定了良好的基础。然而,不管是从目前所覆盖的错误范围,亦或是从技术应用推广的角度,针对模型转换的缺陷修复工作仍存在诸多局限。一方面,面向模型转换的缺陷修复技术有待进一步发展和精进。目前针对模型转换的缺陷修复技术仍然处于发展的初期,当前工作所考虑的补丁生成方法不够全面。此外,当前的方法主要采用人工定义规约或者已有的示例输入–输出来扮演Oracle的角色,在应用上有一定的局限性。从修复效率、性能及应用的角度出发,需要进一步考虑对缺陷修复每个阶段的优化策略,以及融合适合的方法来提升修复效率和修复性能。
6. 总结
如今软件应用发展日渐复杂,其中基于模型驱动的软件开发因其能很好地适应多变的需求和复杂的环境而逐渐受到更多的应用。而正如我们之前所讨论,决定基于模型驱动的软件质量的关键是模型转换的正确性,而模型转换的过程实质就是模型转换程序在模型转换平台上的实现过程。因此,保证软件质量的根本就是保证模型转换程序的质量。模型转换程序存在测试Oracle问题,本文基于已有的针对普通程序和模型转换程序的相关工作,对此类问题进行分析,提出结合蜕变测试的方法来解决Oracle问题。本文提出了一种程序缺陷修复工具ATMRepair,该工具利用错误定位方法生成的可疑度列表生成候选补丁,并基于随机搜索的思想对补丁进行测试,直到找到正确修复版本。最后我们通过实验分析说明了该工具在模型转换程序上的可行性和有效性。
虽然AMTRepair在一定程度上可以修复模型转换中存在的缺陷,但是在实验过程中我们也发现该工具存在着一定的局限性,例如其修复的概率和种类受到错误程序的类型的影响。因此在后续工作中,我们需要对该方法作进一步的分析和改进,对实验结果进行更深入的研究。此外我们还将进一步细化针对ATL的变异操作,以使得AMTRepair可以应对更多类型的错误;另一方面,我们将进一步开展大量的实验来展示AMT-Repair的修复能力和效率。
基金项目
国家自然科学基金项目(No.61802349);浙江省自然科学基金项目(LY20F020021)。