[Testing] 寫單元測試的正確姿勢(一)

更新於 發佈於 閱讀時間約 6 分鐘

在寫程式的過程中,最讓人頭痛的就是當功能越來越複雜,修改某一塊程式碼時,突然發現別的地方出問題了。怎麼樣才能又快又好地確保程式碼沒毛病?這時候,測試就成了我們的好幫手。

很多人以為測試只是驗證程式碼的功能對不對,但其實它的作用比這更大。測試不僅可以幫我們找到問題,還可以讓程式碼變得更清晰、更好維護,甚至在未來功能變更時幫我們省下不少麻煩。

測試的價值?

  1. 確認程式碼行為:確保它做的就是我們想要的。
  2. 提早發現問題:快速定位那些可能潛伏的 bug。
  3. 讓人放心改程式碼:有了測試,重構或新增功能時不用再提心吊膽。
  4. 省時又省力:自動化測試讓我們不用再重複做繁瑣的手動測試。
  5. 設計更好的程式碼:讓結構更清楚,也更容易被接手或修改。

每種類型的測試都有不同的測試目的和覆蓋範圍,可以從不同的角度來確保軟體的品質,而PHPUnit 支持多種不同的測試類型,包括單元測試、功能測試和功能測試…等。這裡主要會講到的兩大項為Unit TestFeature Test

Unit Test(單元測試)

  • 測試範圍
    • 單一類別、方法或模組的行為。
    • 不依賴於外部系統或框架功能(如路由、中介層)。
  • Mock 的使用
    • 將所有外部依賴(例如 Repository、Service)進行 Mock。
    • 測試的重點是目標類別內的邏輯,而不是依賴的具體實現。
  • 適用場景
    • Service \ Repository
    • 驗證方法是否正確調用依賴、處理資料和回傳結果。

Feature Test(功能測試)

  • 測試範圍
    • 應用程式的完整功能流。
    • 通常測試控制器行為,包括請求、回應和中介層的協作。
  • Mock 的使用
    • 在需要模擬外部系統(如 API 請求)時使用 Mock,但大多依賴真實的資料和系統行為。
  • 適用場景
    • 測試整個測驗功能,例如:
      1. 發送請求到 Controller\ Validation
      2. 通過 Mock Service 處理邏輯。
      3. 驗證回應是否正確。

Service 屬於 Unit Test 的原因

  • 單一類別測試
    • 測試的是 Service 的方法是否能按照業務需求正確執行。
  • Mock 依賴
    • 測試中使用 Mock 的 Repository 和其他 Service,重點關注 Service 本身的邏輯。
  • 與外部系統分離
    • 測試不涉及Controller、Route或Request流程。

如何結合 Feature 和 Unit 測試

  1. Unit Test
    • Service 進行細粒度測試。
    • 模擬所有外部依賴,驗證邏輯的正確性。
  2. Feature Test
    • 測試 Controller 是否正確調用 Service
    • 驗證整個功能流,包括請求和回應。

這樣可以確保程式的不同層級都被充分測試,既有精細的單元測試,也有高層的整合測試。


單元測試的 3A 原則

  1. Arrange(準備): 設定測試所需的前置條件,包括初始化資料、模擬外部依賴等。
  2. Act(執行): 呼叫需要測試的方法或功能。
  3. Assert(驗證): 驗證執行結果是否符合預期。

如何執行測試?

使用 vendor/bin/phpunit 執行測試:

當你執行 vendor/bin/phpunit,你實際上是在執行專案本地的 PHPUnit,這個版本是根據 composer.json 安裝的特定版本。

因為可能同時開發不同版本的專案,每個專案裡面的phpunit版本不一定一樣,所以進入docker容器,在下指令會比較不會出錯。

範例:

--filter {functionName} -> 只執行某一個測試

vendor/bin/phpunit Tests/Feature/Controllers/ExamControllerTest.php --filter testRegisterUsersSuccess
  • 指定測試檔案Tests/Unit/Services/ExamServiceTest.php
  • 指定測試方法--filter testSyncMercerAssessmentUpdatesDatabase


備註:

  • 在 Windows 系統中,路徑分隔符是反斜線 (\),但由於反斜線在 CLI 中具有特殊含義(例如轉義),需要加倍反斜線來正確解析路徑。
  • 如果使用 Linux 或 macOS,可以直接使用單斜線 /

小結

