基于數(shù)據(jù)驅(qū)動的酒店對賬自動化測試系統(tǒng)
隨著馬蜂窩酒店業(yè)務規(guī)模的不斷擴大,酒店平臺與各 OTA 的業(yè)務往來越來越頻繁。實際業(yè)務中,在向各 OTA 平臺結(jié)算金額前,我們需要通過對賬環(huán)節(jié)與自身系統(tǒng)訂單進行比對,確認雙方訂單金額、狀態(tài)等是否存在異常,并以此作為結(jié)算金額的計算依據(jù)。
為什么需要自動化測試?
大家都知道,賬務數(shù)據(jù)對精確性的要求非常高。之前酒店賬務數(shù)據(jù)一致性的測試,基本是依靠財務人員手工處理。
圖1:過去我們是這樣的
業(yè)務的增長使對賬系統(tǒng)的測試任務越來越多,傳統(tǒng)的測試方法導致的問題愈加明顯:
1)多源數(shù)據(jù)。賬務數(shù)據(jù)來自不同的 OTA 平臺,數(shù)據(jù)格式?jīng)]有統(tǒng)一標準和規(guī)范,影響數(shù)據(jù)處理效率。
2)大量數(shù)據(jù)的處理效率以及準確性。數(shù)據(jù)的測試結(jié)果由賬務人員手動對比 Excel 文件獲得,每月都需要處理海量的流水數(shù)據(jù),處理慢、精度低,并且不可避免的有錯誤出現(xiàn)。
3)多輪回歸測試。測試時任務流程長且重復單調(diào),人工在多輪測試后,非常容易疲憊厭倦,導致錯誤率上升,影響接下來的測試結(jié)果。
4)問題定位。使用手工測試,很難完整地記錄測試結(jié)果和測試報告,在測試過程中遇到的異常情況,很多情況下無法進行實時記錄,使得問題定位時花費較長時間。
基于酒店對賬任務的現(xiàn)狀和問題,我們決定決定采用以 Excel 表格作為數(shù)據(jù)源,使用 Java 語言來整合、篩選以及數(shù)據(jù)對比的方式,搭建一套酒店對賬自動化測試平臺,一方面可以有效地在短時間內(nèi)處理大量數(shù)據(jù);另一方面可以將財務人員從龐雜的手工對賬測試中解放出來,提高工作效率。
圖2:現(xiàn)在我們是這樣的
通過本文,希望和大家分享過去幾個月馬蜂窩酒店財務對賬項目的探索和實踐,并對對賬自動化測試平臺進行一個總結(jié)。
基于數(shù)據(jù)驅(qū)動的自動化測試系統(tǒng)
上文提到過,酒店的對賬數(shù)據(jù)來自于不同的 OTA,數(shù)據(jù)格式存在一定的差異。如何使用同一套代碼,來處理這些數(shù)據(jù)方面的差異,提高腳本的復用性呢?我們采用了基于數(shù)據(jù)驅(qū)動的測試方式。
1.如何理解數(shù)據(jù)驅(qū)動
如果測試數(shù)據(jù)和代碼結(jié)合在一起,每一次修改數(shù)據(jù),兩者都要同時變化,這種測試的方式不適合酒店業(yè)務數(shù)據(jù)的處理。數(shù)據(jù)驅(qū)動的方式將測式數(shù)據(jù)參數(shù)化,通過給測試腳本類的構(gòu)造函數(shù)傳遞參數(shù),從而達到數(shù)據(jù)的改變驅(qū)動自動化測試的執(zhí)行,最終使得測試結(jié)果的改變。
通過這種方式,可以使測試數(shù)據(jù)和測試代碼相分離,各自維護,只需要較少的代碼產(chǎn)生的大量測試用例,提高腳本的復用率和可維護性。
2.技術(shù)實現(xiàn)
結(jié)合上文我們可以明確,在數(shù)據(jù)驅(qū)動的自動化測試框架中,一是必須要有與電子表格、文本文件、數(shù)據(jù)庫等集成的能力;二是必須有數(shù)據(jù)來控制測試的業(yè)務流。整套框架我們采用的是 Maven + TestNG + Java +POI 來實現(xiàn)。
-- Maven 是一個通過配置文件來管理項目的構(gòu)建工具,應用在自動化測試中時,無論是對 Jar 包的管理還是執(zhí)行測試案例,表現(xiàn)都很出色。
-- TestNG 是一套可以利用注釋來控制測試流程,從而達到強化測試功能的測試框架。它加入了單元測試、注解、組概念、套件、異常、參數(shù)化、依賴等測試思想,使其可以很好地支持和管理自動化測試任務。
-- Apache POI 是一種流行的 API , 它允許程序員創(chuàng)建、修改和顯示 MS Office 文件。它是由 Apache 軟件基金會開發(fā)和發(fā)布的一個開源庫,用于使用 Java 程序設計或修改 MS-Office 文件。 它包含將用戶輸入數(shù)據(jù)或文件到 MS Office 文檔進行解碼的類和方法(詳見官網(wǎng):http://poi.apache.org/)。
通過使用 Apache POI 來解析 Excel 文檔,結(jié)合 Java 語言對文檔內(nèi)容進一步處理,可以達到自動化的測試效果。
具體到一個測試用例的執(zhí)行過程為:
圖3:測試用例執(zhí)行過程
自動化測試框架大致結(jié)構(gòu)圖:
圖4:自動化測試框架結(jié)構(gòu)圖
各模塊功能:
- DataProvider:通過構(gòu)造函數(shù)向測試腳本傳遞測試數(shù)據(jù),從而達到數(shù)據(jù)驅(qū)動的目的;
- TestScript:封裝測試腳本;
- commonFunction 將一些常用的方法抽離出來放到該模塊中;
- Data:將一些共享的常用的數(shù)據(jù)抽離出來放到該模塊;
- Report:測試結(jié)果模塊;
- 執(zhí)行入口: xml 文件,可以用來配置測試的范圍。
整個框架的工作流程大致可以描述為:
- Testng.xml 作為測試入口;
- DataProvider 通過測試數(shù)據(jù)驅(qū)動測試腳本的執(zhí)行;
- 測試腳本中通過 POI 讀取測試數(shù)據(jù),Java 分析測試數(shù)據(jù),然后輸出Report(在 Testscipt 中需要用到 Data 模塊和 CommonFunc 模塊。)
3.框架優(yōu)化
一個好的測試框架的目標是能夠減少代碼量,大大提高測試腳本開發(fā)的效率。但它不是一蹴而就的,而是隨著項目的不斷的深入進行持續(xù)地改進。從上線投入使用開始,我們的框架也在不斷優(yōu)化,主要和大家分享以下幾點經(jīng)驗:
1)Data 模塊。在測試過程中發(fā)現(xiàn)一些測試數(shù)據(jù)會經(jīng)常被使用到,而且經(jīng)常需要改變,每次改動需要改動好多文件。我們對就對這部分數(shù)據(jù)進行了收取,放到 Data 模塊中。
2)commonFunction 模塊。在對 Excel 讀寫時,通過對不同的單元格數(shù)據(jù)類型的判斷,進行不同的處理,來使單元格操作的健壯性增強。
3)對于 Excel 文件的讀寫需要多個循環(huán),為了提高性能,應該事先對數(shù)據(jù)進行預處理,避免多個循環(huán)的嵌套。
近期規(guī)劃及演進方向
現(xiàn)在測試數(shù)據(jù)的數(shù)據(jù)源是通過 Excel 文件來獲取的,需要人為手工的進行數(shù)據(jù)的整合,對于持續(xù)化集成是一個阻礙。通過給接口傳參來獲取數(shù)據(jù)的方式,是一個比較理想的構(gòu)想。通過接口獲取數(shù)據(jù)的方式,可以通過 Jenkins 實現(xiàn)持續(xù)集成,測試人員可以給財務人員提供可視化的參數(shù)輸入入口,實現(xiàn)財務人員觸發(fā)測試腳本進行測試。這樣做可以釋放測試資源,提高回歸頻率,減少財務風險。
本文作者:高攀,馬蜂窩酒店研發(fā)團隊高級測試工程師。主要負責酒店自動化體系的搭建和優(yōu)化,以及財務訂單業(yè)務線整體測試工作。
【本文是51CTO專欄作者馬蜂窩技術(shù)的原創(chuàng)文章,作者微信公眾號馬蜂窩技術(shù)(ID:mfwtech)】