cN43—1258/TPISSN1007—130X计算机工程与科学COMPUTERENGINEERING&SCIENCE2012年第34卷第2期V01.34,No.2,2012文章编号:1007—130X(2012)02—0150—09一种基于UML状态图的规约变异测试方法AnApproachTestingBasedtoonSpecificationtheMutationUMLStateDiagram米磊。贲可荣MILei,BENKe-rong(海军工程大学计算机工程系。湖北武汉430033)(DepartmentofComputerEngineering,NaValUniversityofEngineering,wuhan430033-China)摘要:规约变异测试从软件功能的角度,对规约进行分析,从而揭示规约中存在的问题。本文提出一种基于UML状态图的变异测试方法,针对每种变异算子,分析其是否会引入冲突,进而有效避免不合理的变异操作;分析了每种变异算子产生等价变异体的条件,能够在生成变异体的同时检测并移除等价变异体,进而减少其对测试过程的影响;给出了杀掉每种变异体所需满足的条件,可在此基础上产生杀掉特定变异体所需的测试用例,从而提高测试用例集的质量。在此基础上,根据变异算子的实际功能,整合了功能相同的算子,减少了变异算子的数量,从而进一步降低了变异测试的开销。实验结果表明,本方法能够较好地提高测试用例的质量,进而提升测试的效率。Abstract:Specificationmutationtestinganalyzesthespecificationfromtheperspectiveofsoftwarefunc—tions,andcanrevealtheerrorsinthespecification.Inthispaper,anapproachtomutationtestingbasedintroducedtoontheUMLstatediagramisproposed.Foreachmutationoperator,aconflictamlysisisavoidcanunreason—ablemutation.Theconditionofthegenerationofequivalentmutantsisanalyzed,sothesemutantscanbedetec—tedintheimplementationoftesting,andtheimpactmadebythesemutantsconditionofgeneratingtheoperatorsaccordingtesttocasesbereduced.Then,therequiredanforthemutantsisalsoanalyzed.Basedcanonthebasis,thereiscostintegrationoftheinclusionrelationamongthem,whichcanreducetheofthemutationtesting.effectively,andin—Theexperimentshowsthattheproposedapproachcreaseimprovethequalityofthetestcasestheefficiencyofthemutationtesting.关键词:变异测试;UML;状态图;变异算子;等价变异体Keywords:mutationtesting;UML;statediagram;mutationoperator;equivalentmutantdoi:10.3969/j.issn.1007—130X.2012.02.028中图分类号:TP311.5文献标识码:A生新的程序,这些新产生的程序可称之为变异体。1引言变异测试‘11是一种面向缺陷的软件测试方法,每一个变异体都有针对性地模拟了系统中各种可能的缺陷,并寻找能够识别这些变异体的测试用例集,用于改进测试用例集的质量,从而提高测试的效率。变异测试可很好地揭示软件缺陷,也可用来通过使用变异算子对程序进行细微的语法变动,产+收稿日期:2011一02一z3;修订日期:2011一05—25基金项目:国家预研基金资助项目(513270104)通讯地址:430033湖北省武汉市海军工程大学计算机工程系软件工程教研室Addl屯ss:Sectionof430033,P.R.ChinaSoftwareEngineering,DepartmentofComputerEnginee“ng,NavalUniversityofEngineering,Wuhan,Hubei万方数据米磊等:一种基于UML状态图的规约变异测试方法评估测试用例集的质量,以及评价测试的充分性。规约变异测试是变异测试的延伸,通过对规约做合乎语法的变更产生变异体,并通过寻找杀死这些变异体的测试用例,来增强已有测试用例集揭示规约中缺陷的能力。同时,也可以基于变异体生成测试用例,用以检测规约与实现代码间的一致性[2|。在实际测试项目中,往往存在着软件规约不明确或不完整等问题,这些规约中问题如不及时发现并修正,随着时间的推移将会产生越发严重的影响,消耗大量不必要的资源。同时,依据这些规约设计的测试用例质量也会较低,进而影响着测试的效率。因此,可采用规约变异测试解决这些问题。UML状态图是一种应用较为广泛的规约描述方法,主要用于描述一个对象在其生存期间的动态行为与状态变迁,在软件分析和设计建模中占有重要地位[3]。因此,本文将UML状态图作为研究的对象。与程序变异类似,在对规约进行语法上的微小变化后,生成的变异体可能在语义上与原规约保持一致,可称这种变异体为等价变异体。它们无法用测试用例进行标识,这就造成在变异测试过程中,针对存活变异体生成测试用例时,会因为等价变异体的存在而造成不必要的资源开销。已有研究表明,在变异体产生后对其检测,将会造成较多的资源开销,而且随着测试规模的增加,这种开销也不断攀升,因此等价变异体是制约变异测试效率的重要因素之一[4]。然而在已有研究工作中缺少关于等价变异体的分析,降低了变异测试的可操作性。本文在已有工作基础上,给出状态图的变异算子的定义,并针对每种变异算子是否会引发冲突,是否会产生等价变异体,以及杀掉相应变异体所需满足的条件等问题进行深入分析,从而提高变异测试的可操作性,并能够在生成变异体的同时检测其是否为等价变异体,降低其对测试效率的影响。2相关工作变异算子的定义是变异测试至关重要的问题之一[引。Fabbri等‘63提出了基于状态图的变异测试方法,给出了一组变异算子,涵盖了部分状态图的元素。Li等‘73针对状态、输入输出、跃迁等相关错误设计变异算子,主要包含跃迁丢失、跃迁冗余、万方数据151初始状态变更等共11种变异算子,并给出从已有测试用例集中,选择能够杀死变异体的测试用例的方法。Trakhtenbro[8]针对嵌入式实时交互系统的状态图定义了包括继承关系、正交跃迁及时间性等在内的变异算子,可以模拟时间延迟、继承关系变更等错误。Hierons等凹3则针对概率状态图设计了相应的变异算子,可以模拟概率变化、变更初始状态、变更跃迁的目标状态以及增加跃迁共四类错误。为了简化测试过程,Belli等[1叩将状态图简化为有向图,即将状态看作有向图中的结点,跃迁看作有向图中的边,不考虑跃迁的触发事件与监护条件。在此基础上,定义了结点增加、结点缺失、边增加以及边缺失4种变异算子。上述工作从不同的侧面定义了相应的变异算子,但这些定义存在一定的片面性,例如Li等给出的变异算子中未涉及跃迁监护条件变异以及增加非初始/终止状态变异等算子,而Belli等的工作中仅包含4种变异算子。此时,变异过程无法模拟未涉及方面的错误,从而降低了变异测试揭示错误的能力。同时,部分变异算子在功能上与其他算子相互重合,其产生的变异体对测试贡献很小,却会增加较多的资源开销,因此需要在定义算子后,对这些算子进行整合。但已有工作很少涉及这部分内容。如果将这些问题遗留到变异测试后期分析与处理,则会增大测试的复杂度。本文基于状态图包含的基本元素,设计相应的变异算子,同时分析了每一种变异算子产生无效或等价变异体的条件,可以在执行变异算子的同时移除相应变异体,从而可以降低测试开销。同时整合了功能重合的变异算子,进一步提高了变异测试的效率。3UML状态图变异算子3.1UML状态图UML状态图由状态和跃迁构成,状态图中的每一个状态是可达的。初始状态是对象的初始状态,而终止状态是对象的最后状态,代表一个状态图的终止点。跃迁使对象从一个源状态到达一个目标状态,源状态和目标状态可以相同,一个跃迁由触发事件、监护条件以及动作三部分组成。当系统处在某一个状态时,如果触发事件被接受,且监152护条件的值为真,则这个跃迁被触发,并执行这个跃迁的动作,同时跃迁的目标状态变成当前状态。前提假设:(1)不存在不确定性的状态转换,即当系统离开某状态时能且只能满足一条跃迁的触发事件与监护条件,否则认为状态图中存在跃迁冲突。由于本文涉及的变异测试旨在评估规约及测试规约的用例质量,因此生成的变异体也应满足本假设,所以在特定变异操作后需要进行冲突检查,若存在冲突则停止该变异操作,否则接受该变异操作。(2)不考虑状态图的层次性。本文主要考虑状态图在单元测试中的应用,即对非组合的类或对象进行建模,因此暂不涉及嵌套状态图的分析。基于上述假设的前提下,UML状态图可表示成D一<S,T,E,A,a,p,y,艿,p>,其中:(1)S为状态图D中状态的集合,s。为初始状态,&表示终止状态;(2)T为状态图D中跃迁的集合;(3)E为触发跃迁的事件集合;(4)A为触发跃迁后的动作集合;(5)a:T—S,对于任一跃迁f∈丁,a(z)表示£的源状态;(6)p:r+S,对于任一跃迁£∈T,p(£)表示£的目的状态;(7)y:T_+E,对于任一跃迁£∈T,y(£)表示触发£的事件序列;(8)艿:了、A,对于任一跃迁£∈T,d(£)表示£触发后的执行动作集合;(9)p:T至表达式r的映射,对于任一跃迁£∈T,p(£)表示£所需满足的监护条件r。类似地,通过改变D中元素生成的变异体M也可以表示成M一<s7,T7,E7,A7,a7,∥,y7,艿7,ID7>的形式。变异算子根据其改变的元素可分为跃迁变异、状态变异、触发事件变异、监护条件变异以及动作变异。3.2跃迁变异通过在D中增加、删除或变更一个跃迁产生变异体M,主要包含以下变异算子:(1)跃迁增加。通过在D中增加一个跃迁£7产生变异体M。由于增加跃迁可能会引入跃迁冲突,因此需要进行冲突检查。当不存在跃迁冲突时,可生成覆盖状态口7(£7),且满足y7(£7)与JD7(£7)的测试用例来杀掉M。若在状态口7(£7)下,y7(£7)万方数据计算机工程与科学2012,34(2)与或p7(£7)不可满足则M为等价变异体。(2)跃迁删除。通过在D中删除跃迁£i∈T产生变异体M,这使得覆盖状态口(£i)且满足y(f。)与p(£i)的用例能够在D中正确执行,却无法在M中正确执行,因此可以用其杀掉M。(3)跃迁变更。在D中改变跃迁£i的源状态口(£i)或目的状态口(£;)产生变异体M,分为以下情况:①改变屯的源状态a(£:),即存在某状态s7∈S且s7≠口(£i),使得口7(£i)一s7。此时,对于状态s7而言,相当于增加一条跃迁,因此应进行冲突检查。当不存在跃迁冲突时,执行覆盖状态a(£i)且满足y(屯)与p(友)的测试用例可以杀死M。②改变£i的目的状态口(f,)。此时,执行覆盖状态a(£。)且满足y(£i)与p(£。)的测试用例可以检查出M与D的差异。③交换跃迁£i的源状态口(≠i)与目的状态口(£。),即转换fi的方向。与情况①类似,首先要进行冲突检查。当不存在冲突时,执行覆盖状态口(岛)且满足y(£i)与p(岛)的测试用例可杀掉M。3.3状态变异通过在D中增加、删除或变更一个状态产生变异体M,主要包含以下变异算子:(1)状态增加。通过在D中增加状态s7产生变异体M,分以下情况:①s7为初始状态,同时需要增加跃迁£7,使得口7(£7)一s7。由于初始状态仅起到标识作用,即指示对象开始状态迁移前所处的状态。因此在D中增加初始状态s7,相当于增加跃迁£7,使得口7(£7)一s。。由于初始状态触发的跃迁通常是无条件跃迁,此时增加新的跃迁会引入跃迁冲突,所以应停止该变异操作。②s7为终止状态,同时需要增加跃迁£7,使得∥(f7)一s7。与情况①类似,终止状态也仅标识状态跃迁的停止,因此本变异操作相当于增加跃迁f7,使得∥(£7)一%可按3.1小节增加跃迁操作进行处理。③s7为其他状态时,同时需要增加跃迁£7与£”,使得口7(£7)一s7且口7(,)一s7。若,未引入冲突,则生成覆盖s7且能触发t”的测试用例即可杀死变异体M。(2)状态删除。通过在D中删除状态si∈S产生变异体M。在移除si的同时,需将以其为源米磊等:一种基于UML状态图的规约变异测试方法状态或目的状态的跃迁一并移除。该操作使得原本覆盖状态s。的跃迁路径发生变更,因此执行覆盖si的测试用例将无法正确结束,从而揭示出M与D的差异,导致M被杀。(3)状态变更。通过变更状态si∈S产生变异体M。状态包括入口动作、活动、内部转换以及出口动作等内容,可将状态的变更细化为对应项的变更。此时,执行覆盖s。的测试用例可以检测出M。3.4触发事件变异通过增加、删除或变更D中某跃迁的触发事件产生变异体M,主要包含以下变异算子:(1)触发事件增加。通过为D中跃迁£:∈丁增加触发事件e7产生变异体M,分为两种情况:①y7(岛)=y(岛)^P7,该操作增强了岛被触发的约束,使得£i有可能在满足y(£;)的情况下无法被触发,因此原可以触发跃迁£。的测试用例无法在变异体M中正确触发跃迁£i,从而可用其杀死M。若处于状态a7(反)时,y(£。)实现时P7也同时实现,则M为等价变异体。②y7(岛)一y(£i)VP7,则该操作弱化了£i被触发的约束。若新增e7后,存在跃迁£i,使得口7(岛)一a7(£i)且y7(£;)与y7(‘,)、p7(£。)与p7(£,)可同时被满足,则执行该变异操作会使得对象处于状态a7(£i)时,可同时触发跃迁£i与£i,从而产生冲突,因此需要进行冲突检测。当不存在跃迁冲突时,可通过增加测试用例来杀死M。新增用例应覆盖状态口7(£i)且包含事件P7。若处于状态口7(£i)时,P7不可实现,或e7实现时),(£。)也同时实现则M为等价变异体。(2)触发事件删除。通过删除D中跃迁£i∈T的触发事件口。产生变异体M,分为两种情况:①),7(£i)=9或y(£i)一y7(玉)^幻,该操作弱化了£i被触发的约束,与增加触发事件变异情况②类似,需要首先进行冲突检查。当不存在冲突时,可生成覆盖状态口7(岛)且不包含%的测试用例,用以杀死变异体。若在状态口7(£。)下,事件%总是可实现的,则M为等价变异体。②y(岛)一y7(£。)V%,该操作增强了幺被触发的约束。可执行覆盖口7(£i)且仅包含被删除事件%且满足p7(岛)的测试用例杀死M。若在状态口7(fi)下,幻不可实现,则M为等价变异体。(3)触发事件变更。通过改变D中跃迁£i∈T的一个或全部触发事件产生变异体M,此时M中万方数据153£;被触发的约束发生变化,分为四种情况:①用事件P7睡y(£;)替换£。触发事件y(£;)。首先进行冲突检查,当不存在跃迁冲突时,使用覆盖口7(岛)、满足P7与J07(£i)的测试用例,可杀掉变异体M。②若y(£i)可表示成y(£。)一e。^P:,则y7(岛)=P。VP。,相当于弱化了£:被触发的约束,因此需要检查变异后是否存在冲突。当不存在冲突时,使用覆盖口7(岛)、仅包含事件P。(或P。)且满足p’(£。)的测试用例在M与D中执行会产生相异的结果,因而可以用其杀死M。若在口7(岛)下,g。与e。总是同时出现,则M为等价变异。③若),(以)可表示成y(£i)=e。VPz,则y7(£;)=e,^啦,相当于增强了fi被触发的约束。使用与情况②相同的测试用例可以杀掉M。若在口7(£。)下,P。与e:总是同时出现,则M为等价变异。④若存在跃迁£后T使得a(£。)一a(£』)且岛≠£,,则通过交换£i与£j的触发事件产生变异体M,即y7(屯)一y(£』),y7Qf)一y(£。)。在此情况下,使用覆盖a7(£,)且满足y7(£i)与』D7(£i)(或y7(£f)与lD7(£i))的用例可杀掉M。3.5监护条件变异通过增加、删除或变更D中某跃迁的监护条件产生变异体M,主要包含以下变异算子:(1)监护条件增加。通过为D中跃迁£。∈T增加监护条件r7产生变异体M,分为两种情况:①p7(£;)一』D(£。)^r7,该变异操作增强了£。被触发的条件约束,使得£i有可能无法在满足原有条件的情况下被触发,此时原本可触发£;的测试用例无法在变异体上正确执行,从而可以杀死该变异体。若在状态a7(£i)下,p(£;)可满足时r,也可同时满足,则该变异体为等价变异体。②p,(£;)=』D(£i)Vr7,该变异操作弱化了£;被触发的条件约束,因此需要检查是否引入冲突。无冲突时,可通过增加测试用例来杀死M。新增用例需覆盖状态a7(£i),满足y7(岛)及/,但不满足p(岛)。若在状态a7(岛)下,r,不可满足,或者r,可满足时p(£i)也可同时满足,则该变异体为等价变异体。(2)监护条件删除。通过删除D中跃迁£;∈T的监护条件ra产生变异体M,分为两种情况:①ID7(£;)一彩或ID(£i)一JD7(£。)^“,该操作使得触发£i的条件约束被弱化。需要进行冲突检154查,当不存在冲突时,生成覆盖状态a7(fi)且仅满足』D7(£;)与77(£;)的测试用例,用以杀死变异体。若在状态口7(£i)下,n总是可满足的,则M为等价变异体。②lD(£。)一JD7(£i)V“,该操作使得触发£i的条件约束被增强。此时,覆盖状态a7(fi)且仅满足“与y7(£。)的测试用例可杀死M。若在状态口7(£,)下;“总不可满足,则M为等价变异体。(3)监护条件变更。通过改变D中跃迁fi∈T的监护条件p(£,),使得£i被触发的条件约束发生变化,从而产生变异体M,分为以下情况:①用r7监护条件|0(£,)。首先进行冲突检查,当不存在跃迁冲突时,可以使用覆盖状态口7(£。)、满足r7与y7(£:)的测试用例杀掉M。若r,八.0(岛)恒成立,则M为等价变异体。②若ID(£i)可表示成JD(£。)一n八r2,则lD7(£:)一r。Vr。,此时触发£;的约束被弱化,需要进行冲突检测。当无跃迁冲突时,使用覆盖口(£,)且仅满足r-与y(£:)(或者r:与y(£i))的测试用例可以杀掉M。若在口(£。)下,r。与r。总是同时成立,则M为等价变异体。③若』D(£i)可表示成lD(£。)一r,Vr2,则JD7(£。)一r。^r。,此时触发£i的约束被增强,使用与情况②相同的测试用例可以杀掉M。若在口(£。)下,r,与r。总是同时成立,则M为等价变异体。④若存在跃迁£7∈T使得口(£:)一a(£,)且£i≠‘f,则交换£。与£,的监护条件,即107(£i)一ID(£i),lD70i)一lD(£i)。此时,使用覆盖口7(岛)且满足lD7(£i)与y7(£;)(或JD7(£,)与7/(f,))的用例可杀掉M。3.6动作变异通过增加、删除或变更D中某跃迁的动作产生变异体M,主要包含以下变异算子:(1)动作增加。通过为D中跃迁£i∈T增加动作口7产生变异体M,其中艿7(£i)一艿(岛)U{口7)。(2)动作删除。通过删除D中跃迁£;∈T的动作n。∈艿(£。)产生变异体M,其中艿7(fi)=艿(幺)一{口d)。(3)动作变更。通过用动作口。∈艿(£。)替换D中跃迁£;∈T的动作口。∈d(£i)产生变异体M,其中艿7(友)一艿(£。)一(n。)U{口。)。上述三种变异均使得对象在触发跃迁£i后采取的动作发生变化,因此用可以触发跃迁£i的测试用例来揭示D与M的差异,进而杀死M。万方数据计算机工程与科学2012,34(2)3.7变异算子分析基于上述针对变异算子的分析,可生成如表1所示的分析表。其中“变异算子”分为“变异类型”、“子类型”以及“实际描述”三项内容进行描述;“冲突检查”表示执行相应变异算子后是否需要进行跃迁冲突检查;“等价变异”表示是否会在特定情况下生成等价变异体。对于如跃迁删除等变异算子产生的变异体,能够杀掉这些变异体的测试用例只需能够触发相应的跃迁或覆盖相应的状态,而当测试用例集符合基本测试覆盖准则时,如跃迁覆盖或状态覆盖等,即可包含上述测试用例。也就是说,如果已有测试用例集无法杀掉这些变异体,则表明其不满足相应的测试覆盖准则。因此,可以应用这些变异体评估已有测试用例集是否满足特定准则。在表1中用“覆盖准则评估”来表示相应的变异算子是否具有评估能力。此外,即便已有测试用例集满足相应测试覆盖准则,仍无法杀掉部分变异算子产生的变异体,例如跃迁增加、状态增加等算子。此时,需要生成新的测试用例。也就是说,这些变异算子不考察已有测试用例集是否符合特定的覆盖准则,而是可通过新增测试用例来提升测试用例集的检错能力。因此,在表1中用“提升检错能力”体现变异算子的特点。通过对表1的分析,可得到以下结论:(1)除了“状态增加”中“增加状态s7为初始状态”变异算子外,其他变异算子按照“覆盖准则评估”与“提升检错能力”的值可分为两类。因此,可以依据变异测试的目的,来选择合适的变异算子。(2)“增加状态s7为初始状态”算子由于肯定会引入跃迁冲突,而无法继续变异,因此在实际变异测试中无需选择该变异算子。若增加状态s7为终止状态或其他状态时,会同时增加以其为目标状态的一条跃迁£7,此时若使得D与M都进入£7的源状态,且能够触发£7,则D没有相应的跃迁可执行,而M可以触发跃迁£7进入其他状态,从而可以杀死M。这与对£7源状态执行增加跃迁变异算子的效果相同。因此,在执行过跃迁变异操作后,无需选择增加状态变异操作。(3)由于在状态删除变异中,可将删除状态si的操作看作是删除状态口7(,)的跃迁,的过程,其中∥(∥)一‰因此,当已有变异体中包含了删除状态口7(,)的跃迁,的变异体时,不再需要执行删除状态s。变异。米磊等:一种基于UML状态图的规约变异测试方法表1变异算子冲突检查变异类型子类型跃迁增加跃迁删除155变异算子情况分析表覆盖准则提升检错能力√×××××实际描述增加一个跃迁£7删除跃迁f,∈T改变f。的源状态a(£,)√×评估×等价变异√×√√√√×跃迁变异跃迁变更√×√×××改变£。的目的状态口(“)交换跃迁£:的口(f,)与口(“)增加状态s7为初始状态状态增加状态变异状态删除状态变更增加状态s7为终止状态增加状态s’为其他状态删除状态&∈S变更状态矗∈Sq×√叫×××××√√×××√√××√√√××7,(£。)一y(£;)^e7触发事件增加(e7)y7(f。)一y(fi)VP7√√√√×√√×q√××y7(“)一p或y(“)=77(f。)^%触发事件删除(ea)y(£。)一y7(£;)V幻√√√一触发事件变异用事件e’仨y(“)替换7(f,)若y(£。)一P1^P2,则7/(£。)一P1触发事件变更VP2■√×××q√××√√×若y(f。)一PlV82,则y7(£,)一P1^P2交换同源跃迁£。与£,的触发事件P7(o=P(“)^r,监护条件增加(r,)P7(£,)一P(f:)V√√××√√—q√√√××××r,q一×√q××××××××监护条件删除(“)监护条件变异P,(ff)一p或P(f。)一P7(f;)^“P(f,)一P,(☆)V“用r,替换p(£。)若P(以)一rl^n,则P7(£。)一r1Vrz√q√√√、Jo√√√×××××监护条件变更若P(£。)一nVr2,则一(£。)一rl^r2交换同源跃迁岛与‘j的监护条件动作增加增加动作n7动作变异动作删除删除动作。d动作变更用动作n。硭8(“)替换(4)在动作变异中,如果测试用例覆盖变异跃迁即可杀掉该变异体,而这些测试用例可能与在跃迁变异、触发事件变异或监护条件变异等变异中应用的测试用例重复,所以若某跃迁执行了跃迁变异、触发事件变异或监护条件变异等操作,可不再执行动作变异,因为在此种情况下,后者不再能够提升已有测试用例集的质量。(5)若在执行已有测试用例集后,仍有非等价变异体存活,则需要生成杀死这些变异体的测试用例。在状态变更变异中,测试用例能执行到变异的状态即可杀死相应的变异体,除此之外测试用例需要能执行到变异跃迁的源状态且能够触发变异跃迁。因此,执行到特定状态是这些用例均需满足的条件,而存在较大差异是触发跃迁的条件,为了便于指导后续测试用例的生成,可生成如表2所示的触发跃迁条件表。可以在需要时,依据变异算子的类型选择相应的条件,用于生成所需的测试用例。4实验分析实验设置为分析本文提出的变异测试方法的效果,本节4.1选择实际测试工作中某指控系统的三个子系统作为实验对象。表3给出了三个子系统的相关信息,万方数据156计算机工程与科学2012,34(2)表2触发跃迁条件表变异算子触发跃迁条件变异类型子类型实际描述增加一个跃迁f7跃迁增加跃迁删除跃迁变异跃迁变更7,(f7)^p7(f7)删除跃迁“∈T改变fi的源状态口(岛)改变如的目的状态口(f。)7,(如)^/(“)7,(☆)^/(“)/(“)^/(“)y’(f。)^口7(“)交换跃迁f;的口(fi)与口(☆)状态变异状态变更变更状态以∈S/(f;)一y(f,)^P7y(£f)^p(“)触发事件增加(e7)y7(以)一y(£。)VP’P’^p7(£;)y7(£。)一口或y(如)一y7(“)^ed触发事件删除(%)y(“)一y7(☆)V%%^口7(£。)/(如)^/(“)触发事件变异用事件P7硅y(“)替换’,(£f)若y(£f)=gl^即,则y7(“)一P1VP2F7^7/(“)^∥(以)触发事件变更若),(如)一PlVP2,则y7(£。)一P1^眈(e1^P,(“))V(P2^P7(£,))(P1^P7(“))V(e2^P,(如))(y7(£:)^P7(如))V(7,(o)^/(巧))y(f。)^p(f;)交换同源跃迁“与£,的触发事件P,(“)一P(“)^r,监护条件增加(r7)一(赴)一P(☆)Vr,y7(“)^r,y7(“)^p7(“)^一心y7(f;)^“监护条件删除(“)监护条件变异P,(f,)一D或ID(£f)一P7(£f)^心P(“)一/(f。)V“用r,替换p(“)若P(“)一n^r2,则P7(f。)一nVr2y7(‘f)^r,(7l^y(如))V(’2^y(“))(’l^y(如))V(72^y(如))(y7(“)^P7(“))V(y7(£,)^P7(0))监护条件变更若JD(☆)=rlVr2,则P7(£;)=,1^r2交换同源跃迁£。与£i的监护条件包括系统名称、状态图中状态数与跃迁数以及简要的功能描述。对于每一个待测子系统的状态图,依据状态覆盖与跃迁覆盖准则,生成测试用例,其数量如表4所示。表3待测子系统信息加算子会产生原状态图未包含的状态或跃迁,而基于覆盖准则生成的测试用例无法检测新增的状态或跃迁,肯定无法杀死这些变异体。为避免上述变异体对实验结果的影响,本实验未选择这两种变异算子。表5应用的变异算子及其生成变异体数量表4覆盖准则及其测试用例数量选择跃迁删除、触发事件增加、删除与变更、监护条件增加、删除与变更等7种变异算子,产生相应的变异体,在移除非法或等价变异体后,相应变异体的数量如表5所示。由于跃迁增加与状态增4.2结果分析在变异体中执行测试用例,当变异体产生的行为与原状态图不一致时,则认定变异体被杀,表明万方数据米磊等:一种基于UML状态图的规约变异测试方法测试用例能够揭示被杀变异体所模拟的错误。统计被杀变异体数量,可生成如表6所示的结果。表6不同覆盖准则下杀死变异体的数量依据变异算子类型,统计被杀变异体数量占该类型变异体总数的百分比,可得到如图1所示的实验结果。a通信子系统实验结果b存储管理子系统实验结果100.00%80.00%60.00%一蒜渊零40.Od%20.OO%O.00%c操控子系统实验结果图1实验结果通过分析上述实验结果可发现:(1)本文在3.7小节分析变异算子时指出,跃迁删除变异算子可以用于检测已有测试用例集是否满足跃迁覆盖准则,即满足该准则的测试用例集可以杀死跃迁删除变异体。实验结果显示,满足跃万方数据157迁覆盖准则的测试用例集杀死了全部的跃迁删除变异体,与预期一致。(2)除上一种情况外,其他变异算子产生的变异体均有一定数量的存活,占相应类型变异体总数的20%至75%。这表明已有测试用例集无法检测出存活变异体对应的错误,需要补充新的测试用例,提高其检测错误的能力。而这一实际需求可以通过针对存活变异体生成测试用例的方式实现。这表明本文提出的变异测试方法能够较好地模拟潜在错误并提高测试用例的质量。综上所述,本文提出的变异测试方法在评估与提高测试用例质量方面具有较好的效果,能够保证和提高测试用例检测错误的能力,进而提升测试的效率。5结束语为了提高UML状态图变异测试的可操作性和测试效率,本文给出了较系统的变异算子的定义。针对每种变异算子,分析其是否会引入冲突,并给出产生等价变异体的条件,从而减少不合理的变异过程,而且能够在应用变异算子生成变异体的同时进行等价变异体检测,可以在测试早期识别等价变异体,降低其对测试过程的影响,进而提高了变异测试的效率。此外,本文给出了杀掉每种变异体所需满足的条件,可以用于指导生成杀掉特定变异体所需的测试用例,从而提高测试用例集的质量。最后通过实验说明了本方法的可行性与有效性。本文提出的变异测试方法未考虑状态图嵌套中的变异操作的分析。在今后的工作中,将进一步研究复杂状态图的变异操作,使其可以应用于较高层级的测试中。参考文献:[1]JiaY,HamanMconstruct堍SubtleFaultsus崦Higher0r—derMutationnsting[C]∥Procofthe8thInt’1wo出ngconf0nS0urceC0deAnalysisandM越pulation,2008:249—258.[2]B1ackPE,0kunV,YeshaY.MutationOperatorsforspeci—fications[c]∥Procofthe5thIEEEInt’1confonAutomatedSoftwareEngineering,2000:81—88.[3]章涛,顾庆,陈道蓄.基于uML状态图的测试技术研究[J].计算机科学,2007,34(10):264—267.[4]schulerD,zellerA.(un一)coveringEquivalentMutants[c]∥Procofthe3rdInt’lconfonS0ftwareTesting,verifica—tionandValidation,2010:45—54.[5]0kunV.specificationMutationforTestGenerationandA—nalysis:[PhDThesis][D].universityofMaryIandBaltimore158C0unty,2004.[6]FabbfiPF,MaIdonadosc,s“getaJc.eta1.MutationTestingAp州edtoValidatespeclflcationsBasedonstatech—arts[c]∥Procofthe1othInt’lsymponSoftwareRellabili‘yEnglneering,1999:210—219.[7]I,iJ—H,Daiox.I.iH—HMutatlonAn8lysisforTestingFl—nitestateMachines[c]∥ProcofsecondInt’lsymponElec—tronlcCommefceandSecurity,2009:620—624.[8]Trakhtenb巾tM.NewMutationsforEvaluatlonoftl…ndspecifi∞一lmplementationLevelsofAd。quacymTestingofstatechartsModeIs[c]∥ProcoftheTestjng:AcademicandIndustrialConferencePracticeandResearchTechnIaues-MU—TATIoN,2007:151—160.[9]HieronsRM,MerayoMG.MutationTestIngfromProbabi—llsticandstochastlcFinltestateMachlnes[J].journalofSystemsandS0ftware,2009,82(11):1804一1818[10]BeulF,BeyazltM.AFormaIFrameworkforMutatlonTesti“g[c]∥Procofthe4thIEEEInt’lconfonsecureSoftwareIntegratI…ndReliabilitylmprovement,2010:12l—130.万方数据计算机工程与科学2012,34(2)[11]GrunBJM.schulerD.zellerA.TheIm呻ctofEquivalentMutants[c]∥P巾cofthe4thInt’1workshoponMutatlonAnalysls,2009:192199.米磊(1981一)。男,吉林白城人,博士生,讲师,研究方向为软件测试和故障诊断。E-mil=mileil981@126.comMlI矗,bo…n1981.PhDcandidate.1ecturer.hisresearchinterestsincludesoft—11dfaultdiaznosis.贲可荣(1963一),男,江苏海安人,博士,教授,ccF会员(E200006610S),研究方向为软件工程和人工智能等。E.mailBenkeron908@21cn.comBENKe_m雌.bornin1963,PhD,pro—fessor'ccFmember(E200006610S),hisresearchinterestsincludesoftw8reengineering,andartificialintelligence.