測試不僅能幫助我們檢查程式是否正確運作,還能促進程式碼的結構化與可維護性。在應用程式開發中,結合 Unit Test 和 Feature Test 可以確保程式邏輯細節與整體功能流都能無誤運行。

下一篇文章將進一步深入實際測試的應用範例,尤其是如何使用 Laravel 的 Factory 來建立測試資料,並搭配具體測試案例來演示 PHPUnit 測試的執行過程。我們將從測試資料的建立到完整測試的執行步驟,帶領大家實際操作,體驗單元測試與功能測試如何在開發流程中發揮威力。

留言
avatar-img
留言分享你的想法!
avatar-img
欸! 是彼得的資料庫
65會員
47內容數
歡迎來到彼得的沙龍,在這裡,我將與你分享書籍精華的智慧、人際溝通的技巧、理財增值的秘訣,以及情緒管理的策略。不僅幫助你打好財務基礎,還能引領你在人生的每個環節中游刃有餘。如果你渴望成長,並追求更充實的生活,這裡就是你值得關注的空間。立即加入,與我一起探索成長的無限可能!
2025/04/01
什麼是 MCP?簡單來說,MCP (Model Context Protocol) 是一種讓 AI 變得更聰明的協議,它讓 AI 可以直接使用各種外部工具,例如你的檔案系統、Notion 等等,從而大幅提升 AI 的功能和效率。本文深入淺出地解釋 MCP 的三大組成架構,並透過實際案例和常見問題。
Thumbnail
2025/04/01
什麼是 MCP?簡單來說,MCP (Model Context Protocol) 是一種讓 AI 變得更聰明的協議,它讓 AI 可以直接使用各種外部工具,例如你的檔案系統、Notion 等等,從而大幅提升 AI 的功能和效率。本文深入淺出地解釋 MCP 的三大組成架構,並透過實際案例和常見問題。
Thumbnail
2025/03/30
在現代快節奏的生活中,「今天吃什麼」常常成為一個讓我頭疼的問題。每天面對眾多餐廳選擇,很容易陷入決策疲勞。為了解決這個日常煩惱,我設計了一個簡單的餐廳推薦系統,參考交友軟體的左右滑動機制,讓使用者能夠輕鬆選擇餐廳。 純前端技術(HTML, CSS, JS)搭配GAS
Thumbnail
2025/03/30
在現代快節奏的生活中,「今天吃什麼」常常成為一個讓我頭疼的問題。每天面對眾多餐廳選擇,很容易陷入決策疲勞。為了解決這個日常煩惱,我設計了一個簡單的餐廳推薦系統,參考交友軟體的左右滑動機制,讓使用者能夠輕鬆選擇餐廳。 純前端技術(HTML, CSS, JS)搭配GAS
Thumbnail
2025/03/20
在 Laravel 開發 API 時,直接在 Controller 內進行資料加工可能會讓程式碼變得雜亂且難以維護。因此,Laravel 提供 Resource (資源轉換器) 來解決這個問題,讓我們可以統一管理 API 的輸出格式,將模型model或模型集合collection轉換為適合 API
Thumbnail
2025/03/20
在 Laravel 開發 API 時,直接在 Controller 內進行資料加工可能會讓程式碼變得雜亂且難以維護。因此,Laravel 提供 Resource (資源轉換器) 來解決這個問題,讓我們可以統一管理 API 的輸出格式,將模型model或模型集合collection轉換為適合 API
Thumbnail
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
本文分享之前遇到的奇耙分配程式碼方式-以檔案為單位分配程式碼(ACC制度),並提出更好的團隊管理方法。ACC制度忽略軟體開發的協作本質,易造成團隊士氣低落及不公平。文章建議以功能模組或業務邏輯分工,關注解決問題的過程而非單純究責,並善用工具輔助團隊討論而非單純作為評量依據,建立公開透明的評分機制。
Thumbnail
本文分享之前遇到的奇耙分配程式碼方式-以檔案為單位分配程式碼(ACC制度),並提出更好的團隊管理方法。ACC制度忽略軟體開發的協作本質,易造成團隊士氣低落及不公平。文章建議以功能模組或業務邏輯分工,關注解決問題的過程而非單純究責,並善用工具輔助團隊討論而非單純作為評量依據,建立公開透明的評分機制。
Thumbnail
本文專注於策略模式,旨在通過將函數封裝為策略來簡化程式碼的維護與測試。隨著專案規模的擴大,重構的重要性顯著提高,而策略模式能有效減少程式碼中的條件語句,提升可讀性與易測性。透過範例介紹策略模式在加減乘除計算中的應用,並討論其優點與實作注意事項,幫助工程師更有效地應用此模式以應對程式碼維護挑戰。
Thumbnail
本文專注於策略模式,旨在通過將函數封裝為策略來簡化程式碼的維護與測試。隨著專案規模的擴大,重構的重要性顯著提高,而策略模式能有效減少程式碼中的條件語句,提升可讀性與易測性。透過範例介紹策略模式在加減乘除計算中的應用,並討論其優點與實作注意事項,幫助工程師更有效地應用此模式以應對程式碼維護挑戰。
Thumbnail
最近常在思考,軟體開發的品質到底是什麼,我們能承擔的品質出問題的風險有多大?在軟體開發過程,無論你是走Scrum或是DevOps的開發流程,都希望交付出來的軟體品質是好的,因此,每當談軟體開發中的測試種類就包含這些議題
Thumbnail
最近常在思考,軟體開發的品質到底是什麼,我們能承擔的品質出問題的風險有多大?在軟體開發過程,無論你是走Scrum或是DevOps的開發流程,都希望交付出來的軟體品質是好的,因此,每當談軟體開發中的測試種類就包含這些議題
Thumbnail
這本書是在 Agile Tour 2015 聽完作者本人演講後買的,不過,還真的沒挪出什麼時間把它看完,直到最近因為一些因素終於有時間把它看完了,所以上述很多摘錄都是心有戚戚焉。看是看完了,也別因為我上面都把好處寫出來就覺得看板方法好棒棒,一定也可以適用在你的團隊,真的嗎?
Thumbnail
這本書是在 Agile Tour 2015 聽完作者本人演講後買的,不過,還真的沒挪出什麼時間把它看完,直到最近因為一些因素終於有時間把它看完了,所以上述很多摘錄都是心有戚戚焉。看是看完了,也別因為我上面都把好處寫出來就覺得看板方法好棒棒,一定也可以適用在你的團隊,真的嗎?
Thumbnail
為了確保產品順利開發完成並上線,產品經理需要擁有自己的一套原則/產品思維,包括需求分類、用戶體驗、問題導向、數據驅動等,才能讓讓產品團隊更有效地執行項目、降地風險,最終交付解決用戶需求且具有競爭力的產品。
Thumbnail
為了確保產品順利開發完成並上線,產品經理需要擁有自己的一套原則/產品思維,包括需求分類、用戶體驗、問題導向、數據驅動等,才能讓讓產品團隊更有效地執行項目、降地風險,最終交付解決用戶需求且具有競爭力的產品。
Thumbnail
隨著組織擴張,從管理自己的專案 現在也變成管理一個科,底下帶PM 也在招募新的PM 今天我從我面試人的角度 講一下,倘若你想應徵專案經理(PM)這個職位 應該要著重在什麼點,更能打動面試官 有三點我覺得要特別注意
Thumbnail
隨著組織擴張,從管理自己的專案 現在也變成管理一個科,底下帶PM 也在招募新的PM 今天我從我面試人的角度 講一下,倘若你想應徵專案經理(PM)這個職位 應該要著重在什麼點,更能打動面試官 有三點我覺得要特別注意
Thumbnail
讀完這篇文章,你可以學習到如何具體將腦中的思緒歸納整理,並具體扼要地向面試官表達出自己的看法。
Thumbnail
讀完這篇文章,你可以學習到如何具體將腦中的思緒歸納整理,並具體扼要地向面試官表達出自己的看法。
Thumbnail
自今年起,我開始接手了公司的GLP規範之章程的建立,從零開始,到今年也建構了一年,過程中也對流程建立也有些心得,也深刻理解這不是件容易的事情,一方面需要釐清目標與現況資源的差距,在有意義的規範下河有限的資源創造出最可行的規範,是一門專業。此篇跟大家聊聊,如何從零到有。
Thumbnail
自今年起,我開始接手了公司的GLP規範之章程的建立,從零開始,到今年也建構了一年,過程中也對流程建立也有些心得,也深刻理解這不是件容易的事情,一方面需要釐清目標與現況資源的差距,在有意義的規範下河有限的資源創造出最可行的規範,是一門專業。此篇跟大家聊聊,如何從零到有。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News