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();
}

七、我的心得與建議

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

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

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

小結

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

留言
avatar-img
留言分享你的想法!
avatar-img
詹姆士的軟體易開罐
27會員
87內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
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
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
本篇文章簡要介紹自動化測試的基本概念及相關的測試套件,並探討了在CI/CD流程中整合自動化測試的重要性,及如何使用Faker和Mockery來生成測試資料和模擬物件。最後,分享了自動化測試在後端開發中的必要性與實踐建議,旨在提升程式碼品質及降低維護成本。
Thumbnail
本篇文章簡要介紹自動化測試的基本概念及相關的測試套件,並探討了在CI/CD流程中整合自動化測試的重要性,及如何使用Faker和Mockery來生成測試資料和模擬物件。最後,分享了自動化測試在後端開發中的必要性與實踐建議,旨在提升程式碼品質及降低維護成本。
Thumbnail
我們在過去的文章中討論了使用 PHPUnit 寫單元測試的基礎,現在要帶你進一步探索 Laravel Test 的魅力。
Thumbnail
我們在過去的文章中討論了使用 PHPUnit 寫單元測試的基礎,現在要帶你進一步探索 Laravel Test 的魅力。
Thumbnail
撰寫程式碼時,測試扮演著至關重要的角色,能有效確保程式碼品質與穩定性。本文深入探討單元測試 (Unit Test) 與功能測試 (Feature Test) 的差異、應用場景及實務操作,並以 3A 原則 與 PHPUnit 指令範例,幫助開發者提升程式碼測試效率及可維護性。
Thumbnail
撰寫程式碼時,測試扮演著至關重要的角色,能有效確保程式碼品質與穩定性。本文深入探討單元測試 (Unit Test) 與功能測試 (Feature Test) 的差異、應用場景及實務操作,並以 3A 原則 與 PHPUnit 指令範例,幫助開發者提升程式碼測試效率及可維護性。
Thumbnail
測試對於構建複雜的 Vue 應用至關重要,因為它能防止回歸並鼓勵將應用拆分為可測試的模組。我們介紹了測試的基本術語和推薦的工具,包括單元測試、組件測試和端對端測試。建議越早開始測試,避免隨著時間推移而增加的相依性。單元測試專注於函數和邏輯的正確性,而組件測試則驗證 UI 元素的行為與交互。
Thumbnail
測試對於構建複雜的 Vue 應用至關重要,因為它能防止回歸並鼓勵將應用拆分為可測試的模組。我們介紹了測試的基本術語和推薦的工具,包括單元測試、組件測試和端對端測試。建議越早開始測試,避免隨著時間推移而增加的相依性。單元測試專注於函數和邏輯的正確性,而組件測試則驗證 UI 元素的行為與交互。
Thumbnail
單元測試為重構提供了安全防線,確保程式碼在修改後仍能正常運作。透過撰寫測試,我們能夠提高程式碼品質、預防回歸錯誤,並在重構過程中更具信心。測試的過程不僅幫助找出錯誤,也促使我們深入思考系統設計,從而優化整體架構。
Thumbnail
單元測試為重構提供了安全防線,確保程式碼在修改後仍能正常運作。透過撰寫測試,我們能夠提高程式碼品質、預防回歸錯誤,並在重構過程中更具信心。測試的過程不僅幫助找出錯誤,也促使我們深入思考系統設計,從而優化整體架構。
Thumbnail
單元測試不僅能發現錯誤,更是提升開發技能的關鍵工具。Laravel 提供強大的測試框架,讓我們可以輕鬆撰寫測試。建立測試資料庫、撰寫測試方法、使用 Factory 生成測試資料,能確保程式碼穩定,並幫助開發者在修改與重構中更有信心。持續撰寫測試能提高程式碼品質,並讓開發過程更有條理與安全感。
Thumbnail
單元測試不僅能發現錯誤,更是提升開發技能的關鍵工具。Laravel 提供強大的測試框架,讓我們可以輕鬆撰寫測試。建立測試資料庫、撰寫測試方法、使用 Factory 生成測試資料,能確保程式碼穩定,並幫助開發者在修改與重構中更有信心。持續撰寫測試能提高程式碼品質,並讓開發過程更有條理與安全感。
Thumbnail
介紹 通常我們程式寫完之後,要確保程式沒問題我們就會進行測試 在這裡我們將測試分兩大類: 單元測試(Unit Test,UT):對程式碼的最小單位所進行的測試 整合測試(Integration Test):系統/模組之間的測試,通常會接觸到真實系統 在這裡只會簡單介紹一下單元測試的概念 這裡在將單元
Thumbnail
介紹 通常我們程式寫完之後,要確保程式沒問題我們就會進行測試 在這裡我們將測試分兩大類: 單元測試(Unit Test,UT):對程式碼的最小單位所進行的測試 整合測試(Integration Test):系統/模組之間的測試,通常會接觸到真實系統 在這裡只會簡單介紹一下單元測試的概念 這裡在將單元
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News