D13 - 測試不只是找到錯誤:探索單元測試的價值與具體做法

閱讀時間約 9 分鐘

哈囉,大家好!經過前面的努力,我們已經建立了個人財務管理系統的基本功能。現在,是時候來確保我們的程式碼品質了。今天,我想和大家聊聊單元測試,以及它為什麼不僅僅是為了找出錯誤,更是提升我們開發技能的重要一環。

一、為什麼要進行單元測試?

還記得有一次,我在專案中修改了一個小小的函式,結果導致其他功能無法正常運作。那時候才深刻體會到單元測試的重要性。單元測試不僅能幫助我們找到潛在的錯誤,更能:

  • 提高程式碼品質:確保每個模組都能按照預期運作。
  • 增強自信心:修改程式碼時,不用擔心會破壞現有功能。
  • 促進重構:有了測試的保護傘,重構程式碼變得更安心。

二、Laravel 的測試環境

Laravel 內建了強大的測試框架,使用 PHPUnit 進行測試。我們可以輕鬆地為應用程式撰寫和執行測試。

  • 測試目錄:tests/,包含 Feature 和 Unit 兩個子目錄。
  • 測試類別:繼承自 Tests\TestCase,讓我們可以使用 Laravel 提供的各種測試工具。

三、開始撰寫單元測試

1. 建立測試資料庫

為了不影響開發資料庫,我們需要為測試環境建立一個獨立的資料庫。

  • 建立測試資料庫:例如 personal_finance_test。
  • 設定 .env.testing 檔案:複製 .env 檔案為 .env.testing,修改資料庫連線資訊。

2. 建立測試類別

使用 Artisan 指令建立測試類別:

php artisan make:test Models/UserTest --unit

這會在 tests/Unit/Models 目錄下建立 UserTest.php。

3. 編寫測試方法

在 UserTest.php 中,我們可以開始撰寫測試。

<?php

namespace Tests\Unit\Models;

use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

class UserTest extends TestCase
{
use RefreshDatabase;

/** @test */
public function it_can_create_a_user()
{
$user = User::factory()->create([
'username' => 'testuser',
'email' => 'test@example.com',
]);

$this->assertDatabaseHas('users', [
'username' => 'testuser',
'email' => 'test@example.com',
]);
}
}

4. 執行測試

在終端機中執行:

php artisan test --filter=it_can_create_a_user

如果測試通過,恭喜你!我們的第一個單元測試成功了。

四、為其他模型撰寫測試

1. BankAccount 模型

建立測試類別:

php artisan make:test Models/BankAccountTest --unit

撰寫測試:

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

$bankAccount = $user->bankAccounts()->create([
'account_name' => '薪資帳戶',
'account_number' => '12345678',
'bank_name' => '台灣銀行',
'balance' => 1000.00,
]);

$this->assertDatabaseHas('bank_accounts', [
'account_name' => '薪資帳戶',
'user_id' => $user->id,
]);
}

2. Category 模型

同樣地,建立 CategoryTest,撰寫測試。

3. Transaction 模型

建立 TransactionTest,撰寫測試。

五、測試模型關聯

我們可以測試模型之間的關聯是否正確。

/** @test */
public function a_user_can_have_multiple_bank_accounts()
{
$user = User::factory()->create();
$user->bankAccounts()->createMany([
['account_name' => '帳戶一', 'balance' => 500],
['account_name' => '帳戶二', 'balance' => 1000],
]);

$this->assertCount(2, $user->bankAccounts);
}

小小補充

如果你不想在方法名稱中加上 test_ 前綴,可以使用 /** @test */ 註解來替代,它的作用是告訴PHPUnit 這個方法是一個測試

好處:• 語義化:這樣可以讓測試方法名稱更符合自然語言,例如 user_can_be_created,而不需要強制使用test_ 前綴。• 可讀性高:去掉了不必要的 test_ 前綴,讓測試方法的命名更簡潔和易讀。



六、使用 Factory 和 Seeder

1. 建立 Factory

Laravel 的 Factory 讓我們可以輕鬆生成測試資料。

// database/factories/UserFactory.php

public function definition()
{
return [
'username' => $this->faker->userName,
'email' => $this->faker->unique()->safeEmail,
'password' => bcrypt('password'),
];
}

2. 使用 Seeder

