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
詹姆士的軟體易開罐
33會員
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 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
看完上篇 4 位新成員的靈魂拷問,是不是意猶未盡?別急,野格團新血的驚喜正接著登場!今天下篇接力的另外 4 位「個人主題專家」,戰力同樣驚人──領域從旅行美食、運動、商業投資到自我成長;這些人如何維持長跑般的創作動力?在爆紅的文章背後,又藏著哪些不為人知的洞察?5 大靈魂拷問繼續出擊
Thumbnail
看完上篇 4 位新成員的靈魂拷問,是不是意猶未盡?別急,野格團新血的驚喜正接著登場!今天下篇接力的另外 4 位「個人主題專家」,戰力同樣驚人──領域從旅行美食、運動、商業投資到自我成長;這些人如何維持長跑般的創作動力?在爆紅的文章背後,又藏著哪些不為人知的洞察?5 大靈魂拷問繼續出擊
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