孫 立 哲
(公安部第三研究所eID事業(yè)部 上海 201204)
隨著現(xiàn)代軟件業(yè)競爭日趨激烈,軟件系統(tǒng)更新頻繁,軟件測試周期不斷縮短。在這種情況下,自動化測試[1]作為能有效提高測試效率的一種手段顯得尤為重要,而自動化測試框架在自動化測試實施中起著關(guān)鍵作用。某后端服務(wù)產(chǎn)品接口多,接口內(nèi)部處理邏輯復(fù)雜且均支持十幾套不同的測試數(shù)據(jù),多版本迭代測試時需執(zhí)行的測試用例數(shù)多達上萬條,以手動測試方式難以滿足短時間版本頻繁迭代的測試需求。為了對該產(chǎn)品實現(xiàn)自動化測試,本文基于面向?qū)ο蠹夹g(shù)[2]、XML文檔設(shè)計與DOM開發(fā)技術(shù)[3]、HTML文檔設(shè)計與CSS和JS開發(fā)技術(shù)[4],借鑒Junit的分層思路[5-6],設(shè)計了一套實用性較強的輕量級接口自動化測試框架[7]。該框架具有易于擴展、便于維護、結(jié)構(gòu)清晰等特點,同時具有自動生成內(nèi)含測試集描述、測試用例描述、接口請求參數(shù)和返回數(shù)據(jù)以及測試結(jié)果等詳細信息的測試結(jié)果數(shù)據(jù)文件的功能,并支持將測試結(jié)果數(shù)據(jù)以Web頁面的形式進行個性化展示與瀏覽。通過在實際產(chǎn)品中進行自動化測試實踐,展示了其能在短時間內(nèi)高效、準確地完成多個版本、上萬條測試用例的快速執(zhí)行,極大地提高了測試效率,有效地解決因版本短時間頻繁迭代所帶來的測試壓力。同時自動生成的測試結(jié)果信息詳盡,有利于對測試失敗的情況快速地作原因分析。
本文設(shè)計的自動化測試框架主要包含兩部分。一部分是基于面向?qū)ο蠹夹g(shù)和XML文檔DOM開發(fā)等技術(shù)的自動化測試執(zhí)行模塊,主要實現(xiàn)對測試數(shù)據(jù)批量配置、測試腳本設(shè)計、測試腳本批量執(zhí)行以及自動生成測試結(jié)果數(shù)據(jù)文件。另一部分是集XML技術(shù)、HTML設(shè)計、CSS技術(shù)和JS開發(fā)技術(shù)的測試結(jié)果統(tǒng)計分析與展示模塊,主要實現(xiàn)對測試結(jié)果數(shù)據(jù)文件內(nèi)數(shù)據(jù)的統(tǒng)計分析并以Web頁面的形式作個性化展示。
自動化測試執(zhí)行模塊基于Eclipse開發(fā)平臺[8]采用Java編程語言來實現(xiàn)。自動化測試執(zhí)行模塊由測試基類、測試用例集類、測試執(zhí)行類、測試數(shù)據(jù)集類、單測試數(shù)據(jù)類、測試輔助類和測試結(jié)果類構(gòu)成。測試用例集類可以有多個,一個測試用例集類對應(yīng)一個接口。自動化測試執(zhí)行模塊類圖如圖1所示。
圖1 自動化測試執(zhí)行模塊類圖
測試基類是抽象類,包含類構(gòu)造方法、執(zhí)行所有測試方法、執(zhí)行正向測試方法、執(zhí)行反向測試方法、正向測試方法、反向測試方法。其中,正向測試方法和反向測試方法是抽象方法。
測試數(shù)據(jù)集類內(nèi)含一個Map對象屬性和一個類構(gòu)造方法。Map對象屬性用于存儲各測試數(shù)據(jù)集,類構(gòu)造方法用于對Map對象初始化,即用于配置各測試數(shù)據(jù)。
單測試數(shù)據(jù)類內(nèi)含各數(shù)據(jù)項屬性和一個類構(gòu)造方法。各數(shù)據(jù)項為接口調(diào)用前請求參數(shù)數(shù)據(jù)或用于組裝請求參數(shù)的可配數(shù)據(jù)項,類構(gòu)造方法用于對各數(shù)據(jù)項初始化。
測試結(jié)果類內(nèi)含文件名配置項屬性、XML文檔對象屬性、XML文檔根元素屬性、XML測試集元素屬性、測試集標識屬性、類構(gòu)造方法、初始化方法、添加測試集方法、添加測試用例方法和寫數(shù)據(jù)到文件方法。文件名配置項用于設(shè)定生成的結(jié)果文件所在目錄及文件名。XML文檔對象用于存儲整個文檔數(shù)據(jù)。XML文檔根元素用于存儲所有測試集數(shù)據(jù)。XML測試集元素用于存儲測試用例及其結(jié)果數(shù)據(jù)。測試集標識用于存儲測試集唯一標識,以接口名作測試集唯一標識。初始化方法用于創(chuàng)建XML文檔并添加根元素。添加測試集方法用于將測試集添加到根元素。添加測試用例方法用于將測試用例及結(jié)果添加到測試集。寫數(shù)據(jù)到文檔方法用于將XML文檔對象中所有數(shù)據(jù)寫入XML文檔。對應(yīng)的測試結(jié)果XML文檔DOM樹結(jié)構(gòu)設(shè)計如圖2所示。
圖2 測試結(jié)果XML文檔DOM樹
測試用例集類繼承測試基類,包含測試數(shù)據(jù)集類對象屬性、單測試數(shù)據(jù)類對象屬性、測試用例標識屬性、類構(gòu)造方法、正向測試子方法、反向測試子方法,并實現(xiàn)測試基類的四個抽象方法。正向測試方法中主要完成實例化測試數(shù)據(jù)集類對象,根據(jù)接口支持的測試數(shù)據(jù)類型提取數(shù)據(jù)用于實例化單測試數(shù)據(jù)類對象,基于單測試數(shù)據(jù)類對象先后執(zhí)行所有正向測試子方法。反向測試方法中所含操作與正向方法類似,區(qū)別是執(zhí)行所有反向測試子方法。若接口支持測試數(shù)據(jù)集中所有數(shù)據(jù)類型,則循環(huán)提取數(shù)據(jù)并執(zhí)行各子方法。正向測試子方法中包含各正向測試用例腳本,反向測試子方法中包含各反向測試用例腳本。根據(jù)接口支持的業(yè)務(wù)模塊分類情況,可以設(shè)定一個或多個子方法,便于后期腳本維護。每個測試用例腳本對應(yīng)一次接口調(diào)用。單個測試用例中包含初始化測試用例標識、組裝接口請求數(shù)據(jù)、解析接口返回數(shù)據(jù)、檢查接口返回數(shù)據(jù)正確性和將用例數(shù)據(jù)寫入測試集。用例數(shù)據(jù)包括測試用例標識、接口請求數(shù)據(jù)、接口返回數(shù)據(jù)、用例執(zhí)行成功與否等信息。
測試輔助類內(nèi)含從數(shù)據(jù)庫讀取數(shù)據(jù)方法、向數(shù)據(jù)庫寫數(shù)據(jù)方法、組裝接口請求數(shù)據(jù)方法、解析接口返回數(shù)據(jù)方法和檢查接口返回數(shù)據(jù)正確性方法以及其他輔助性方法。
測試執(zhí)行類是整個測試程序的執(zhí)行入口,內(nèi)含測試結(jié)果類對象屬性、主方法、執(zhí)行所有測試方法、執(zhí)行正向測試方法和執(zhí)行反向測試方法。主方法完成對測試結(jié)果對象的初始化,配置測試范圍(0代表執(zhí)行所有測試,1代表執(zhí)行正向測試,2代表執(zhí)行反向測試),執(zhí)行測試結(jié)果對象的初始化方法,根據(jù)測試范圍配置執(zhí)行對應(yīng)測試,執(zhí)行測試結(jié)果對象的寫數(shù)據(jù)到文件方法。執(zhí)行所有測試方法中包含初始化測試結(jié)果對象的測試集標識、執(zhí)行測試結(jié)果對象的添加測試集方法、實例化各測試用例集類對象并分別調(diào)用其執(zhí)行所有測試方法。執(zhí)行正向測試方法、執(zhí)行反向測試方法內(nèi)部處理過程與執(zhí)行所有測試方法類似,區(qū)別是二者分別調(diào)用其執(zhí)行正向測試方法和執(zhí)行反向測試方法。
自動化測試執(zhí)行模塊各類之間的調(diào)用關(guān)系以及業(yè)務(wù)處理流程如圖3和圖4所示。反向測試方法內(nèi)部處理流程和正向測試方法內(nèi)部處理流程類似,區(qū)別是執(zhí)行測試用例集類的反向測試子方法和生成反向請求數(shù)據(jù)。
圖3 測試執(zhí)行業(yè)務(wù)總流程圖
圖4 正向測試方法內(nèi)部業(yè)務(wù)流程圖
測試結(jié)果統(tǒng)計分析與展示模塊由HTML文件、CSS文件、JS文件和XML文件構(gòu)成。XML文件由自動化測試執(zhí)行模塊自動生成,作為統(tǒng)計分析的數(shù)據(jù)源。HTML文件定義結(jié)果展示主界面整體布局。主界面整體層疊樣式通過CSS文件定義,部分樣式通過JS文件中腳本作動態(tài)更新。CSS文件和JS文件在HTML文件頭部引入。主界面主要由概要區(qū)、結(jié)果匯總區(qū)、結(jié)果細節(jié)區(qū)構(gòu)成。各區(qū)內(nèi)的部分數(shù)據(jù)通過JS腳本動態(tài)更新。概要區(qū)展示測試用例執(zhí)行總數(shù)、用例執(zhí)行成功總數(shù)和用例執(zhí)行失敗總數(shù)。結(jié)果匯總區(qū)展示各測試集名及其下所含測試用例執(zhí)行總數(shù)、用例執(zhí)行成功總數(shù)和用例執(zhí)行失敗總數(shù),其中測試集名為超鏈接。結(jié)果細節(jié)區(qū)默認隱藏,點擊某個測試集名超鏈接后,結(jié)果細節(jié)區(qū)顯現(xiàn)且顯示該測試集下所有測試用例及其結(jié)果信息。點擊某測試集名超鏈接后的主界面效果如圖5所示。
圖5 點擊某測試集名超鏈接后的測試結(jié)果主界面
JS文件中JavaScript腳本主要完成加載XML文件、讀取XML文件數(shù)據(jù)、對全部測試結(jié)果作概要統(tǒng)計分析、對某個測試集下的測試結(jié)果作統(tǒng)計分析并將相關(guān)數(shù)據(jù)及其顯示樣式動態(tài)更新到HTML文件。其中,對全部測試結(jié)果作概要統(tǒng)計分析和對某個測試集下的測試結(jié)果作統(tǒng)計分析封裝為兩個方法,分別在HTML文件加載時和點擊某個測試集名超鏈接時觸發(fā)調(diào)用。對全部測試結(jié)果作概要統(tǒng)計分析主要完成概要區(qū)和結(jié)果匯總區(qū)所要展示的各數(shù)據(jù)統(tǒng)計并動態(tài)更新相應(yīng)數(shù)據(jù)內(nèi)容及個別樣式(如用例執(zhí)行成功總數(shù)綠色字體突出顯示,用例執(zhí)行失敗總數(shù)紅色字體突出顯示)。對某個測試集下的測試結(jié)果作統(tǒng)計分析主要完成結(jié)果細節(jié)區(qū)所要展示的各數(shù)據(jù)提取并動態(tài)更新相應(yīng)數(shù)據(jù)及個別樣式(如結(jié)果為Pass時綠色字體突出顯示,F(xiàn)ail紅色字體突出顯示)。
某Web后端服務(wù)產(chǎn)品由近三十個接口構(gòu)成,接口請求數(shù)據(jù)組裝時需作加密或簽名處理,接口內(nèi)部業(yè)務(wù)邏輯比較復(fù)雜,部分接口之間存在一定的關(guān)聯(lián)關(guān)系,單套測試數(shù)據(jù)下覆蓋的測試用例總數(shù)為二百多條。按業(yè)務(wù)需求,每個接口均需支持十五套不同的測試數(shù)據(jù)類型,即需要測試每個接口在所有測試數(shù)據(jù)類型下的執(zhí)行情況,因此,單個版本迭代中實際需要覆蓋的測試用例總數(shù)共計達三千多。若進行手動測試,以每日完成執(zhí)行三百條用例為例,每一次迭代,測試需一人十日才能完成。如遇產(chǎn)品需短時間緊急上線情況,或版本短時間頻繁迭代時,手動測試則顯得捉襟見肘。自動化測試能夠以更有效、可重復(fù)的自動測試環(huán)境代替繁瑣的手工測試,而且能在更少的時間內(nèi)完成更多的測試工作[9]。因此,引入自動化測試成為提高測試效率的必然手段。
采用本文的自動化測試框架,針對每個接口開發(fā)對應(yīng)的測試用例集類,配置測試數(shù)據(jù)集,在測試執(zhí)行類中實例化測試用例集類并配置執(zhí)行所有測試用例,進行自動化測試。自動化測試執(zhí)行以及結(jié)果統(tǒng)計分析等總共耗時僅為三個小時。與手動測試相比,自動化測試耗時極少,在測試效率上有著顯著優(yōu)勢。測試結(jié)果實例如圖6所示。
圖6 接口自動化測試結(jié)果實例效果圖
針對某后端服務(wù)產(chǎn)品接口多,功能復(fù)雜,多版本迭代時測試用例覆蓋多達上萬條,以手動測試無法滿足測試需求的情況,本文基于面向?qū)ο蠹夹g(shù)、XML文檔DOM開發(fā)技術(shù)以及HTML和JS等Web頁面開發(fā)技術(shù),采用Java編程語言,設(shè)計并實現(xiàn)了一套比較有實用性的輕量級接口自動化測試框架。該框架集數(shù)據(jù)配置、測試用例分類設(shè)計、測試批量執(zhí)行、結(jié)果自動歸類收集以及統(tǒng)計分析和個性化展示為一體,支持全用例測試、正向測試和反向測試三種測試范圍配置;支持測試數(shù)據(jù)批量配置以及單數(shù)據(jù)下測試執(zhí)行和批量數(shù)據(jù)下測試執(zhí)行;支持自動生成內(nèi)含測試集描述、測試用例描述、接口請求參數(shù)和接口返回參數(shù)以及測試結(jié)果等詳細信息的測試結(jié)果數(shù)據(jù)文件;支持將測試結(jié)果在HTML文件借由JavaScript腳本以約定的CSS樣式進行個性化展示與瀏覽。測試結(jié)果個性化展示頁面中概要信息簡單明了,各測試集匯總信息分類清晰,測試集下各用例信息及對應(yīng)結(jié)果詳盡,整個測試結(jié)果一目了然,便于瀏覽??蚣鼙旧砭哂辛己玫目蓴U展性和可移植性。數(shù)據(jù)配置可擴展設(shè)計為由XML文檔分類存儲各測試數(shù)據(jù)并由測試數(shù)據(jù)集類構(gòu)造方法讀取XML文檔加載各測試數(shù)據(jù),適于大數(shù)據(jù)量測試情況。測試用例集類 具有相對獨立性,可在基本不對整個框架作改動的基 礎(chǔ)上靈活擴增。該框架的設(shè)計思路可移植到其他支持 面向?qū)ο蠹夹g(shù)和XML 文檔DOM 開發(fā)技術(shù)的開發(fā)語言 平臺,適用不同語言平臺下的接口測試。