徐亮亮 宋劍鋒 田飛
摘要:為了削弱面向服務(wù)的應(yīng)用系統(tǒng)中業(yè)務(wù)流程對服務(wù)模塊的強依賴關(guān)系,降低系統(tǒng)集成測試階段問題服務(wù)對集成過程的影響,提出了基于模擬服務(wù)的輔助集成測試方法,設(shè)計了面向服務(wù)的輔助集成測試系統(tǒng)模型,以緩解面向服務(wù)的體系結(jié)構(gòu)下系統(tǒng)集成測試階段面臨的巨大壓力。根據(jù)輔助集成測試系統(tǒng)模型中闡述的模擬服務(wù)生命周期以及構(gòu)建模擬服務(wù)的關(guān)鍵過程,實現(xiàn)了系統(tǒng)原型研制并構(gòu)建了SOAP類型模擬服務(wù),驗證了輔助集成測試方法有效性。
關(guān)鍵詞:集成測試;模擬服務(wù);SOAP服務(wù);測試用例;服務(wù)生成
中圖分類號:TP311.52
在面向服務(wù)的體系結(jié)構(gòu)[1](Service-oriented architecture,SOA)下,通過對業(yè)務(wù)單元進行服務(wù)封裝,提高了系統(tǒng)中模塊的復(fù)用率,也解耦了模塊間的相互關(guān)系。雖然應(yīng)用系統(tǒng)被拆分并封裝成服務(wù),但是系統(tǒng)業(yè)務(wù)流程依然對服務(wù)模塊具有強依賴關(guān)系,隨著服務(wù)的增多,導(dǎo)致服務(wù)集成過程變得緩慢而脆弱。首先,服務(wù)間通過網(wǎng)絡(luò)進行通信,不但提高了集成測試環(huán)境的構(gòu)建成本,而且增加了模塊間的調(diào)試難度;其次,采用多團隊或引入第三方單位的合作研制方式,加重了集成測試階段的協(xié)調(diào)工作,通常會由于某個服務(wù)自身存在問題、研制團隊失誤或第三方研制單位的缺席而導(dǎo)致集成測試節(jié)點的延期,最終擾亂整個應(yīng)用系統(tǒng)的研發(fā)過程,為集成測試帶來巨大的壓力[2]。
目前,面向服務(wù)系統(tǒng)的集成測試較多地側(cè)重于單個服務(wù)的接口測試方面[3],以保證服務(wù)接口功能的正確性,從而降低服務(wù)相互間集成時出現(xiàn)問題的概率,但無法從根本上解決集成測試過程中存在的問題。針對這一狀況,本文從輔助服務(wù)間交互測試的角度出發(fā),利用模擬服務(wù)配合被集成服務(wù)完成集成過程,有效地緩解了集成測試階段的壓力。
1 面向服務(wù)的系統(tǒng)集成測試定義
系統(tǒng)集成測試[4],也叫組裝測試或聯(lián)合測試,即將程序模塊采用一次性或增殖方式組裝起來,對模塊間的接口進行正確性檢驗的測試工作。面向服務(wù)系統(tǒng)的集成測試是在面向服務(wù)的體系架構(gòu)下,對應(yīng)用系統(tǒng)中的服務(wù)模塊進行組裝,以驗證各服務(wù)間接口的功能正確性,確保應(yīng)用系統(tǒng)中各服務(wù)間的互聯(lián)互通互操作。
面向服務(wù)的系統(tǒng)集成測試將單個服務(wù)模塊集成到應(yīng)用系統(tǒng)中進行測試,可以是一次性的集成(非增量式集成),也可以是逐個的擴展集成(增量式集成),直到完成整個應(yīng)用系統(tǒng)測試。服務(wù)的集成測試要求被集成的服務(wù)按照設(shè)計要求通過單元測試,保證單個服務(wù)的高質(zhì)量要求,但經(jīng)過單元測試的服務(wù)不足以保證整個系統(tǒng)的質(zhì)量,有許多隱蔽的失效是高質(zhì)量模塊間發(fā)生非預(yù)期交互而產(chǎn)生的,所以服務(wù)集成測試的必要性在于保證能夠單獨工作的服務(wù)連接起來也能正常工作。此外,在某些開發(fā)模式中,如迭代式開發(fā),服務(wù)的設(shè)計和實現(xiàn)是迭代進行的,在這種情況下,服務(wù)服務(wù)集成測試的意義還在于它能間接地驗證概要設(shè)計是否具有可行性。
2 模擬服務(wù)輔助集成測試原理
模擬服務(wù)是一種服務(wù)真實存在的服務(wù)提供者,模擬服務(wù)存在一個或多個被模擬的目標(biāo)服務(wù),模擬服務(wù)對外提供與目標(biāo)服務(wù)相同的服務(wù)接口,兩者對于同一服務(wù)調(diào)用請求(接口調(diào)用參數(shù)相同)返回一致的響應(yīng)結(jié)果。與真實服務(wù)不同的是,模擬服務(wù)不關(guān)心目標(biāo)服務(wù)的業(yè)務(wù)邏輯,僅僅采用請求參數(shù)匹配的方法來得到應(yīng)該返回的結(jié)果數(shù)據(jù),這樣模擬服務(wù)即可替代目標(biāo)服務(wù)及目標(biāo)服務(wù)依賴的所有服務(wù),屏蔽了目標(biāo)服務(wù)的實現(xiàn)細(xì)節(jié)。如圖1所示,某示例應(yīng)用系統(tǒng)中A服務(wù)依賴B和C服務(wù),B服務(wù)又依賴于D和E服務(wù)。
通常在服務(wù)的集成測試過程中,若需對A服務(wù)進行測試,那么必須首先構(gòu)建出A服務(wù)的整顆依賴樹,即B、C、D和E服務(wù)的實例。采用模擬服務(wù)輔助集成測試方法,在A服務(wù)需要進行集成測試時,只需如圖中構(gòu)建模擬B服務(wù)替代B、D、E服務(wù)實例以及用模擬C服務(wù)替代C服務(wù)實例,如此測試環(huán)境中的實例數(shù)量縮減為A服務(wù)、模擬B服務(wù)以及模擬C服務(wù)三個。模擬服務(wù)的應(yīng)用可以輔助和簡化系統(tǒng)集成測試的整個過程,具體會體現(xiàn)在如下四個方面:
(1)簡化集成測試環(huán)境,方便被集成測試服務(wù)組件依賴服務(wù)環(huán)境的部署與搭建;
(2)方便集成測試過程中問題的排查與定位,快速地應(yīng)對突發(fā)情況;
(3)降低服務(wù)集成測試過程對關(guān)鍵服務(wù)的依賴程度,避免如第三方接口、在線集成組件等對測試過程的影響,提高測試的效率;
(4)縮短軟件系統(tǒng)開發(fā)的生命周期[5]。
3 面向服務(wù)的輔助集成測試系統(tǒng)設(shè)計
3.1 輔助集成測試系統(tǒng)模型
輔助集成測試系統(tǒng),用于生成、發(fā)布以及管理用于集成測試的模擬服務(wù),本著自動化構(gòu)建模擬服務(wù)的設(shè)計原則,為用戶提供簡易的操作方法,以應(yīng)對系統(tǒng)集成測試過程中的頻發(fā)狀況。輔助集成測試系統(tǒng)獨立于被集成測試服務(wù),其存在的目的是為被集成測試服務(wù)提供依賴的服務(wù)環(huán)境,如圖2所示,為輔助集成測試系統(tǒng)的模型設(shè)計圖。
輔助集成測試系統(tǒng)負(fù)責(zé)管理模擬服務(wù)的整個生命周期,模型中主要闡述了測試數(shù)據(jù)準(zhǔn)備、模擬服務(wù)生成以及模擬服務(wù)運行三個階段的設(shè)計工作,測試數(shù)據(jù)準(zhǔn)備階段明確了集成測試前應(yīng)準(zhǔn)備的模擬服務(wù)接口用例樣本和樣本任務(wù)編排數(shù)據(jù),模擬服務(wù)生成階段指明了測試過程中模擬服務(wù)的構(gòu)建流程,模擬服務(wù)運行階段設(shè)計了模擬服務(wù)提供服務(wù)的關(guān)鍵過程。
3.2 測試數(shù)據(jù)準(zhǔn)備
系統(tǒng)集成測試前,通常存在一定的準(zhǔn)備時間,用于進行測試環(huán)境的準(zhǔn)備工作。模型中的測試數(shù)據(jù)準(zhǔn)備階段設(shè)定在系統(tǒng)集成測試前,為集成測試過程準(zhǔn)備必要的輔助集成測試數(shù)據(jù),這些準(zhǔn)備數(shù)據(jù)的目的是使得集成測試過程快速而有效,保障集成測試過程的可靠性,做到有條不紊地應(yīng)對突發(fā)狀況。
輔助集成測試系統(tǒng)主要包含兩個方面數(shù)據(jù)的準(zhǔn)備工作,一方面是準(zhǔn)備被模擬服務(wù)的測試用例數(shù)據(jù)(圖2中的服務(wù)接口用例樣本),另一方面是準(zhǔn)備模擬服務(wù)接口用例的任務(wù)編排數(shù)據(jù)。通常情況下,服務(wù)接口在執(zhí)行請求操作時會按照參數(shù)處理、執(zhí)行業(yè)務(wù)和返回響應(yīng)數(shù)據(jù)三個步驟進行,如圖3所示,在輔助集成測試系統(tǒng)中需對應(yīng)準(zhǔn)備請求樣本數(shù)據(jù)、任務(wù)數(shù)據(jù)和響應(yīng)樣本數(shù)據(jù)。請求樣本數(shù)據(jù)和響應(yīng)樣本數(shù)據(jù)為接口的測試用例數(shù)據(jù),并以成對的方式出現(xiàn),數(shù)據(jù)的來源可以是測試用例文檔的提取數(shù)據(jù)、用戶人員的錄入數(shù)據(jù)以及自動生成工具的生成數(shù)據(jù)[6]。任務(wù)編排數(shù)據(jù)用于描述模擬服務(wù)接口在特定的請求樣本數(shù)據(jù)下需要執(zhí)行的一系列任務(wù)信息,如第三方服務(wù)調(diào)用、計時返回等,任務(wù)編排數(shù)據(jù)可以模擬目標(biāo)服務(wù)的功能特性,這一過程需要通過特定的任務(wù)編排工具進行操作。
3.3 模擬服務(wù)生成
在模擬服務(wù)的生成階段中,輔助集成測試系統(tǒng)需要為測試人員提供能夠簡單而快速地構(gòu)建模擬服務(wù)的服務(wù)生成工具,負(fù)責(zé)根據(jù)測試數(shù)據(jù)準(zhǔn)備階段的準(zhǔn)備數(shù)據(jù)創(chuàng)構(gòu)建模擬服務(wù)。
服務(wù)生成工具從被模擬服務(wù)接口的用例樣本出發(fā),篩選出測試結(jié)果表現(xiàn)正常(能夠反應(yīng)被模擬服務(wù)正常情況下應(yīng)具有的請求、響應(yīng)數(shù)據(jù)特性)的用例數(shù)據(jù)作為模擬對象,并且從這些對象中提取模擬服務(wù)接口的元信息用于服務(wù)的構(gòu)建依據(jù)。通常,由于一個服務(wù)接口往往存在多個用例樣本,所以提取出的接口元信息需要通過歸并操作來簡化模擬服務(wù)接口的數(shù)量,這一過程會提高模擬服務(wù)的質(zhì)量及執(zhí)行效率。
輔助集成測試系統(tǒng)提供服務(wù)構(gòu)建器用于根據(jù)提取出的接口元信息生成模擬服務(wù)的接口定義,再將接口的用例樣本匹配邏輯以及任務(wù)執(zhí)行邏輯注入至服務(wù)接口的實現(xiàn)中,即可完成對模擬服務(wù)接口的實現(xiàn)。最后,生成的模擬服務(wù)接口及其實現(xiàn)將經(jīng)過編譯與裝載過程,等待模擬服務(wù)進入發(fā)布階段。
3.4 模擬服務(wù)運行
模擬服務(wù)經(jīng)過生成階段被裝載至內(nèi)存中,而在模擬服務(wù)發(fā)布階段,測試人員只需指定服務(wù)的發(fā)布地址以及綁定端口等部署信息,即可準(zhǔn)備進行模擬服務(wù)的發(fā)布。由于輔助集成測試系統(tǒng)模型中設(shè)計集成了用于發(fā)布模擬服務(wù)的嵌入式服務(wù)容器,所以模擬服務(wù)可以快速地被部署和發(fā)布,嵌入式的服務(wù)容器也更加方便了對模擬服務(wù)的管理工作。
已發(fā)布的模擬服務(wù)由于沒有真實的業(yè)務(wù)實現(xiàn),當(dāng)存在服務(wù)調(diào)用時,模擬服務(wù)執(zhí)行注入的樣本匹配邏輯完成響應(yīng)數(shù)據(jù)的查詢工作,同時在匹配目的用例樣本后,根據(jù)植入的任務(wù)執(zhí)行邏輯完成與用例樣本關(guān)聯(lián)的編排任務(wù),最后將匹配的結(jié)果反饋至服務(wù)調(diào)用處。模擬服務(wù)的運行時序圖如圖4所示。
4 模型應(yīng)用與原型系統(tǒng)實現(xiàn)
面向服務(wù)的體系結(jié)構(gòu)下,基于HTTP協(xié)議的Web服務(wù)作為面向服務(wù)的一種實現(xiàn)方式,已廣泛應(yīng)用于企業(yè)的系統(tǒng)開發(fā)過程,而Web服務(wù)中當(dāng)以SOAP(簡單對象訪問協(xié)議)服務(wù)技術(shù)歷史最為悠久[7]。如圖5所示,為輔助集成測試系統(tǒng)模型的原型系統(tǒng)部署圖,下面將闡述系統(tǒng)中基于HTTP協(xié)議的SOAP模擬服務(wù)的自動構(gòu)建和發(fā)布過程,介紹原型系統(tǒng)的實現(xiàn)細(xì)節(jié)。
4.1 模擬服務(wù)接口提取
SOAP服務(wù)以XML的形式封裝服務(wù)請求消息[8],如圖6展示了用于用戶添加請求的SOAP消息信封,通過協(xié)議綁定技術(shù)該消息將被映射為調(diào)用服務(wù)實現(xiàn)POJO(簡單Java對象)的addUser接口。
輔助集成測試系統(tǒng)采用圖中加黑片段XML數(shù)據(jù)作為服務(wù)接口的一個請求樣本數(shù)據(jù),構(gòu)建名為addUser的POJO方法,其輸入?yún)?shù)為User對象,對象包含name、age和married三個屬性。理想狀態(tài)下,User對象三個屬性的類型分別為String、int和boolean,但是輔助集成測試系統(tǒng)識別三個屬性均為String類型,得到一個擁有三個String類型屬性的User對象,因為基于Document/literal實現(xiàn)的SOAP服務(wù)消息中并不攜帶數(shù)據(jù)的類型信息[9],所以它不影響對象的數(shù)據(jù)綁定,如此簡化了模擬服務(wù)的構(gòu)建過程。同樣,采用上述方法可以從響應(yīng)樣本數(shù)據(jù)中提取方法返回值類型,完成模擬服務(wù)接口元信息的提取過程。
4.2 模擬服務(wù)構(gòu)建
模擬服務(wù)在接收到請求消息后,通過數(shù)據(jù)綁定技術(shù)將請求消息綁定至服務(wù)實現(xiàn)POJO的方法參數(shù)上,完成目標(biāo)接口的匹配,這一過程采用CXF框架(Apache CXF服務(wù)框架)自動完成[10]。
模擬服務(wù)通過調(diào)用樣本匹配引擎和任務(wù)查詢引擎進行關(guān)聯(lián)數(shù)據(jù)查詢,二者采用獨立運行的Web服務(wù)方式供模擬服務(wù)調(diào)用,下面為模擬服務(wù)的添加用戶接口實現(xiàn)代碼:
其中,F(xiàn)inder類封裝了樣本匹配引擎和任務(wù)查詢引擎的查詢接口,并提供了簡單的調(diào)用接口findSample和findTasks,方便在創(chuàng)建模擬服務(wù)時植入統(tǒng)一的調(diào)用代碼。在運行過程中,根據(jù)Java的反射機制finder實例可以明確當(dāng)前服務(wù)的位置,再由接口的參數(shù)匹配確定具體的樣本用例,用例樣本匹配過程涉及Java基本類型和自定義對象類型的深度匹配,可以借助于規(guī)則引擎[11],本文采用的是將參數(shù)對象順序進行序列化后比較的方法[12]。最后,模擬服務(wù)順序遍歷查詢出的樣本編排任務(wù)信息,并依次執(zhí)行任務(wù),完成后將查詢出的響應(yīng)消息返回。
4.3 服務(wù)發(fā)布與管理
通過動態(tài)生成和編譯后的模擬服務(wù)實體被載入至內(nèi)存,測試人員在設(shè)定模擬服務(wù)的部署位置、發(fā)布端口等信息后,模擬服務(wù)交由CXF以反射的方式進行發(fā)布,即可為外部請求者提供服務(wù)。模擬服務(wù)運行時依賴的樣本匹配引擎與任務(wù)查詢引擎通過獨立的Web服務(wù)方式運行,為集成測試過程中的模擬服務(wù)提供查詢服務(wù)。最后,模擬服務(wù)的管理包含兩個方面,一方面是模擬服務(wù)啟停狀態(tài)的控制,通過調(diào)用CXF的服務(wù)控制接口可以很好的完成這方面工作;另一方面是樣本數(shù)據(jù)和任務(wù)數(shù)據(jù)的管理,由于兩個查詢引擎采用獨立的服務(wù)方式運行,所以提供簡易的數(shù)據(jù)管理工具即可。
4.4 實際應(yīng)用效果
經(jīng)實踐證明,模擬服務(wù)在系統(tǒng)集成測試階段能夠有效地應(yīng)對關(guān)鍵服務(wù)模塊出現(xiàn)問題的情況,使得集成測試過程持續(xù)且快速。模擬服務(wù)屏蔽了應(yīng)用系統(tǒng)下復(fù)雜的測試環(huán)境,同樣為無法進行在線集成的線上接口提供了便利的解決方案。如圖7所示,為輔助集成測試系統(tǒng)的主界面圖。
5 結(jié)束語
本文從構(gòu)建模擬服務(wù)的獨特角度出發(fā),提出了面向服務(wù)的輔助集成測試系統(tǒng)模型,通過模擬服務(wù)從容地應(yīng)對了集成測試環(huán)境中服務(wù)數(shù)量多、服務(wù)環(huán)境復(fù)雜而帶來的一系列問題,使得服務(wù)集成過程快速而可靠,有效地緩解了集成測試階段的壓力。文中總結(jié)了模擬服務(wù)創(chuàng)建及發(fā)布的整個生命周期,明確了模型中各模塊的對于構(gòu)建模擬服務(wù)至關(guān)重要的作用,然而尚未提及如接口歸并、樣本匹配等關(guān)鍵模塊的高效實現(xiàn)方法,當(dāng)樣本數(shù)據(jù)量異常龐大時,這些模塊將嚴(yán)重影響模擬服務(wù)的性能,為了能夠提供高效并且可靠的模擬服務(wù),這一方面仍需加以關(guān)注。
參考文獻:
[1]凌曉東.綜述[J].計算機應(yīng)用與軟件,2007(10):122-124.
[2]楊利利,李必信.Web服務(wù)測試問題綜述[J].計算機科學(xué),2008(09):258-265.
[3]馮細(xì)光,劉建勛.Web服務(wù)測試技術(shù)綜述[J].微計算機應(yīng)用,2010(01):111-126.
[4]蘭景英.軟件集成測試技術(shù)研究[J].信息技術(shù),2006(08):102-105.
[5]Bobby Woolf.Streamline SOA Development using Service Mocks[J].IBM developerWorks,2005.
[6]馬春燕,朱怡安,陸偉.Web服務(wù)自動化測試技術(shù)[J].計算機科學(xué),2012(01):162-169.
[7]沙為超.基于Web服務(wù)的SOA應(yīng)用研究[J].安徽大學(xué),2007.
[8]張仙偉,張璟.Web服務(wù)的核心技術(shù)之一——SOAP協(xié)議[J].電子科技,2010(03):93-96.
[9]李海峰,楊小虎.基于風(fēng)格與風(fēng)格消息的服務(wù)性能比較[J].計算機應(yīng)用與軟件,2007(01):80-117.
[10]彭邦倫.利用JAX—WS開發(fā)Web Service[J].電腦編程技巧與維護,2008(12):21-23.
[11]劉偉.Java規(guī)則引擎——Drools的介紹及應(yīng)用[J].微計算機應(yīng)用,2005(06):79-83.
[12]晏立,沈銳.Java序列化技術(shù)的探討[J].紅河學(xué)院學(xué)報,2011(04):37-39.
[13]張羽豐.面向服務(wù)的Web服務(wù)測試框架研究與實現(xiàn)[J].國防科學(xué)技術(shù)大學(xué),2008.
[14]羅作民,朱燕,程明.Web服務(wù)測試工具SOAPUI及其分析[J].計算機應(yīng)用與軟件,2010(05):155-157.
[15]秦鋒,李喬,鄭嘯.Web服務(wù)測試的一種實現(xiàn)[J].計算機技術(shù)與發(fā)展,2007(08):239-242.
[16]嚴(yán)思靜,常紅春,劉鋼,唐奮飛,馮國軍.Web服務(wù)測試工具的設(shè)計[J].硅谷,2010(08):60-64.
作者簡介:徐亮亮,男,研究生在讀,研究方向:軍用軟件集成;宋劍鋒,男,博士;田飛,男,研究生,研究方向:軍用軟件集成。
作者單位:華北計算技術(shù)研究所 軍用中間件研發(fā)中心,北京 100083;中國電子設(shè)備系統(tǒng)工程公司研究所,北京 100141