我們可以在測試中使用 Seeder 來填充資料庫。

// tests/TestCase.php

protected function setUp(): void
{
parent::setUp();
$this->seed();
}

七、我的心得與建議

剛開始寫單元測試時,可能會覺得多了一道工序,但長遠來看,真的省下不少時間。以下是我的一些心得:

  • 從小處開始:不用一開始就寫非常複雜的測試,先從簡單的功能測試起。
  • 持續累積:每新增一個功能,就為它撰寫相應的測試。
  • 享受過程:看到綠色的通過標記,真的會讓人心情愉悅!

單元測試還可以延伸更多的議題,但我們先保留著~

小結

透過單元測試,我們不僅能確保程式碼的品質,更能提升自己的開發技能。希望大家能夠開始嘗試在專案中加入單元測試,享受其中的樂趣與成就感。

這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,作者都用幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
本文介紹了如何在 Laravel 中實作控制器,為個人財務管理系統建立完整的 CRUD API。我們實現了資料的建立、查詢、更新和刪除,並使用資料驗證提升應用安全性。未來將進行程式碼重構及 API 測試,持續優化應用程式。
本文介紹 Laravel 中的路由設定,討論手動定義路由、群組、前綴和中介層的使用。透過這些技巧,能夠靈活組織 API 結構,提升可讀性和安全性。此外,還探討子資源路由及命名空間等進階技巧,幫助開發者精細控制路由行為。接下來會探討控制器的實作。
本文介紹 Laravel 中的 Model,透過 Eloquent ORM 進行資料庫互動。內容涵蓋 Model 建立、資料表關聯設定,以及利用 Eloquent 特性來優化程式碼。目的是簡化資料庫操作,提高程式碼可讀性與維護性。接下來將開發後端 API,進一步實現系統功能。
這篇文章介紹在 Laravel 中使用 Migration 管理資料庫結構,實現財務管理系統的資料表建立。Migration 提供版本控制、自動化管理和可移植性,方便開發者同步資料庫變更。還介紹了填充測試資料(Seeder)的操作,提高團隊協作效率。
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
好了,經過前幾篇的努力,我們的開發環境已經搭建完成,並進行了初步的測試。一切看起來都很順利,但在正式進入開發之前,我們還有一件重要的事情要做:加入版本控制。 你可能會想:「現在還早吧?我一個人開發,有必要嗎?」但相信我,版本控制就像是遊戲中的存檔點,或者電影裡的多重宇宙時間線,在你需要的時候,
本文介紹了如何在 Laravel 中實作控制器,為個人財務管理系統建立完整的 CRUD API。我們實現了資料的建立、查詢、更新和刪除,並使用資料驗證提升應用安全性。未來將進行程式碼重構及 API 測試,持續優化應用程式。
本文介紹 Laravel 中的路由設定,討論手動定義路由、群組、前綴和中介層的使用。透過這些技巧,能夠靈活組織 API 結構,提升可讀性和安全性。此外,還探討子資源路由及命名空間等進階技巧,幫助開發者精細控制路由行為。接下來會探討控制器的實作。
本文介紹 Laravel 中的 Model,透過 Eloquent ORM 進行資料庫互動。內容涵蓋 Model 建立、資料表關聯設定,以及利用 Eloquent 特性來優化程式碼。目的是簡化資料庫操作,提高程式碼可讀性與維護性。接下來將開發後端 API,進一步實現系統功能。
這篇文章介紹在 Laravel 中使用 Migration 管理資料庫結構,實現財務管理系統的資料表建立。Migration 提供版本控制、自動化管理和可移植性,方便開發者同步資料庫變更。還介紹了填充測試資料(Seeder)的操作,提高團隊協作效率。
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
好了,經過前幾篇的努力,我們的開發環境已經搭建完成,並進行了初步的測試。一切看起來都很順利,但在正式進入開發之前,我們還有一件重要的事情要做:加入版本控制。 你可能會想:「現在還早吧?我一個人開發,有必要嗎?」但相信我,版本控制就像是遊戲中的存檔點,或者電影裡的多重宇宙時間線,在你需要的時候,
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
這篇文章探討了工程師在如何有效提升自己,強調不僅僅是多coding,而是要對程式碼有更深層的理解。隨著職涯發展,工程師需要從單純的技術執行者轉變為團隊領導者,具備解決複雜問題和與他人有效溝通的能力。
1.以下何者為辦理業務執行成效評估之評析作業重點? 檔案管理作業達成預期成效指標之程度 未能達成目標或作業成效之原因檢討 未來執行較佳之方法或替選方案 (O) 以上皆對 2.(X)為利進行檔案管理各項事務,應於檔案庫房設置辦公空間 3.(O)檔案
在現代企業管理中,如何有效地處理各類工作任務與客戶需求,是提高整體運營效率的核心。工單系統,作為一種集成管理工具,已成為許多企業提升效率與服務質量的重要手段。
Thumbnail
寫作對產品經理來說有著重要的作用,不僅促進自我審視,還有助於邏輯思維和溝通技巧的培養。此外,透過寫作,產品經理可以與全球頂級的專業人士進行交流,提高自己的技能和保持競爭力。
Thumbnail
這篇文章著重於解釋軟體專案管理中的戰略意義和專案特性評估,並提出了四個不同像限的專案特性。
在寫這篇文的時候…回頭看了自己之前的文章… 2024/04/12也寫過類似的標題… 說實話…經過了幾個月…又有了新的體悟…  發現…同一種課題… 過了一關之後…還會有…升級版的挑戰… 升級版的挑戰…是什麼? 你應該差不多猜到了… 就是…我~打~臉~了!!! 04/12那篇文的Tips…在
這篇文章討論了「看清楚,想明白,做出來」這個簡單卻充滿啟發性的思考方式,並探討了在工作與人生中應用這種思維的重要性。
Thumbnail
專案失敗以往被定義為超期、超預算或無法結案,但現今專案管理思維重新把失敗定義為未能產生預期價值。文章從產品經理、軟體設計和管理流程三方面提出對失敗專案的見解和解決方法。
Thumbnail
這篇文章描述了作者從兼職開發轉為全職開發的過程,並分享了從混進學界指日可待的積極態度。作者也提及自己在專案製作與個人生活上的矛盾與感想,最後分享了專案管理和敏捷開發相關的文章與影片。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
這篇文章探討了工程師在如何有效提升自己,強調不僅僅是多coding,而是要對程式碼有更深層的理解。隨著職涯發展,工程師需要從單純的技術執行者轉變為團隊領導者,具備解決複雜問題和與他人有效溝通的能力。
1.以下何者為辦理業務執行成效評估之評析作業重點? 檔案管理作業達成預期成效指標之程度 未能達成目標或作業成效之原因檢討 未來執行較佳之方法或替選方案 (O) 以上皆對 2.(X)為利進行檔案管理各項事務,應於檔案庫房設置辦公空間 3.(O)檔案
在現代企業管理中,如何有效地處理各類工作任務與客戶需求,是提高整體運營效率的核心。工單系統,作為一種集成管理工具,已成為許多企業提升效率與服務質量的重要手段。
Thumbnail
寫作對產品經理來說有著重要的作用,不僅促進自我審視,還有助於邏輯思維和溝通技巧的培養。此外,透過寫作,產品經理可以與全球頂級的專業人士進行交流,提高自己的技能和保持競爭力。
Thumbnail
這篇文章著重於解釋軟體專案管理中的戰略意義和專案特性評估,並提出了四個不同像限的專案特性。
在寫這篇文的時候…回頭看了自己之前的文章… 2024/04/12也寫過類似的標題… 說實話…經過了幾個月…又有了新的體悟…  發現…同一種課題… 過了一關之後…還會有…升級版的挑戰… 升級版的挑戰…是什麼? 你應該差不多猜到了… 就是…我~打~臉~了!!! 04/12那篇文的Tips…在
這篇文章討論了「看清楚,想明白,做出來」這個簡單卻充滿啟發性的思考方式,並探討了在工作與人生中應用這種思維的重要性。
Thumbnail
專案失敗以往被定義為超期、超預算或無法結案,但現今專案管理思維重新把失敗定義為未能產生預期價值。文章從產品經理、軟體設計和管理流程三方面提出對失敗專案的見解和解決方法。
Thumbnail
這篇文章描述了作者從兼職開發轉為全職開發的過程,並分享了從混進學界指日可待的積極態度。作者也提及自己在專案製作與個人生活上的矛盾與感想,最後分享了專案管理和敏捷開發相關的文章與影片。