雲原生引擎單元測試實踐

語言: CN / TW / HK

作者:京東零售 王雷

單元測試

概念

單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。單元測試是一種白盒測試技術,一般都是由開發人員在編碼階段完成,目的就是驗證軟件代碼中的每個單元(方法或類等)是否符合預期,即儘早在儘量小的範圍內暴露問題。

快速迭代的開發工作中如何提高代碼質量一直是團隊痛點,特別是沒有測試支持的開發團隊。合理的使用單元測試,並關注單元測試通過率、代碼覆蓋率可以有效提高代碼質量。

雲原生引擎服務,實踐了單元測試,並在研發自測、預發、上線等階段實施了相應的策略。在一定程度上提高了代碼的質量。

單元測試的目的

單元測試的目的在於發現各模塊內部可能存在的各種錯誤,主要包括以下幾個方面:

(1) 驗證代碼是與設計相符合的。

(2) 發現設計和需求中存在的錯誤。

(3) 發現在編碼過程中引入的錯誤。

在開發階段儘可能發現代碼中的問題;在預發集成階段儘可能發現各個業務代碼之間的問題;在上線階段做最後的確認保證上線代碼質量。

單元測試除了能夠在較早階段識別軟件中的錯誤,它還有如下價值。

•反饋速度快:單元測試通常以自動化形式運行,執行速度非常快,可以快速反饋結果,跟持續集成結合起來,形成有效的反饋環。

•重構的有力保障:系統需要大規模重構時,單測可以確保對已有邏輯的兼容,如果單元測試都通過,基本上可以保證重構沒有破壞原來代碼邏輯的正確性。

•使更熟悉代碼:寫單元測試的過程本身就是一個審視代碼的過程,可以發現一些設計上的問題(代碼設計的不可測試)、代碼編寫方面的問題(邊界條件的處理不當)等。

雲原生引擎單測實踐

整體單測率

引擎在進行開發過程中,會重點關注核心模塊代碼和底層代碼,針對重要的業務邏輯代碼,通用組件類等,涉及到重要的功能開發,對應的每一個方法我們都要編寫對應的單元測試代碼。在提交代碼之前,在本地進行單測迴歸,跑通單測之後,提交代碼,分支合併。

單元測試重點

引擎的單測重點主要體現在以下五個方面

1、輸入輸出測試

這裏主要是針對數據的輸入和輸出進行測試。

  1. 調用所測模塊時的輸入參數與模塊的形式參數在個數、屬性、順序上是否匹配。

  2. 所測模塊調用子模塊時,它輸入給子模塊的參數與子模塊中的形式參數在個數、屬性、順序上是否匹配。

  3. 是否修改了只用作輸入的形式參數。

2、路徑測試

在單元測試中,最主要的測試是針對路徑的測試;測試用例必須能夠發現由於計算錯誤、不正確的判定或不正常的控制流而產生的錯誤。

常見的錯誤有:誤解的或不正確的算術優先級,混合模式的運算,錯誤的初始化,精確度不夠精確和表達式的不正確符號表示

3、出錯處理

比較完善的單元設計要求能預見出錯的條件,並設置適當的出錯處理,以便在程序出錯時,能對出錯程序重新做安排,保證其邏輯上的正確性。

4、邊界條件

主要測試方法對循環條件,控制條件,數據流等臨界值的處理情況

比如針對一個方法中的不同分支進行單測的編寫

5、局部數據結構

在模塊工作過程中,必須測試模塊內部的數據能否保持完整性,包括內部數據的內容、形式及相互關係不發生錯誤。

對於局部數據結構,應該在單元測試中注意發現以下幾類錯誤:

1)不正確的或不一致的類型説明

2)錯誤的初始化或默認值

3)錯誤的變量名,如拼寫錯誤或書寫錯誤

4)下溢、上溢或者地址錯誤

最佳實踐

如何寫好單測

1.代碼設計:代碼設計上要低耦合、可測試

2.度量指標:合理的單元測試用例數量以及合理的覆蓋率

3.使用場景:要融入軟件開發中,在開發過程中經常運行

4.測試目標:要專注於代碼中重要的邏輯

5.保證獨立性:使用mock方式放置依賴系統對單元測試結果的影響

6.用例粒度:單元測試用例應該是對單獨的功能的有意義的描述,通過用例可以瞭解改功能的邏輯

持續集成、持續卡點

代碼自測通過後提交MR讓團隊成員進行review,當review通過時我們會通過webhook觸發預發部署流水線執行單元測試和部署

上線前檢查

當代碼驗收通過後,進行線上部署時再次跑單元測試確保上線代碼質量,不達標將不能部署