D14 - 完整驗證應用程式:為重構築起無憂的安全防線

更新 發佈閱讀 6 分鐘

哈囉,大家好!讓我們延續單元測試議題,在這篇文章中,我想和大家聊聊單元測試的延伸議題,重構的重要性,特別是它如何為我們的程式碼提供一層安全防線,讓我們在重構時可以無後顧之憂。


一、為什麼重構需要安全防線?

在開發過程中,難免會遇到需要重構的情況。也許一開始的設計不夠完善,或者需求發生了變化。然而,隨著專案的複雜度增加,每次修改都有可能影響到其他部分。這種不確定性常常讓人感到焦慮,甚至不敢輕易動手。

還記得有一次,我在一個專案中需要優化一個看似簡單的函式。結果,一改之下,整個系統都出現了奇怪的錯誤。當時真是頭大,花了好幾個小時才找到問題所在。那次經驗讓我深刻體會到,沒有單元測試的保護,重構真的像是在走鋼索,一不小心就可能摔得很慘。

二、單元測試如何提供保護?

單元測試的目的,不僅僅是為了找到錯誤,更是為我們的程式碼建立一個可靠的基礎。透過撰寫針對各個功能的測試,我們可以:

  • 確認程式碼的正確性:確保每個模組都按照預期運作。
  • 預防回歸錯誤:修改程式碼時,立即發現是否破壞了既有功能。
  • 提高程式碼品質:促使我們寫出更模組化、可測試的程式碼。
    這樣一來,我們在進行重構時,就有了一層安全網。不用再擔心改了一行程式碼,卻導致其他地方出問題。

三、實際應用:為重構撰寫單元測試

讓我們以實際例子來看看如何利用單元測試為重構保駕護航。

1. 撰寫現有功能的測試

假設我們有一個 Transaction 模型,裡面有一個計算用戶總收入的方法:

public function calculateTotalIncome($userId)
{
return $this->where('user_id', $userId)
->where('type', 'income')
->sum('amount');
}

在進行重構前,我們先為這個方法撰寫單元測試:

/** @test */
public function it_calculates_total_income_correctly()
{
$user = User::factory()->create();
Transaction::factory()->create(['user_id' => $user->id, 'type' => 'income', 'amount' => 1000]);
Transaction::factory()->create(['user_id' => $user->id, 'type' => 'income', 'amount' => 2000]);
Transaction::factory()->create(['user_id' => $user->id, 'type' => 'expense', 'amount' => 500]);

$totalIncome = (new Transaction())->calculateTotalIncome($user->id);

$this->assertEquals(3000, $totalIncome);
}

2. 進行重構

假設我們覺得這個方法應該放到 User 模型裡,更符合邏輯。因此,我們將方法移到 User 模型:

public function calculateTotalIncome()
{
return $this->transactions()
->where('type', 'income')
->sum('amount');
}

3. 執行測試,確認功能正常

重構後,重新執行測試:

php artisan test --filter=it_calculates_total_income_correctly

如果測試通過,表示我們的重構沒有破壞原有功能。

4. 擴充測試,涵蓋更多情境

我們可以進一步撰寫更多測試,確保各種情況下功能都正常。例如,當沒有收入時:

/** @test */
public function it_returns_zero_when_no_income()
{
$user = User::factory()->create();

$totalIncome = $user->calculateTotalIncome();

$this->assertEquals(0, $totalIncome);
}

四、反思:單元測試帶來的思考

透過這樣的過程,我們不僅確保了程式碼的品質,也讓自己對系統的理解更加深入。有時候,撰寫測試時會發現原本設計的不合理之處,進而促使我們思考更好的解決方案。

還有一次,我在撰寫測試時,發現某個方法的依賴太多,導致測試很難寫。這讓我意識到,這個方法需要被拆分或重構。結果,不僅測試變得容易,整個系統的結構也因此優化了。


五、結語

單元測試就像是我們程式碼的守護者,為我們築起一座安全的城牆。在這座城牆的保護下,我們可以更自在地進行重構,提升系統的品質和效能。

當然,撰寫測試需要時間和精力,但從長遠來看,這絕對是值得的投資。畢竟,誰也不想在深夜還在追著難纏的 Bug 跑。透過單元測試,我們可以更有信心地面對未來的挑戰。

