當我們費盡千辛萬苦,終於硬著頭皮想辦法把功能實作出來之後,也在Local自己測試過。覺得沒有問題了,想開開心心推PR。一發上去,可能會遇到兩個狀況。CI pipeline 回你一個大叉叉,或是審你PR的人懷疑的問,所以我說那個測試呢?
被問的時候,也可能會murmur,為什麼要寫新的程式碼來測試寫好的程式碼? 太麻煩了吧,等等反抗的情緒。
但不得不說,撰寫測試的過程和維護測試的過程,雖然真的是痛不欲生,但是結果來說測試真的很重要!
我們舉個現實世界中的例子,想像我們製作一組模型。一個模型有非常多個部件。每次完成個一部件之後我們就會檢查和把玩一下,看這個部件是否正常。這動作也可以理解成我們開發完程式後的手動驗證。這的確能確保正確性,不過也可能帶來一些麻煩。
- 耗時:每次你做完一個部件,都需要花時間去手動檢查。這樣會變得非常繁瑣,尤其是當玩具變得越來越複雜時。
- 容易出錯:人總會犯錯,手動測試的時候,可能會忽略某些細節或檢查不完全,這樣就可能導致一些問題沒被發現。
- 重複性工作:如果你需要多次測試同樣的部件,每次都要重複手動檢查,就會浪費很多時間。
現在,想像如果我們有一個可以自動檢查的機器,每次完成一個部件後,他都會幫我們自動檢查。
- 省時:自動化測試可以迅速完成檢查,讓你節省很多時間,能更快地進行下一步的工作。
- 更準確:這個測試機器不會疲倦,也不會出錯,它能準確地檢查每個細節,確保所有部件都能正常運行。
- 重複使用:當你改進或新增部件時,只需要重新運行測試機器,這樣能快速知道哪些地方需要修正。
- 減少壓力:你可以更有信心地進行改變,因為有測試機器幫你保證一切都正常,這樣不容易出錯。
切換回程式碼的角度,透過撰寫測試能夠減少改A壞B的情況,也能夠在各個階段檢核程式碼,不需要每一次耗費人力。接著規範測試涵蓋率和通過率也能夠確保每個開發人員提交上來的程式碼品質。最終的產品會更加穩定,大家使用起來也會更滿意。
程式的測試分成很多種,不過下面三項可以算是黃金三件套了,有也就是常說的測試金字塔。
他們分別是單元測試(Unit Testing)、整合測試(Integration Testing )和 端到端測試(End-to-End Testing),這三種測試分別有各自的職責和目的。
1. 單元測試(Unit Testing)
職責:
單元測試專注於測試程式碼中的最小單位,通常是一個函數或方法。這種測試獨立於其他部分的程式碼運行,目的是檢查該單元在各種輸入下的行為是否符合預期。
目的:
- 確保功能正確:每個單元的測試用來驗證其輸入和輸出是否正確。例如,如果一個函數用來計算兩個數字的和,單元測試將檢查不同的輸入(如正數、負數、零)是否都能給出正確的和。
- 快速發現問題:單元測試通常執行速度快,因為它們只測試小範圍的程式碼。這使得開發者能夠在開發過程中及早發現問題,減少修復的成本。
- 促進重構:當你想要改進或重構代碼時,單元測試提供了一個保護層,確保在變更後不會引入新的錯誤。
2. 整合測試(Integration Testing)
職責:
整合測試專注於測試不同模組或系統部件之間的交互。這包括測試它們如何共同工作,確保數據能在各個模組之間正確傳遞。
目的:
- 確保模組協同工作:即使單個模組在單元測試中運行良好,它們在一起時可能會出現問題。整合測試旨在捕捉這些問題,例如接口不兼容或數據格式錯誤。
- 檢查數據流:整合測試可以檢查數據如何在不同模組之間流動,確保信息正確傳遞,並在最終系統中生成正確的結果。
- 發現組合錯誤:這些測試能夠捕捉因模組之間交互而產生的錯誤,這些錯誤可能在單獨測試時不容易發現。
3. 端到端測試(End-to-End Testing)
職責:
端到端測試模擬用戶在應用程序中的實際操作,測試整個應用的工作流程。這種測試覆蓋了從用戶界面到後端服務的所有交互。
目的:
- 檢查整體流程:端到端測試旨在確保整個系統從頭到尾運行正常,包括用戶的所有交互和後端的處理。這能確認用戶在使用應用時不會遇到問題。
- 驗證業務邏輯:通過模擬用戶的操作,這些測試確保業務邏輯按預期運行,並能覆蓋多種使用情景。
- 確保所有組件協同工作:端到端測試可以發現系統中不同部件之間的集成問題,這些問題可能在單元測試和整合測試中未被捕捉。
單元測試針對單一功能,整合測試檢查模組交互,E2E模擬用戶的實際操作,層層把關。
值得一提的是,金字塔的越底層,撰寫和測試的時間通常較快,維護成本較低,因為範圍小。反之上層成本通常較高,因為範圍廣大,並且任何功能改動,測試也需要改動,維護成本高。
下一篇文章我們會從底層的單元測試講起,分享如何撰寫單元測試。
引用圖片:
https://blog.csdn.net/sD7O95O/article/details/107804441
https://usersnap.com/blog/software-testing-basics/