單雅輝, 張寶印, 張慶, 張璇, 秦英
(1.中物院高性能數(shù)值模擬軟件中心,北京 100088; 2.北京應(yīng)用物理與計算數(shù)學(xué)研究所,北京 100094;3.中國工程物理研究院計算機應(yīng)用研究所,四川,綿陽 621900;4.四川中銳信息技術(shù)有限公司,四川,成都 610041)
數(shù)值模擬軟件指面向復(fù)雜系統(tǒng)的工程設(shè)計、生產(chǎn)制造、實驗驗證、效能評估等重要環(huán)節(jié),研發(fā)和運行數(shù)值模擬軟件解決其中重要科學(xué)和工程問題。這類軟件依賴于更加精確的物理建模,同時需驗證計算程序是否正確地表示了物理模型,因此對置信度的要求比普通應(yīng)用軟件更高。
近年來,數(shù)值模擬軟件應(yīng)用范圍不斷擴充,為滿足復(fù)雜并行數(shù)值模擬軟件的快速研發(fā)需求,其研制過程逐漸表現(xiàn)出如下特征:① 高性能計算共性技術(shù)發(fā)展基于共性平臺研發(fā)的模式日益普及,使得軟件架構(gòu)趨于組件化,軟件測試的復(fù)雜度隨之增加;② 敏捷研發(fā)模式普及,組件版本快速更新、頻繁交付,測試用例不斷增多,交付時間急劇減少,對軟件測試效率提出了更高的要求。
回歸測試是軟件開發(fā)中一種成熟的實踐,近年來隨著敏捷方法普及,PARSONS等[1]強調(diào)了回歸測試在維護軟件質(zhì)量方面的核心作用。但在傳統(tǒng)測試過程中,基于組件的軟件測試存在以下問題:① 組件之間依賴關(guān)系復(fù)雜,需要人工控制測試順序,風(fēng)險高且測試效率低;② 不同組件由不同團隊串行發(fā)布,單組件單次回歸測試一般在1.5~2 h,整個測試過程需多個開發(fā)/測試團隊協(xié)同工作,測試鏈路長,人力、溝通成本高;③ 軟件測試過程需人工記錄、匯總分析,對人力消耗高,過程難以回溯。因此,面向組件化研發(fā)需求,如何保證軟件產(chǎn)品質(zhì)量、提高回歸測試效率的研究具有非常重要的意義。
本文結(jié)合高性能數(shù)值模擬軟件評測過程中的實際需求,設(shè)計與實現(xiàn)了一種基于依賴性分析的回歸測試工具。
面向組件化軟件[2]研制過程中的質(zhì)量保證需求,基于依賴分析的回歸測試工具的需求特征如下。
(1) 組件依賴關(guān)系管理。為避免人工控制測試順序引入的風(fēng)險,支持自動解析組件復(fù)雜的邏輯關(guān)系,生成直觀、可靠的依賴關(guān)系圖,便于用戶快速掌握組件變更的影響范圍。
(2) 并行回歸測試。支持批量組件的自動化回歸測試需求,有效編排測試任務(wù),以提升測試任務(wù)并行度與測試效率。
(3) 測試報告自動生成。支持層次化測試報表生成,全面記錄構(gòu)建日志與測試結(jié)果,便于研發(fā)人員定位問題,同時保證測試過程可回溯。
基于以上需求,對組件依賴分析及回歸測試的國內(nèi)外研究現(xiàn)狀進行了調(diào)研:STAFFORD等[3]對組件系統(tǒng)的體系結(jié)構(gòu)和接口進行了依賴分析,基于體系結(jié)構(gòu)描述語言對組件間接口和行為關(guān)系進行描述,提出了體系結(jié)構(gòu)層次的依賴分析方法;VIEIRA等[4]給出了一種CBDM組件依賴模型,用于生成組件間依賴關(guān)系圖,描述組件集成到新應(yīng)用環(huán)境時可能對其他組件產(chǎn)生的影響,以便后續(xù)集成測試的實施;AMALARETHINAM等[5]提出了基于矩陣的方法來分析組件系統(tǒng)中的依賴關(guān)系,通過引入一組基于組件的度量,分析軟件組件依賴與交互相關(guān)問題。從以上研究可以看出,由于組件系統(tǒng)類型不同,對組件管理方式、應(yīng)用場景有所差別,因此,需結(jié)合具體需求與應(yīng)用情況,為組件依賴選取適用的管理方法。
在回歸測試方面:解凱[6]對構(gòu)建系統(tǒng)回歸測試模型與技術(shù)進行了研究,提出了一種基于事件機制的構(gòu)建模型,實現(xiàn)了回歸多Agent框架;劉倩[7]開展了COM組件系統(tǒng)依賴分析方法和回歸測試研究,提出了依賴動態(tài)分析方法,實現(xiàn)了動態(tài)分析COM組件間依賴關(guān)系功能;王曉琳等[8]面向敏捷研發(fā)需求提出了敏捷測試用例優(yōu)先排序和敏捷回歸測試選擇方法;陳樹峰等[9]針對面向?qū)ο筌浖蓄愔g的復(fù)雜依賴問題,提出了基于UML類圖的依賴分析模型及測試路徑查找算法,利用此算法得到需測試的類集和測試序列;SAJEEV等[10]基于組件回歸測試的 UML 模型,使用 UML 和對象約束語言根據(jù)版本信息實現(xiàn)了指定回歸測試用例的選擇;傅鶴崗等[11]提出了一種描述組件系統(tǒng)的層次依賴模型,通過對修改點向前切片,得到修改所影響部分,然后遍歷得到所影響的測試路徑,實現(xiàn)了測試算例的有效選擇。以上研究工作多局限于特定編程語言或應(yīng)用場景,不具備通用性,其實現(xiàn)多依賴于額外的信息輸入,如內(nèi)置元數(shù)據(jù)信息、設(shè)計文檔等。而數(shù)值模擬組件研發(fā)所使用的編程語言(包含C、C++、Fortran等)較為廣泛,不同組件的測試需求有所差別,以上方法無法直接應(yīng)用于數(shù)值模擬軟件測試場景,但為本文工具的設(shè)計提供了重要的參考價值。
面向組件變更評估與批量組件驗證測試需求,設(shè)計了基于依賴分析的回歸測試框架(圖1),將測試過程分為變更組件依賴分析、批量測試任務(wù)調(diào)度、回歸測試任務(wù)執(zhí)行、多維度測試報告生成4部分。變更組件依賴分析基于組件依賴樹分析變更組件可能引起的變更范圍,確定受變更影響、需重新測試的組件范圍,形成待測組件列表,以降低回歸測試成本。批量測試任務(wù)調(diào)度對批量組件間的依賴關(guān)系進行分析,確定任務(wù)執(zhí)行順序,保證測試鏈路正確可行?;貧w測試任務(wù)執(zhí)行是將各上層組件提供的測試算例集,與基準(zhǔn)結(jié)果進行比對,驗證變更后組件的正確性。待批量組件回歸測試完成后,面向測試過程與測試結(jié)果,自動生成多維度測試報告。
圖1 基于依賴分析的回歸測試框架
整個過程涉及3個關(guān)鍵問題,下面將分別闡述。
(1) 針對多組件多版本復(fù)雜依賴關(guān)系的管理需求,如何獲取并準(zhǔn)確地表示依賴關(guān)系,使依賴拓?fù)淇梢暱筛兄?
(2) 針對不同數(shù)值模擬組件的差異性測試需求,如何滿足各類組件定制化測試需求,提升回歸測試的自動化程度?
(3) 面向各關(guān)聯(lián)組件批量測試場景,如何自動控制測試任務(wù)的先后順序,保證測試邏輯正確性?
要有效管理復(fù)雜的組件依賴關(guān)系,滿足不同組件版本依賴的差異性需求,適應(yīng)研發(fā)過程中組件依賴變更,實現(xiàn)組件之間依賴拓?fù)涞目梢暱筛兄?關(guān)鍵要提供一種組件依賴關(guān)系描述與解析方法。具體如下。
(1) 單一組件建立依賴描述文件,保證依賴可變可維護。每個組件維護一份依賴描述文件,用于描述組件編譯/運行時的依賴關(guān)系(見圖2),對組件E來說,其編譯時依賴于組件A~D,但運行時依賴于組件B~D。需要注意的是,當(dāng)組件B、D同時依賴于C時,需按照版本管理規(guī)則,查找組件C可用版本,避免版本沖突。
(a) 組件依賴示例
通過解析依賴描述文件,基于正則表達式的版本匹配規(guī)則,分析處理其依賴組件信息,完成組件的編譯打包?;谶@種方法,明確單一組件的依賴組件名稱及版本要求,保證組件具備可維護性。
(2) 解析形成依賴索引文件,標(biāo)識運行環(huán)境信息。對于高性能數(shù)值模擬組件來說,其應(yīng)用需求、運行環(huán)境不同,依賴描述也會存在一定差別。因此,需按照不同的編譯/運行環(huán)境及依賴管理規(guī)則,對依賴描述文件進行解析,形成依賴關(guān)系索引文件。該文件匯總了多環(huán)境多組件依賴關(guān)系,為依賴關(guān)系查詢提供統(tǒng)一入口,保證依賴關(guān)系的準(zhǔn)確獲取。
(3) 依賴關(guān)系樹標(biāo)準(zhǔn)化,實現(xiàn)依賴拓?fù)淇梢??;诟饕蕾囮P(guān)系索引文件,按照組件管理與版本比較規(guī)則,查詢、解析變更組件名稱及版本號,實現(xiàn)變更組件的影響分析,形成標(biāo)準(zhǔn)化依賴關(guān)系樹。該文件對依賴關(guān)系的表示形式進行了標(biāo)準(zhǔn)化,明確了關(guān)聯(lián)組件的節(jié)點信息、有向邊關(guān)聯(lián)關(guān)系。基于可視化圖表庫對標(biāo)準(zhǔn)化文件進行界面渲染,支持變更組件依賴關(guān)系樹的自動生成,實現(xiàn)組件依賴拓?fù)淇梢暬?/p>
要滿足各類數(shù)值模擬組件的不同測試需求,關(guān)鍵是提供一套合理的自動化回歸測試機制??紤]到依賴分析的回歸測試過程經(jīng)常會涉及多個組件的測試,為避免不同組件之間測試過程的相互干擾,將每個組件通過一個獨立測試任務(wù)來管理。但對于不同組件源碼目錄、測試算例目錄及安裝目錄結(jié)構(gòu)并不統(tǒng)一,其運行時依賴環(huán)境不盡相同,因此要面向不同組件的評測需求實現(xiàn)任務(wù)定制化。
(1) 集成通用組件測試方法,形成測試模板。通過分析組件測試過程,以質(zhì)量評測方法和指標(biāo)為依據(jù),實現(xiàn)了通用測試流程(包含測試環(huán)境、代碼檢出、靜態(tài)審查、回歸測試、覆蓋率檢測等),集成結(jié)果可視化方法,形成了共性測試模板。該模板將測試方法與業(yè)務(wù)解耦,以快速適應(yīng)組件與環(huán)境變化。
(2) 松耦合管理產(chǎn)品特征與測試模板,自動創(chuàng)建測試任務(wù)。通過參數(shù)化形式集中管理產(chǎn)品個性化特征,包括倉庫路徑、版本號、測試算例等信息。基于持續(xù)集成模板,創(chuàng)建并觸發(fā)組件測試任務(wù)[12],將個性化組件信息填入自動化測試腳本,以快速適應(yīng)各組件間差異,滿足不同組件的定制化需求。
基于依賴分析的回歸測試通常涉及多個組件,組件之間依賴關(guān)系復(fù)雜,要實現(xiàn)關(guān)聯(lián)任務(wù)先后順序的自動編排,關(guān)鍵要實現(xiàn)一種有效的測試任務(wù)調(diào)度算法。
假設(shè)待測試的若干測試任務(wù)相互關(guān)聯(lián),本文所采用的偏序算法[13]以一組測試任務(wù)(v1,v2,…,vn)為輸入,以一組按照執(zhí)行順序排列的任務(wù)序列為輸出,算法原理如下。
(1) 建立起點任務(wù)vs和終點任務(wù)ve,基于依賴關(guān)系樹搜索vs的緊后任務(wù),若不存在則退出。將找到的測試任務(wù)建立vs→vi關(guān)系,分別設(shè)置這些任務(wù)的度為Di=1。
(2) 將查找到的測試任務(wù)作為起始任務(wù),依次查找其緊后任務(wù):
① 若本次所有的緊后任務(wù)都為ve,跳轉(zhuǎn)到(3);
② 逐個計算vi,vi+ 1,…緊后網(wǎng)絡(luò)作業(yè)vj,vj+ 1,…的度Dj=Di+ 1,Dj+ 1=Di+ 1+ 1,…如果新計算的度小于計算前的度,不保存此結(jié)果; 建立關(guān)系vi→vj;
③ 排列本次搜索到的所有緊后任務(wù);
④ 將此次得到的任務(wù)作為起始任務(wù),重新執(zhí)行(2)。
(3) 按照執(zhí)行序號將測試任務(wù)重新排隊編號,執(zhí)行序號越小編號越小,度相等則隨機編號,編號完成后退出。
以圖3中的測試任務(wù)依賴關(guān)系為例,該算法通過計算組件測試任務(wù)的度,可輸出順序測試列表。
圖3 測試任務(wù)依賴關(guān)系示例圖
此外,考慮到實際測試規(guī)模與資源,在偏序算法基礎(chǔ)上增加了并行測試節(jié)點數(shù)量限制。將優(yōu)化偏序算法應(yīng)用于關(guān)聯(lián)測試任務(wù)調(diào)度,一方面,可快速識別關(guān)聯(lián)測試任務(wù)的先后順序,實現(xiàn)任務(wù)自動編排,保證測試邏輯的正確性;另一方面,支持多任務(wù)同時觸發(fā),實現(xiàn)無關(guān)任務(wù)的并行執(zhí)行,提高測試效率。
基于依賴分析的回歸測試工具架構(gòu)如圖4所示。工具以變更組件信息為輸入,通過依賴分析、測試任務(wù)調(diào)度與執(zhí)行、測試狀態(tài)監(jiān)控、測試報告生成等過程,最終輸出層次化回歸測試報表。
圖4 基于依賴分析的回歸測試工具架構(gòu)圖
測試工具采用“界面層—業(yè)務(wù)層—數(shù)據(jù)層”分離技術(shù),界面層(前端)采用Vue.js技術(shù),專注于頁面的樣式與動態(tài)數(shù)據(jù)的解析和渲染,業(yè)務(wù)層(后端)實現(xiàn)采用Java語言及SpringBoot框架,專注于業(yè)務(wù)邏輯,前后端通過約定的交互接口實現(xiàn)同步開發(fā)[14]。整體采用高內(nèi)聚低耦合的研發(fā)模式,以降低后期代碼維護成本。
(1) 業(yè)務(wù)層
業(yè)務(wù)層的實現(xiàn)邏輯如圖5所示,主要包括依賴分析、測試任務(wù)管理、任務(wù)調(diào)度和測試報告生成模塊。
圖5 基于依賴分析的回歸測試工具業(yè)務(wù)邏輯圖
依賴分析模塊實現(xiàn)依賴關(guān)系讀取與解析,以變更組件名稱、版本信息為輸入,以影響組件信息為輸出。測試任務(wù)管理模塊實現(xiàn)任務(wù)創(chuàng)建、狀態(tài)監(jiān)控與更新、任務(wù)清理等功能,以任務(wù)實時狀態(tài)為輸出。任務(wù)調(diào)度模塊實現(xiàn)優(yōu)化后偏序算法,以排序后的任務(wù)列表為輸出。測試報告生成模塊實現(xiàn)測試任務(wù)數(shù)據(jù)解析、統(tǒng)計與分析,以層次化測試報告為輸出。
(2) 界面層
界面層展現(xiàn)了變更軟件依賴關(guān)系查詢、影響組件選取、測試任務(wù)配置、測試監(jiān)控、測試結(jié)果報表等主要功能界面,通過調(diào)用前后端交互接口實現(xiàn)了數(shù)據(jù)渲染與顯示。
(3) 數(shù)據(jù)層
數(shù)據(jù)層使用MySQL 數(shù)據(jù)庫存儲業(yè)務(wù)數(shù)據(jù),設(shè)計與實現(xiàn)50 余張數(shù)據(jù)表和視圖,包括組件信息表、依賴關(guān)系表、測試任務(wù)狀態(tài)表等。組件信息表用于存儲組件信息,測試任務(wù)表用于存儲測試任務(wù)信息,以任務(wù)編號、組件編號作為外鍵與其他數(shù)據(jù)表相關(guān)聯(lián)。
基于依賴分析的回歸測試工具已應(yīng)用于Linux 系統(tǒng)環(huán)境下高性能數(shù)值模擬組件的變更評估工作中,完成了20余款組件的依賴分析測試。該工具支持依賴關(guān)系自動化解析,用戶只需明確變更產(chǎn)品名稱及版本號,即可自動解析、展示相應(yīng)的依賴關(guān)系樹(見圖6),實現(xiàn)依賴拓?fù)涞目梢暱筛兄Mㄟ^選取待測軟件、配置參數(shù)化信息(見圖7),即可一鍵式提交測試任務(wù),按照依賴關(guān)系自動編排關(guān)聯(lián)組件測試任務(wù)的先后順序,極大地減少了人工成本,提升了任務(wù)并行度與測試效率。
圖6 依賴關(guān)系解析界面
圖7 測試信息配置界面
基于依賴分析的回歸測試工具提供了多維度測試報告自動生成及全面的測試日志反饋機制,不僅實時收集任務(wù)執(zhí)行狀態(tài),形成測試過程報告,而且提供層次化評測結(jié)果報告,含整體測試結(jié)果與單組件測試結(jié)果。圖8 是回歸測試任務(wù)進度監(jiān)控界面,該界面實時地反饋了各組件測試任務(wù)的執(zhí)行狀態(tài),并且通過圖形化標(biāo)識為測試整體進度提供了直觀反饋。圖9 是單組件測試結(jié)果,包含測試環(huán)境、靜態(tài)審查結(jié)果、回歸測試結(jié)果、覆蓋率檢測結(jié)果等信息。對于執(zhí)行失敗的任務(wù),直接反饋錯誤日志,幫助研發(fā)人員快速定位問題。
圖8 回歸測試任務(wù)進度監(jiān)控界面
經(jīng)多次測試分析發(fā)現(xiàn),與人工相比,其測試效率隨組件數(shù)量增多呈增長趨勢,組件規(guī)模在5個以上時,回歸測試效率提升達2.1倍以上。
本文面向高性能數(shù)值模擬組件的變更評估需求,設(shè)計與實現(xiàn)了基于依賴分析的回歸測試工具,支持自動解析組件之間復(fù)雜的邏輯關(guān)系,實現(xiàn)了組件變更的影響范圍快速評估;支持多組件批量回歸測試需求,實現(xiàn)了任務(wù)順序的自動編排,大幅提高組件化任務(wù)并行度與測試效率;提供多維度回歸測試報表,實時反饋組件依賴關(guān)系、整體執(zhí)行情況及單組件詳細(xì)測試報告,幫助用戶快速定位缺陷,保證測試數(shù)據(jù)可回溯。
該工具目前已支撐二十余款高性能數(shù)值模擬軟件的依賴分析測試,有效降低了回歸測試復(fù)雜度。但處理大規(guī)模問題時需要較長處理時間,下一步計劃深入開展性能調(diào)優(yōu)工作,持續(xù)提升用戶體驗。