留言
avatar-img
詹姆士的軟體易開罐
34會員
93內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/14
哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。 現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。 透過這次的實作,我們將學習如何在 N
Thumbnail
2024/12/14
哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。 現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。 透過這次的實作,我們將學習如何在 N
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
近年來AI技術快速發展,企業導入AI應用也日益普遍,但伴隨而來的資安風險不容忽視。本文探討如何利用CNS 27001:2023強化AI應用的資安管理,涵蓋雲端安全管理、AI數據隱私保護以及防止提示注入攻擊等面向,協助企業在AI時代建立完善的資安防禦機制,降低資安風險。
Thumbnail
近年來AI技術快速發展,企業導入AI應用也日益普遍,但伴隨而來的資安風險不容忽視。本文探討如何利用CNS 27001:2023強化AI應用的資安管理,涵蓋雲端安全管理、AI數據隱私保護以及防止提示注入攻擊等面向,協助企業在AI時代建立完善的資安防禦機制,降低資安風險。
Thumbnail
Windows事件紀錄檔是電腦系統管理中一個重要的工具。透過定期檢視事件紀錄檔,使用者可以及早發現系統異常、追蹤問題根源,並掌握系統安全性狀況。本文介紹了事件紀錄的分類、各類事件篩選項目,及如何自訂檢視和自動執行篩檢作業,幫助使用者提高檢查效率,強化系統安全性,從而減少潛在的運作風險。
Thumbnail
Windows事件紀錄檔是電腦系統管理中一個重要的工具。透過定期檢視事件紀錄檔,使用者可以及早發現系統異常、追蹤問題根源,並掌握系統安全性狀況。本文介紹了事件紀錄的分類、各類事件篩選項目,及如何自訂檢視和自動執行篩檢作業,幫助使用者提高檢查效率,強化系統安全性,從而減少潛在的運作風險。
Thumbnail
戴明強調系統運作一定會有異常,而解決問題的關鍵在於正確判明原因並提出對策。改善系統時,不應該只憑經驗,而應該依據知識理論來訂出行動方案。文章探討了事件中的特殊和共同因,並強調要讓系統回到原有的運作狀態。
Thumbnail
戴明強調系統運作一定會有異常,而解決問題的關鍵在於正確判明原因並提出對策。改善系統時,不應該只憑經驗,而應該依據知識理論來訂出行動方案。文章探討了事件中的特殊和共同因,並強調要讓系統回到原有的運作狀態。
Thumbnail
談了許多網路安全的議題,提醒民眾要注意哪些事情,建構哪些網路安全思維,讓我們可以降低踏入詐騙陷阱的風險。但除了民眾本身要不斷學習、提升防詐意識外,是不是還有其他方面的作法呢? 本文就來聊聊在企業端可以做些什麼。 要打造一個密不可破的防護網,企業端就不能夠缺席。 舉幾個例子讓大家知道。
Thumbnail
談了許多網路安全的議題,提醒民眾要注意哪些事情,建構哪些網路安全思維,讓我們可以降低踏入詐騙陷阱的風險。但除了民眾本身要不斷學習、提升防詐意識外,是不是還有其他方面的作法呢? 本文就來聊聊在企業端可以做些什麼。 要打造一個密不可破的防護網,企業端就不能夠缺席。 舉幾個例子讓大家知道。
Thumbnail
OWASP是一個開源的、非盈利的全球性安全組織,致力於應用軟件的安全研究。其使命是使應用軟件更加安全,使企業和組織能夠對應用安全風險作出更清晰的決策。目前OWASP全球擁有220個分部近六萬名會員,共同推動了安全標準、安全測試工具、安全指導手冊等應用安全技術的發展。
Thumbnail
OWASP是一個開源的、非盈利的全球性安全組織,致力於應用軟件的安全研究。其使命是使應用軟件更加安全,使企業和組織能夠對應用安全風險作出更清晰的決策。目前OWASP全球擁有220個分部近六萬名會員,共同推動了安全標準、安全測試工具、安全指導手冊等應用安全技術的發展。
Thumbnail
最近各種資安案件層出不窮,像是聯合新聞網的新聞,就有提到國泰世華銀在10月發生系統大當機,造成ATM、網銀和信用卡收單,以及好市多、全聯結帳程序癱瘓。跟在做資安的朋友討論,才知道原來源碼檢測(偵測整個原始碼架構)可以解決相關問題,這邊分享相關內容給需要的朋友囉!
Thumbnail
最近各種資安案件層出不窮,像是聯合新聞網的新聞,就有提到國泰世華銀在10月發生系統大當機,造成ATM、網銀和信用卡收單,以及好市多、全聯結帳程序癱瘓。跟在做資安的朋友討論,才知道原來源碼檢測(偵測整個原始碼架構)可以解決相關問題,這邊分享相關內容給需要的朋友囉!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News