余 恒,賁可榮
海軍工程大學(xué) 計(jì)算機(jī)工程系,武漢 430033
針對模型轉(zhuǎn)換程序的蛻變測試方法研究*
余恒,賁可榮+
海軍工程大學(xué) 計(jì)算機(jī)工程系,武漢 430033
YU Heng,BEN Kerong.Research on metamorphic testing for model transformation program.Journal of Frontiers of Computer Science and Technology,2016,10(7):915-923.
模型驅(qū)動架構(gòu)中模型轉(zhuǎn)換結(jié)果正確與否常常難以判斷(即測試Oracle問題),而蛻變測試通過驗(yàn)證多個(gè)執(zhí)行結(jié)果之間是否滿足蛻變關(guān)系可以部分地解決測試Oracle問題。為有效地解決模型轉(zhuǎn)換測試中的Oracle問題,以UML到Java模型轉(zhuǎn)換程序?yàn)槔?,?yīng)用蛻變測試,依據(jù)轉(zhuǎn)換規(guī)則,從增加、刪除、修改、替換4個(gè)方面設(shè)計(jì)并構(gòu)造出一組蛻變關(guān)系。最后對待測程序植入在實(shí)際測試中常見的兩種錯(cuò)誤,設(shè)計(jì)并執(zhí)行測試用例后驗(yàn)證蛻變關(guān)系,發(fā)現(xiàn)違反了蛻變關(guān)系,暴露出程序缺陷,從而說明了蛻變測試的有效性。
模型轉(zhuǎn)換;軟件測試;測試Oracle;蛻變測試;蛻變關(guān)系
模型驅(qū)動架構(gòu)(model driven architecture,MDA)[1-2]是國際管理組織OMG提出的一種以模型為中心的軟件開發(fā)框架。模型轉(zhuǎn)換是MDA的關(guān)鍵技術(shù)[3],也是MDA的研究熱點(diǎn),它將模型在不同語言或者不同抽象等級之間進(jìn)行轉(zhuǎn)換。在這種方式下,模型能夠自動轉(zhuǎn)換、提取,直到生成最終的軟件代碼。MDA的成功依賴于正確的模型轉(zhuǎn)換程序,因?yàn)殄e(cuò)誤的模型轉(zhuǎn)換程序會導(dǎo)致生成錯(cuò)誤的模型,以致最終生成錯(cuò)誤的軟件代碼。
軟件測試[4]是一種輔助驗(yàn)證模型轉(zhuǎn)換程序正確性的技術(shù)。模型轉(zhuǎn)換測試中一大挑戰(zhàn)就是測試Oracle問題:通常難以獲得模型轉(zhuǎn)換程序的測試Oracle[5]。蛻變測試(metamorphic testing,MT)可以部分解決軟件測試中的Oracle問題[6],它通過檢測輸出之間的某種關(guān)系來測試程序。模型轉(zhuǎn)換測試方法中,MT與其他測試方法最主要的區(qū)別在于:MT通過檢測多個(gè)執(zhí)行結(jié)果之間是否滿足預(yù)先依據(jù)被測程序的功能和性質(zhì)構(gòu)造出來的關(guān)系(即蛻變關(guān)系)來驗(yàn)證程序的正確性,而其他傳統(tǒng)方法焦點(diǎn)在于單一地執(zhí)行輸入和驗(yàn)證輸出。此外,模型轉(zhuǎn)換測試中,蛻變關(guān)系(metamorphic relation,MR)可以根據(jù)非正式的軟件規(guī)格說明書構(gòu)造,而大多數(shù)其他測試方法依賴正式的規(guī)格說明書。
蛻變測試關(guān)鍵步驟和難點(diǎn)是蛻變關(guān)系[7]的構(gòu)造,它將直接影響測試的效果。本文針對UML到Java模型轉(zhuǎn)換程序,依據(jù)轉(zhuǎn)換規(guī)則,從4個(gè)方面設(shè)計(jì)并構(gòu)造出一組蛻變關(guān)系,并通過案例分析說明了蛻變測試的有效性。
模型轉(zhuǎn)換是模型驅(qū)動工程(model driven engineering,MDE)中一項(xiàng)至關(guān)重要的活動[8],它將源模型通過轉(zhuǎn)換程序轉(zhuǎn)化為目標(biāo)模型。一個(gè)典型的模型驅(qū)動框架結(jié)構(gòu)如圖1所示,其中Ma是源模型,Mb是目標(biāo)模型。Ma符合其元模型MMa,Mb符合其元模型MMb。MMa和MMb分別描述了對應(yīng)Ma和Mb的靜態(tài)信息,模型轉(zhuǎn)換過程中,依據(jù)這些信息來引導(dǎo)模型進(jìn)行正確轉(zhuǎn)換。Mt是一個(gè)模型轉(zhuǎn)換實(shí)例,它也是一種模型,符合模型轉(zhuǎn)換的元模型MMt。Ma和Mb分別代表模型轉(zhuǎn)換程序中的輸入模型和輸出模型。
Fig.1 Framework of model transformation圖1 模型轉(zhuǎn)換框架
目前存在很多不同的模型轉(zhuǎn)換語言,ATLAS轉(zhuǎn)換語言(ATLAS transformation language,ATL)是其中一種應(yīng)用最為廣泛的語言[9],本文案例研究使用的UML2Java.atl就是一種基于ATL的模型轉(zhuǎn)換程序,它在ATL Transformation Zoo(http://www.eclipse.org/atl/ atlTransformations)中是一個(gè)開源的程序。
在UML2Java模型轉(zhuǎn)換中,源模型是UML模型,目標(biāo)模型是Java模型,它們分別符合各自的UML和Java元模型,如圖2和圖3所示。為了分析的方便,本文已將模型進(jìn)行了簡化。在UML模型中,DataType代表基本數(shù)據(jù)類型,每個(gè)類都有各自的類名以及一些屬性。在Java模型中,每個(gè)Java類都包含一些方法和域,每種方法都有一種類型作為返回值的類型,每個(gè)域也有各自的類型,它們都屬于一個(gè)Java包。通過修飾符(Modifier)來限定類、方法、域的類型。
模型轉(zhuǎn)換需要制定轉(zhuǎn)換規(guī)則,UML2Java.atl轉(zhuǎn)換規(guī)則非形式化描述如下:
(1)每個(gè)UML包生成一個(gè)Java包,包名一一對應(yīng)。與UML簡單包名不同的是,Java的包名包含了全路徑信息。
Fig.2 Metamodel of UML圖2 UML元模型
Fig.3 Metamodel of Java圖3 Java元模型
(2)每個(gè)UML類生成一個(gè)Java類,它們的類名、所屬包、所屬修飾符均一一對應(yīng)。
(3)每個(gè)UML數(shù)據(jù)類型(DataType)生成一個(gè)Java基本類型,它們的名字、所屬包均一一對應(yīng)。
(4)每個(gè)UML屬性生成一個(gè)Java域,它們的名字、類型、修飾符、所屬類均一一對應(yīng)。
(5)每個(gè)UML操作生成一個(gè)Java方法,它們的名字、類型、修飾符、所屬類均一一對應(yīng)。
使用對象約束語言(object constraints language,OCL)[10]可以對以上規(guī)則進(jìn)行描述,生成對應(yīng)的模型轉(zhuǎn)換程序UML2Java.atl。
可以看出在以上模型轉(zhuǎn)換的過程中規(guī)則并不復(fù)雜,UML描述的類、屬性、操作等概念與目標(biāo)java代碼中的相應(yīng)概念一一對應(yīng),可以通過人工方式逐一驗(yàn)證輸出模型正確性。但是,模型的復(fù)雜程度以及規(guī)則的繁瑣性使得驗(yàn)證模型轉(zhuǎn)換正確性工作量巨大。
與傳統(tǒng)測試方法不同,蛻變測試(metamorphic testing,MT)無需構(gòu)造預(yù)期輸出,通過比較程序執(zhí)行結(jié)果之間是否滿足對應(yīng)的蛻變關(guān)系來測試程序的正確性[11]。蛻變測試的實(shí)用性使得它在一些特定領(lǐng)域中廣泛應(yīng)用。路曉麗等人將蛻變測試方法應(yīng)用于面向服務(wù)軟件的單元測試和集成測試中[12]。姚奕等人利用蛻變測試技術(shù)發(fā)現(xiàn)由于整型錯(cuò)誤產(chǎn)生的隱錯(cuò),有效地提高了檢測整型錯(cuò)誤的效率[13]。在模型轉(zhuǎn)換蛻變測試中,文獻(xiàn)[8]通過類到關(guān)系模型轉(zhuǎn)換特點(diǎn)構(gòu)造了一組蛻變關(guān)系,但該方法僅考慮類模型中的屬性元素,并未考慮其他元素及元素之間關(guān)系對模型轉(zhuǎn)換的影響,構(gòu)造出的蛻變關(guān)系單一。在此基礎(chǔ)上,本文以UML模型到Java模型轉(zhuǎn)換為例,考慮其基本元素及其關(guān)系,從元素增加、刪除、修改、替換4個(gè)方面構(gòu)造出了一組蛻變關(guān)系,并給出了模型轉(zhuǎn)換蛻變關(guān)系一般性構(gòu)造方法。
假設(shè) f是待測程序P的實(shí)現(xiàn)函數(shù)。為了測試P,首先利用一些測試用例選擇策略(如黑盒測試、白盒測試和隨機(jī)測試等)生成測試用例集T={t1,t2,…, tn},集合T中的ti作為原始測試用例?;诤瘮?shù) f的特性,可以構(gòu)造出一些蛻變關(guān)系MRs。對于構(gòu)造的每條MR,均作用于集合T中生成衍生測試用例集,表示為T′={t1′,t2′,…,tn′},(ti,ti′)構(gòu)成蛻變測試組[14],蛻變測試通過執(zhí)行原始和衍生測試用例來檢測它們的輸出之間是否滿足對應(yīng)的蛻變關(guān)系,而不需要構(gòu)造和驗(yàn)證單一測試用例的預(yù)期輸出。
4.1模型轉(zhuǎn)換蛻變測試流程
模型轉(zhuǎn)換蛻變測試的一般性流程如下:首先,通過模型轉(zhuǎn)換規(guī)則構(gòu)造MRs,并設(shè)計(jì)原始測試模型。其次,對于每個(gè)MR,生成基于原始測試模型的衍生測試模型,通過輸入原始、衍生測試模型執(zhí)行模型轉(zhuǎn)換程序,并獲取它們的輸出模型。最后,驗(yàn)證輸出模型是否滿足每條蛻變關(guān)系MR,一旦不滿足,就表明轉(zhuǎn)換程序有誤。
由于UML2Java.atl規(guī)則較為簡單,且對于UML中重要的關(guān)聯(lián)關(guān)系的轉(zhuǎn)換并未給出定義,本文在原規(guī)則[15]基礎(chǔ)上增加UML中隱式一對多關(guān)聯(lián)變換規(guī)則,增加的規(guī)則非形式化描述如下:
(1)重?cái)?shù)為1端。重?cái)?shù)大于1的關(guān)聯(lián)端的類名作為重?cái)?shù)為1端Java類的reference屬性名(每個(gè)關(guān)聯(lián)端類包含指引reference屬性,通過該屬性可以訪問相關(guān)聯(lián)的類),類型為Set,產(chǎn)生Java類的Get方法,返回值類型為Set,參數(shù)為空,該方法用于獲取關(guān)聯(lián)另一端的類;產(chǎn)生Java類的Set方法,返回值類型為void,參數(shù)名為重?cái)?shù)大于1的關(guān)聯(lián)端的類名,參數(shù)類型為Set,該方法用于設(shè)置關(guān)聯(lián)另一端的類。
(2)重?cái)?shù)大于1端。重?cái)?shù)為1的關(guān)聯(lián)端的類名作為重?cái)?shù)大于1端Java類的reference屬性名,類型為String,產(chǎn)生Java類的Get方法,返回值類型為String,參數(shù)為空,該方法用于獲取關(guān)聯(lián)另一端的類;產(chǎn)生Java類的Set方法,返回值類型為void,參數(shù)名為重?cái)?shù)為1的關(guān)聯(lián)端的類名,參數(shù)類型為String,該方法用于設(shè)置關(guān)聯(lián)另一端的類。
4.2蛻變關(guān)系的構(gòu)造
模型轉(zhuǎn)換蛻變測試中最關(guān)鍵的活動在于構(gòu)造基于轉(zhuǎn)換規(guī)則的蛻變關(guān)系。本節(jié)將以UML2Java轉(zhuǎn)換程序規(guī)則為例,構(gòu)造一組蛻變關(guān)系。
UML2Java模型中,Java輸出模型有以下基本元素:基本類型(Type)、屬性(Attribute)、類(Class)、方法(Method)、包(Package)。測試轉(zhuǎn)換程序的正確性是要驗(yàn)證輸出模型中以上基本元素以及多個(gè)類之間的關(guān)聯(lián)關(guān)系是否符合轉(zhuǎn)換規(guī)則。假設(shè)U1、U2分別為原始測試模型和衍生測試模型,它們通過轉(zhuǎn)換程序分別生成對應(yīng)的輸出模型J1、J2。下文將使用X.Y表示模型X中元素Y的集合;X.#Y表示模型X中元素Y的個(gè)數(shù);X.Z¥Y.Z表示X.Z∪Y.Z-X.Z∩Y.Z,其中∪、∩分別為交、并。
基于UML2Java轉(zhuǎn)換規(guī)則,可以構(gòu)造出以下幾種類別的蛻變關(guān)系:
(1)增加原始測試模型中的某些基本元素
MR1.1通過在U1中增加一種基本類型T1得到U2,則
J2.#Classes=J1.#Classes
J2.#Packages=J1.#Packages
J2.#Types=J1.#Types+1
MR1.2通過在U1中類C1中添加屬性A1得到U2。
MR1.2.1若A1不引入新的基本類型,則
J2.#Classes=J1.#Classes
J2.#Packages=J1.#Packages
J2.#Types=J1.#Types
J2.Classes1=J1.Classes1
J2.Attributes¥J1.Attributes=J2.A1
MR1.2.2若A1引入新的基本類型,則
J2.#Classes=J1.#Classes
J2.#Packages=J1.#Packages
J2.#Types=J1.#Types+1
J2.Classes1=J1.Class
J2.Attributes¥J1.Attributes=J2.A1
其中Classes1表示不包含A1的類。
MR1.3通過在U1中類C1中添加操作O1得到U2,O1對應(yīng)U2中方法M1,則
J2.#Classes=J1.#Classes
J2.#Packages=J1.#Packages
J2.#Methods=J1.#Methods+1
J2.Methods¥J1.Methods=J2.M1
MR1.4通過在U1中增加一個(gè)類C1得到U2,且C1屬于P1。
MR1.4.1C1與其他類之間不存在一對多關(guān)聯(lián)關(guān)系,若C1為抽象類(isAbstract),則
J2.P1.#Classes0=J1.P1.#Classes0+1
J2.Classes2=J1.Classes2
J2.#Packages=J1.#Packages
若C1為非抽象類,則
J2.P1.#Classes1=J1.P1.#Classes1+1
J2.#Packages=J1.#Packages
J2.#Attributes>J1.#Attributes
J2.#Types=J1.#Types
J2.Classes2=J1.Classes2
其中Classes0表示抽象類,Classes1表示非抽象類,Classes2表示不包括C1的其他類。
MR1.4.2 C1與U1中C2之間存在一對多關(guān)聯(lián)關(guān)系,且C1是重?cái)?shù)為1的一端,則
J2.#Classes=J1.#Classes+1
J2.#Attributes=J1.#Attributes+2
J2.#Methods=J1.#Methods+4
J2.#Packages=J1.#Packages
J2.C2¥J1.C2={X|X為reference屬性、Get、Set函數(shù)的集合,其中reference屬性類型為String,Get函數(shù)返回值類型為String,Set函數(shù)形參名為C1類名,形參類型為String,返回值類型為Void}
J2.Classes1=J1.Classes1
其中Classes1表示不包括C1和C2的其他類。
MR1.4.3 C1與U1中C2之間存在一對多關(guān)聯(lián)關(guān)系,且C1是重?cái)?shù)為n的一端,則
J2.#Classes=J1.#Classes+1
J2.#Attributes=J1.#Attributes+2
J2.#Methods=J2.#Methods+4
J2.#Packages=J1.#Packages
J2.C2¥J1.C2={Y|Y為reference屬性、Get、Set函數(shù)的集合,其中reference屬性類型為Set,Get函數(shù)返回值類型為Set,Set函數(shù)形參名為C2類名,形參類型為Set,返回值類型為Void}
J2.Classes1=J1.Classes1
其中Classes1表示不包括C1和C2的其他類。
MR1.5在U1中增加一個(gè)包P2得到U2,則
J2.#Packages=J1.#Packages+1
J2.Classes=J1.Classes
(2)刪除原始測試模型中的基本元素
通過刪除與通過增加構(gòu)造的蛻變關(guān)系類似,區(qū)別在于元素個(gè)數(shù)是增加還是減少,在此僅介紹刪除關(guān)聯(lián)端類所構(gòu)造的蛻變關(guān)系。
MR2.1刪除U1中類C1,C1與U1中C2存在一對多關(guān)聯(lián)關(guān)系,且C1為重?cái)?shù)為1的一端,則
J2.#Classes=J1.#Classes-1
J2.#Attributes=J1.#Attributes-2
J2.#Methods=J2.#Methods-4
J1.C2¥J2.C2={X|X為reference屬性、Get、Set函數(shù)的集合,其中reference屬性類型為String,Get函數(shù)返回值類型為String,Set函數(shù)形參名為C1類名,形參類型為String,返回值類型為Void}
J2.Classes1=J1.Classes1
其中Classes1表示不包括C1和C2的其他類。
MR2.2刪除U1中類C1,C1與U1中類C2存在一對多關(guān)聯(lián)關(guān)系,且C1為重?cái)?shù)為n的一端,則
J2.#Classes=J1.#Classes-1
J2.#Attributes=J1.#Attributes-2
J2.#Methods=J2.#Methods-4
J1.C2¥J2.C2={Y|Y為reference屬性、Get、Set函數(shù)的集合,其中reference屬性類型為Set,Get函數(shù)返回值類型為Set,Set函數(shù)形參名為C2類名,形參類型為Set,返回值類型為Void}
J2.Classes1=J1.Classes1
其中Classes1表示不包括C1和C2的其他類。
MR2.3同時(shí)刪除U1中類C1、C2,C1與C2間存在一對多關(guān)聯(lián)關(guān)系。
MR2.3.1 C1、C2與U1中其他類不存在一對多關(guān)聯(lián)關(guān)系,則
J2.#Classes=J1.#Classes-2
J2.#Attributes=J1.#Attributes-2
J2.#Methods=J2.#Methods-4
J2.Classes1=J1.Classes1
其中Classes1表示不包括C1和C2的其他類。以此類推,可以得到同時(shí)刪除n對一對多關(guān)聯(lián)關(guān)系類時(shí)有:
J2.#Classes=J1.#Classes-2n
J2.#Attributes=J1.#Attributes-2n
J2.#Methods=J2.#Methods-4n
MR2.3.2 C1、C2中僅有一個(gè)類與U1中類C3存在一對多關(guān)聯(lián)關(guān)系,則
J2.#Classes=J1.#Classes-2
J2.#Attributes=J1.#Attributes-4
J2.#Methods=J2.#Methods-6
J2.Classes1=J1.Classes1
J2.C3¥J1.C3={X|X為reference屬性、Set、Get函數(shù)的集合}
其中Classes1表示不包括C1和C2的其他類。
MR2.3.3 C1、C2均與U1中其他類存在一對多關(guān)聯(lián)關(guān)系,則
J2.#Classes=J1.#Classes-2
J2.#Attributes=J1.#Attributes-6
J2.#Methods=J2.#Methods-8
J2.Classes1=J1.Classes1
其中Classes1表示不包括C1和C2及與它們相關(guān)聯(lián)的其他類。
(3)修改原始測試模型中的基本元素
MR3.1修改U1中屬性A1(屬性值類型)得到U2,則
J2.#Classes=J1.#Classes
J2.#Packages=J1.#Packages
J2.#Attributes=J1.#Attributes
J2.#Methods=J1.#Methods
J2.#Types=J1.#Types
J2.Attributes1=J1.Attributes1
其中Attributes1表示不包括A1的其他屬性。
MR3.2修改U1中類C1、C2,使得C1與C2之間存在一對多關(guān)聯(lián)關(guān)系,則
J2.#Classes=J1.#Classes
J2.#Packages=J1.#Packages
J2.#Attributes=J1.#Attributes+2
J2.#Methods=J1.#Methods+4
J2.Classes1=J1.Classes1
其中Classes1表示不包括C1、C2的其他類。
(4)交換原始測試模型中的基本元素
MR4.1假設(shè)C1、C2是U1中的兩個(gè)類,它們分別屬于U1中包P1、P2,且它們之間不存在一對多關(guān)聯(lián)關(guān)系,交換C1、C2得到U2,使得U2中C1、C2分別屬于P2、P1,則
J2.P1.#Classes=J1.P1.#Classes
J2.P2.#Classes=J1.P2.#Classes
J2.Attributes=J1.Attributes
J2.#Packages=J1.#Packages
J2.#Types=J1.#Types
J2.Classes=J1.Classes
MR4.2假設(shè)C1、C2是U1中的兩個(gè)類,它們之間存在一對多關(guān)聯(lián)關(guān)系,C1為重?cái)?shù)為1關(guān)聯(lián)端,C2為重?cái)?shù)為n關(guān)聯(lián)端,交換C1、C2得到U2,使得C1、C2之間的關(guān)系為多對一,則
J2.#Classes=J1.#Classes
J2.#Packages=J1.#Packages
J2.#Attributes=J1.#Attributes
J2.#Methods=J1.#Methods
J2.C1¥J1.C1={X|X為reference屬性類型,Get函數(shù)返回值,Set函數(shù)形參類型的集合}
J2.C2¥J1.C2={X|X為reference屬性類型,Get函數(shù)返回值,Set函數(shù)形參類型的集合}
J2.Classes1=J1.Classes1
其中Classes1表示不包括C1和C2的其他類。
注:交換與修改操作本質(zhì)區(qū)別在于交換元素后模型的整個(gè)元素集合中元素或元素關(guān)系不發(fā)生變化,而修改操作會導(dǎo)致元素或元素關(guān)系與修改前不完全一致。
需要說明的是,以上蛻變關(guān)系中各情況的修改均為合法操作,等式兩邊基本元素必須一一對應(yīng)。本節(jié)構(gòu)造出的蛻變關(guān)系覆蓋了模型中的基本元素以及類之間的關(guān)聯(lián)關(guān)系,將以上構(gòu)造出來的蛻變關(guān)系應(yīng)用到基于新規(guī)則的蛻變測試中,若輸出模型J1、J2之間違背了其中任意一條蛻變關(guān)系MRi,則表明模型轉(zhuǎn)換程序出錯(cuò)。
下面以一個(gè)簡化的學(xué)生與學(xué)校關(guān)聯(lián)UML模型為例進(jìn)行分析,如圖4所示。
Fig.4 Simplified UML model of student and school圖4 簡化的學(xué)生與學(xué)校關(guān)聯(lián)UML模型
該UML模型中,學(xué)生類(Student)包含姓名(name)、學(xué)號(number)、班級(class)、年級(grade)基本屬性以及學(xué)分管理(ScoreManagement)、課程管理(CourseManagement)操作,它屬于人員信息包,學(xué)校類包含校名(name)屬性。若轉(zhuǎn)換規(guī)則代碼正確無誤,則該UML模型經(jīng)過變換后,得到圖5所示Java模型。
Fig.5 Java model of implicit association圖5 隱式關(guān)聯(lián)Java模型
下文將通過兩個(gè)模型轉(zhuǎn)換[16]變異分析案例說明蛻變測試的有效性。
變異1刪除轉(zhuǎn)換程序中關(guān)聯(lián)關(guān)系的轉(zhuǎn)換代碼。
根據(jù)蛻變關(guān)系MR3.2,將圖4所示模型作為本次蛻變測試的衍生測試用例模型,它由不包含學(xué)生類與學(xué)校類關(guān)聯(lián)關(guān)系的原始測試用例模型所構(gòu)造,如圖6所示。將圖4、圖6所示衍生、原始測試模型分別通過模型轉(zhuǎn)換程序,得到Java模型J1、J2,通過比較J1、J2,會得到J2.#Attributes=J1.#Attributes,J2.#Methods=J1.#Methods,這一結(jié)果違背蛻變關(guān)系MR3.2中“J2.#Attributes=J1.#Attributes+2,J2.#Methods=J1. #Methods+4”,則通過本次蛻變測試就能暴露出轉(zhuǎn)換程序缺少關(guān)聯(lián)關(guān)系轉(zhuǎn)換代碼的問題。
Fig.6 UML model of student and school without association圖6 不包含關(guān)聯(lián)關(guān)系的學(xué)生與學(xué)校UML模型
變異2刪除代碼中關(guān)于重?cái)?shù)為1端關(guān)聯(lián)類的代碼部分。
原始測試用例使用圖4所示模型,根據(jù)蛻變關(guān)系MR3.2修改學(xué)生類與學(xué)校類,使得學(xué)生類為重?cái)?shù)為1的關(guān)聯(lián)端(實(shí)際中不存在此關(guān)系模型,但僅作為蛻變測試用例是合理的),如圖7所示衍生測試用例模型。
Fig.7 Modified UML model of association of student and school圖7 修改后的學(xué)生與學(xué)校關(guān)聯(lián)UML模型
將圖4、圖7所示原始、衍生測試模型分別通過此程序后,得到Java模型J1、J2。通過比較可以發(fā)現(xiàn),J1 中Student類與J2中Student類之間差異部分為reference屬性、Get函數(shù)、Set函數(shù)的集合,J1中School類與J2中School類之間差異為reference屬性、Get函數(shù)、Set函數(shù)的集合。而蛻變關(guān)系MR4.2中,J2.C1 ¥J1.C1={X|X為reference屬性類型,Get函數(shù)返回值,Set函數(shù)形參類型的集合},J2.C2¥J1.C2={X|X為reference屬性類型,Get函數(shù)返回值,Set函數(shù)形參類型的集合},輸出模型J1、J2之間不滿足蛻變關(guān)系。因此轉(zhuǎn)換程序中缺少重?cái)?shù)為1關(guān)聯(lián)端轉(zhuǎn)換的缺陷將會通過本次蛻變測試被發(fā)現(xiàn)。
關(guān)聯(lián)變換是MDA中模型轉(zhuǎn)換的難點(diǎn)[15],也是容易出錯(cuò)的地方。上文變異分析中植入的變異在實(shí)際模型轉(zhuǎn)換中具有代表性,若對含有上述缺陷的程序使用常規(guī)測試方法,需要將輸出模型中每個(gè)元素里所有參數(shù)進(jìn)行一一驗(yàn)證,這樣測試效率會大大降低,而蛻變測試方法通過比較兩個(gè)輸出模型中差異部分可以有效地提高測試效率。
如第1章所描述,本文介紹的模型轉(zhuǎn)換程序可以通過手工測試來驗(yàn)證其正確性,但實(shí)際應(yīng)用特別是商業(yè)領(lǐng)域中獲取模型轉(zhuǎn)換測試Oracle的代價(jià)高(模型龐大或者轉(zhuǎn)換程序規(guī)則復(fù)雜),而通過蛻變測試比較不同輸出之間是否滿足蛻變關(guān)系可在一定程度上解決這一問題。
隨著面向模型驅(qū)動架構(gòu)的應(yīng)用越來越廣泛,對使用模型轉(zhuǎn)換生成應(yīng)用代碼的軟件開發(fā)工具,模型轉(zhuǎn)換的正確與否影響著最終軟件質(zhì)量的好壞,因此確保面向模型轉(zhuǎn)換程序的質(zhì)量尤為重要。由于獲取模型轉(zhuǎn)換程序的測試Oracle代價(jià)高,本文提出將蛻變測試方法用于UML到Java模型測試過程中,依據(jù)轉(zhuǎn)換規(guī)則,從4個(gè)不同方面構(gòu)造出一組蛻變關(guān)系,并通過案例分析對4個(gè)不同方面的蛻變關(guān)系進(jìn)行了蛻變測試分析,介紹說明了蛻變測試的有效性。未來將重點(diǎn)研究其他面向模型轉(zhuǎn)換程序的蛻變關(guān)系構(gòu)造,比較、總結(jié)這些蛻變關(guān)系之間的聯(lián)系,并進(jìn)一步通過模型轉(zhuǎn)換變異分析,比較各蛻變關(guān)系的有效性。
[1]Papajorgji P J,Pardalos P M.The model-driven architecture approach[M]//Software Engineering Techniques Applied to Agricultural Systems.Springer US,2014:135-178.
[2]Zhu Liming.Model-driven architecture[M]//Essential SoftwareArchitecture.Berlin,Heidelberg:Springer,2011:201-217.
[3]Zeng Yi,Xu Lin,Huang Xingyan,et al.Method of high-order model transformation combined with MDA[J].Application Research of Computers,2012,29(12):4584-4588.
[4]Meenakshi D,Naik J S,Reddy M R.Software testing techniques in software development life cycle[J].International Journal of Computer Science and Information Technologies, 2014,5(3):3729-3731.
[5]Mottu J M,Baudry B,Traon Y L.Model transformation testing:Oracle issue[C]//Proceedings of the 2008 IEEE International Conference on Software Testing Verification and Validation Workshop,Lillehammer,Norway,Apr 9-11, 2008.Piscataway,USA:IEEE,2008:105-112.
[6]Wang Rong,Ben Kerong.Researches on basic criterion and strategy of constructing metamorphic relations[J].Computer Science,2012,39(1):115-119.
[7]Asrafi M,Liu H,Kuo F C.On testing effectiveness of metamorphic relations:a case study[C]//Proceedings of the 2011 5th International Conference on Secure Software Integration and Reliability Improvement,Jeju Island,Korea,Jun 27-29,2011.Piscataway,USA:IEEE,2011:147-156.
[8]Jiang M,Chen T Y,Kuo F C,et al.Testing model transformation programs using metamorphic testing[C]//Proceedings of the 26th International Conference on Software Engineering and Knowledge Engineeing,Vancouver,Canada,2014:94-99.
[9]Jouault F,Allilaire F,Bézivin J,et al.ATL:a model transformation tool[J].Science of Computer Programming,2008, 72(1):31-39.
[10]Cao Liu,Cao Chun.Validation environment of software architecture based on OCL[J].Computing Science,2012,39 (11A):409-414.
[11]Chen Leilei.The optimization of meta-morphic testing based on equivalence classes partition[D].Shanghai:East China University of Science and Technology,2013:6-10.
[12]Lu Xiaoli,Dong Yunwei.Testing of service-oriented software:a metamorphic testing approach[J].Journal of ComputerApplications,2011,31(7):1756-1758.
[13]Yao Yi,Huang Song,Ji Mengyu.Research on the metamorphic testing for integer bugs detection[J].Computer Engineering and Science,2012,34(4):53-56.
[14]Xie Xiaoyuan,Wong W E,Chen T Y,et al.Metamorphic slice:an application in spectrum-based fault localization[J]. Information and Software Technology,2013,55(5):866-879.
[15]Xia Lei,Ouyang Song.Association transformation from UML model to Java model in MDA[J].Computer Engineering and Design,2006,27(16):3078-3081.
[16]Mottu J M,Baudry B,Le Traon Y.Mutation analysis testing for model transfomations[C]//LNCS 4066:Proceedings of the 2nd European Conference on Model Driven Architecture Foundations and Applications,Bilbao,Spain,Jul 10-13,2006.Berlin,Heidelberg:Springer,2006:376-390.
附中文參考文獻(xiàn):
[3]曾一,許林,黃興硯,等.一種結(jié)合MDA的高階模型轉(zhuǎn)換方法[J].計(jì)算機(jī)應(yīng)用研究,2012,29(12):4584-4588.
[6]王瑢,賁可榮.蛻變關(guān)系構(gòu)造基本準(zhǔn)則與策略研究[J].計(jì)算機(jī)科學(xué),2012,39(1):115-119.
[10]曹流,曹春.一種基于OCL的體系結(jié)構(gòu)一致性驗(yàn)證環(huán)境[J].計(jì)算機(jī)科學(xué),2012,39(11A):409-414.
[11]陳蕾蕾.基于等價(jià)類劃分的蛻變測試方法優(yōu)化[D].上海:華東理工大學(xué),2013:6-10.
[12]路曉麗,董云衛(wèi).面向服務(wù)軟件的蛻變測試方法[J].計(jì)算機(jī)應(yīng)用,2011,31(7):1756-1758.
[13]姚奕,黃松,稽孟雨.面向整數(shù)錯(cuò)誤檢測的蛻變測試方法研究[J].計(jì)算機(jī)工程與科學(xué),2012,34(4):53-56.
[15]夏雷,歐陽松.MDA中關(guān)聯(lián)從UML模型到Java模型的轉(zhuǎn)換[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(16):3078-3081.
YU Heng was born in 1991.He is an M.S.candidate at Naval University of Engineering.His research interest is software quality assurance.
余恒(1991—),男,湖北鐘祥人,海軍工程大學(xué)碩士研究生,主要研究領(lǐng)域?yàn)檐浖|(zhì)量保證。
BEN Kerong was born in 1963.He is a professor and Ph.D.supervisor at Naval University of Engineering.His research interests include software engineering and artificial intelligence.
賁可榮(1963—),男,江蘇海安人,海軍工程大學(xué)教授、博士生導(dǎo)師,主要研究領(lǐng)域?yàn)檐浖こ?,人工智能?/p>
Research on Metamorphic Testing for Model Transformation Program?
YU Heng,BEN Kerong+
Department of Computer Engineering,Naval University of Engineering,Wuhan 430033,China +Corresponding author:E-mail:benkerong08@163.com
The results of model transformation of model driven architecture(MDA)are often difficult to judge correct or wrong(that is,test Oracle problem),whereas metamorphic testing partially solves the Oracle problem by verifying whether the result of multiple executions satisfies the metamorphic relationships or not.To solve the Oracle problem of model transformation testing effectively,metamorphic testing is applied to the case of model transformation from UML to Java.Based on transformation rules,a set of metamorphic relations is constructed from four different aspects: add,delete,modify and replace.Finally,two common faults are transplanted in the program under test,the test cases are designed and executed to verify the metamorphic relations.The faults are exposed because the metamorphic relations are violated,which shows the effectiveness of metamorphic testing.
model transformation;software testing;test Oracle;metamorphic testing;metamorphic relations
2015-06,Accepted 2015-08.
10.3778/j.issn.1673-9418.1507050
A
TP311.5
*The National Natural Science Foundation of China under Grant No.61272108(國家自然科學(xué)基金).
CNKI網(wǎng)絡(luò)優(yōu)先出版:2015-08-28,http://www.cnki.net/kcms/detail/11.5602.TP.20150828.1503.002.html