Laravel Test 實戰:與框架結合的測試技巧

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

從 PHPUnit 到 Laravel Test

在前兩篇文章中,我們先談了為什麼「還沒開始單元測試的你一定很忙」,並介紹了如何使用純粹的 PHPUnit 從 0 到 1 寫出第一支測試。

現在,我們要走得更深、更實務:如果你是使用 Laravel 進行開發,那 Laravel 本身就整合了 PHPUnit,並且提供了許多「框架級」的測試輔助工具,讓測試前後端互動、資料庫操作、使用者身份驗證等都更加便捷。

本篇目標:帶領你認識 Laravel 的測試環境、常見的測試寫法,以及在 Laravel 專案中快速上手的技巧,讓測試不再只限於「函式級測試」,而是能全面涵蓋路由、Controller、資料庫、認證機制等。


Laravel 測試的環境設置

以下使用的版本是 Laravel 10

預設結構與設定

測試目錄:Laravel 在專案根目錄下預設有 tests/ 資料夾,一般會依照功能類型(Feature、Unit 等)進行區分。

Laravel 預設的測試目錄結構如下:

tests/
├── Feature/
│ └── ExampleTest.php
├── Unit/
│ └── ExampleTest.php
└── TestCase.php
  • Feature 測試:用於測試應用的高階行為,例如路由、Controller 和資料庫操作。
  • Unit 測試:用於測試單一功能或方法的邏輯,通常與框架無關。

你可以根據專案需求進一步擴展這個結構,例如:

tests/
├── Feature/
│ ├── Auth/
│ │ └── LoginTest.php
│ ├── ArticleTest.php
├── Unit/
│ ├── Models/
│ │ └── ArticleTest.php
└── TestCase.php

phpunit.xml:Laravel 預設會有一個 phpunit.xml 檔案,用來指定測試設定(例如測試資料庫的連線設定、Bootstrap 路徑)。

為避免測試影響開發資料,建議設定一個測試專用資料庫:

.env.testing 配置:

DB_CONNECTION=mysql
DB_DATABASE=testing_db
DB_USERNAME=root
DB_PASSWORD=

phpunit.xml 指定環境變數:

<server name="APP_ENV" value="testing"/>

執行測試:在 Laravel 專案中,你可以直接使用

或者依舊可以執行:

這兩種方式都是「同一套」,只是 artisan test 會多一些 Laravel 特有的報告樣式與懶人指令。

php artisan test
vendor/bin/phpunit

雖然 Laravel 已經幫我們「預設」了不少東西,但並不是每個專案的架構都一樣。你仍可以自訂測試目錄、切分更多測試子資料夾。這取決於團隊規模與習慣。


測試 HTTP 路由與 Controller

在 Laravel 專案中,最常見的測試場景之一,就是測試「透過 HTTP 路由呼叫 Controller 是否能得到預期結果」。Laravel 提供了一套流暢的 API 讓我們可以撰寫這類測試。

建立測試檔

假設我們要測試一個簡單的文章列表功能(ArticleController@index)。我們可以在 tests/Feature/ArticleTest.php 建立測試檔:

<?php

namespace Tests\\Feature;

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

class ArticleTest extends TestCase
{
use RefreshDatabase;

public function testArticleIndexReturnsData()
{
// Arrange: 建立測試用資料
Article::factory()->count(3)->create();

// Act: 透過 GET 方式請求 /articles
$response = $this->get('/articles');

// Assert: 驗證回應狀態碼與資料
$response->assertStatus(200);
$response->assertSeeText('Title'); // 假設 Blade 模板會顯示文章標題
}
}

主要測試方法解說

  • $this->get('/articles'):模擬一個對路由 /articles 的 GET 請求,並獲得回應。
  • assertStatus(200):斷言 HTTP 回應狀態碼是否是 200 OK。
  • assertSeeText('Title'):檢查回應的內容中,是否包含「Title」字串。

這樣就能確保我們在 Controller / Blade 中渲染的資料確實包含在回應中。

RefreshDatabase 的作用

  • use RefreshDatabase;:每次測試執行前後,會自動「回復資料庫狀態」,通常是透過跑 migration 讓資料庫保持乾淨,避免測試彼此干擾。
  • 這對測試資料庫操作時非常重要,否則如果你的測試共用了同一個資料庫狀態,很可能因為前後次序或殘留資料而導致測試結果不一致。

透過具體的例子與方法呼叫,證明 Laravel Test 能輕鬆測試 Controller 與資料庫互動。只要能舉出一個實作成功的案例,就證明了它的可行性與便利性。


測試資料庫與 Model

除了直接透過路由做測試,你也可以針對 Model 的邏輯與資料庫互動進行更細微的測試。

<?php

namespace Tests\\Unit;

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

class ArticleModelTest extends TestCase
{
use RefreshDatabase;

public function testArticleCreation()
{
$article = Article::factory()->create([
'title' => 'Test Title',
]);

// 斷言:資料庫有這筆資料
$this->assertDatabaseHas('articles', [
'title' => 'Test Title',
]);

// 斷言:這筆資料有自動產生的 ID
$this->assertNotNull($article->id);
}
}

  • assertDatabaseHas():檢查資料表中是否存在指定條件的紀錄。
  • 這比起寫生硬的 SQL 查詢再自己判斷要更方便,也更貼近 Laravel 的語法風格。

驗證與認證測試:actingAs()

在實際應用中,很多功能都需要使用者登入、角色驗證等。Laravel 測試中提供了 actingAs() 讓你能模擬使用者身份。

public function testUserCanSeeProfilePage()
{
$user = User::factory()->create();

// 模擬該用戶登入
$response = $this->actingAs($user)->get('/profile');

$response->assertStatus(200);
$response->assertSeeText($user->name);
}

這樣就能在測試時,直接測試「某用戶」存取某頁面是否正確,而不用真的在瀏覽器裡點擊登入流程。


更多測試技巧

  1. json() 與 API 測試
    • 如果你開發的是 API 端點,可以使用 $this->json('POST', '/api/articles', [...]),並用 assertJson()assertJsonFragment() 等方法做 JSON 回應檢查。
  2. Mock 與依賴注入
    • Laravel 的 Service Container 能搭配 PHPUnit 的 Mock 機制,模擬外部服務(例如第三方 API 呼叫),減少測試時需依賴真實服務的風險。
  3. 事件與排程測試
    • 對於觸發事件(Event)、監聽器(Listener),或是使用 Laravel Scheduler 的功能,也可以在測試中手動觸發並檢驗邏輯。

上面列舉的只是常見的測試技巧,每個專案可能會遇到更複雜的情境(例如多層次的前後端整合、大量第三方 API 介接等)。Laravel 的測試工具箱夠豐富,但仍需配合更完整的設計與規劃才能覆蓋所有情境。


測試與開發的流程建議

  1. 先寫測試,再寫功能(TDD 思維)
    • 即便你不是真的嚴格落實 TDD,先用測試描述需求,再開始開發,也能讓程式碼更聚焦、邏輯更清晰。
  2. 善用 Artisan 指令
    • php artisan make:test MyFeatureTest --unit 可以快速生成測試檔案,省去手動建立檔案、引用命名空間的麻煩。
  3. 持續執行測試
    • 在開發過程中,隨時執行 php artisan test,保持測試「綠燈」狀態;一旦出現紅燈就立刻修正。

透過持續跑測試,你可以很明顯感受到「有測試」帶來的安心感,一旦程式邏輯被破壞,測試會第一時間告訴你,比人肉檢查更有效率。


更完整的測試布局

在 Laravel 生態系中,撰寫測試不僅能驗證「程式是否正常」,也能檢查「介面與資料庫整合度」、「使用者角色驗證是否正確」、「多步驟流程互動」等等。

這些功能在純粹的 PHPUnit 環境下也做得到,但 Laravel 提供了大量的快捷方法與輔助工具,讓你不必從頭自己組裝一堆測試工具。

  • 用上述範例和方法,你就能看到 Laravel Test 的便利性,並「證明」測試在實務專案中大大提升效率。
  • 並非所有專案都會用到相同的測試技巧,也不是所有人都需依賴相同的套件或寫法。面對多元的業務需求,還是需要彈性的思考與調整。

預告下一篇:測試的思維轉換

到這裡,我們已經能運用 Laravel Test 基本的實作技巧。但測試除了技術層面,還有一個更重要的部分——如何將測試思維拓展到團隊層面?

在下一篇,我們將探討「測試的思維轉換:從個人到團隊的測試策略」。如何讓整個團隊一起落實測試,並在專案合作中形塑出穩固且有效率的開發流程?敬請期待!


文章重點回顧

  1. Laravel Test 環境與結構tests/ 資料夾、phpunit.xmlartisan test
  2. 測試 HTTP 路由與 Controllerget(), post() 等方法與 assertStatus(), assertSeeText()
  3. 測試資料庫與 ModelassertDatabaseHas()RefreshDatabase 等工具,確保資料庫狀態一致性。
  4. 使用者驗證與認證測試actingAs() 輕鬆模擬登入。
  5. 更多技巧:API 測試、Mock 依賴、事件與排程測試。
  6. 思維建議:持續測試、融入開發流程,體會有測試的安心感。

透過這些範例,希望你能漸漸培養在 Laravel 中「自然而然就想寫測試」的好習慣。下篇文章,讓我們進一步聊聊如何把測試從個人的行為,擴展到整個團隊的合作策略!

留言
avatar-img
留言分享你的想法!
avatar-img
詹姆士的軟體易開罐
26會員
82內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2025/04/05
if寫得好,可以大大提高效率與可讀性。 Guard condition在函式起始先排除不合規輸入,能簡化結構、減少錯誤,使核心邏輯更聚焦並提高可維護性,也方便擴充與測試,在團隊協作和需求變動時,都能更快速應對。建議根據實際情況彈性運用,兼顧可讀性與維護成本。
Thumbnail
2025/04/05
if寫得好,可以大大提高效率與可讀性。 Guard condition在函式起始先排除不合規輸入,能簡化結構、減少錯誤,使核心邏輯更聚焦並提高可維護性,也方便擴充與測試,在團隊協作和需求變動時,都能更快速應對。建議根據實際情況彈性運用,兼顧可讀性與維護成本。
Thumbnail
2025/01/24
還記得我剛開始負責專案時,幾乎沒有人在意測試,改了程式碼就直接上線,結果小錯不斷、大災難頻傳。那種不知道哪裡會冒出 bug 的焦慮感,讓人每天都忙到焦頭爛額,卻依舊無從掌握系統品質。走過這段混亂的過程後,我才真正體會「為什麼需要測試」,也更明白「測試文化」並非只是技術細節。
Thumbnail
2025/01/24
還記得我剛開始負責專案時,幾乎沒有人在意測試,改了程式碼就直接上線,結果小錯不斷、大災難頻傳。那種不知道哪裡會冒出 bug 的焦慮感,讓人每天都忙到焦頭爛額,卻依舊無從掌握系統品質。走過這段混亂的過程後,我才真正體會「為什麼需要測試」,也更明白「測試文化」並非只是技術細節。
Thumbnail
2025/01/24
我想探討,從「個人測試」到「團隊測試策略」的思維轉換,強調測試不僅是個人的責任,更需要整個團隊的支持與參與。文章還提供了推動測試文化的具體建議,包括設定最小測試門檻、融入開發流程,以及如何克服常見的困境如進度壓力或技術債問題。
Thumbnail
2025/01/24
我想探討,從「個人測試」到「團隊測試策略」的思維轉換,強調測試不僅是個人的責任,更需要整個團隊的支持與參與。文章還提供了推動測試文化的具體建議,包括設定最小測試門檻、融入開發流程,以及如何克服常見的困境如進度壓力或技術債問題。
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
本篇文章簡要介紹自動化測試的基本概念及相關的測試套件,並探討了在CI/CD流程中整合自動化測試的重要性,及如何使用Faker和Mockery來生成測試資料和模擬物件。最後,分享了自動化測試在後端開發中的必要性與實踐建議,旨在提升程式碼品質及降低維護成本。
Thumbnail
本篇文章簡要介紹自動化測試的基本概念及相關的測試套件,並探討了在CI/CD流程中整合自動化測試的重要性,及如何使用Faker和Mockery來生成測試資料和模擬物件。最後,分享了自動化測試在後端開發中的必要性與實踐建議,旨在提升程式碼品質及降低維護成本。
Thumbnail
這篇文章深入探討 PHP 中的 Array 與 Laravel 框架中的 Collection 之間的主要差異,並分析各自的優缺點。文章介紹了兩者在本質、方法連鎖、高階方法及 Eloquent 互動的區別,並提供實際的使用案例,幫助初學者更好地理解這兩種資料結構的特性。
Thumbnail
這篇文章深入探討 PHP 中的 Array 與 Laravel 框架中的 Collection 之間的主要差異,並分析各自的優缺點。文章介紹了兩者在本質、方法連鎖、高階方法及 Eloquent 互動的區別,並提供實際的使用案例,幫助初學者更好地理解這兩種資料結構的特性。
Thumbnail
本篇文章介紹了Laravel這個開源PHP框架,重點解析其MVC架構及相關功能,包括中介層、服務層、數據傳輸對象(DTO)與值對象(VO)。Laravel的穩定性與擴展性使其成為臺灣許多企業的首選框架,並提供升級與編碼風格的資源參考,適合所有PHP開發者瞭解和掌握。
Thumbnail
本篇文章介紹了Laravel這個開源PHP框架,重點解析其MVC架構及相關功能,包括中介層、服務層、數據傳輸對象(DTO)與值對象(VO)。Laravel的穩定性與擴展性使其成為臺灣許多企業的首選框架,並提供升級與編碼風格的資源參考,適合所有PHP開發者瞭解和掌握。
Thumbnail
我們在過去的文章中討論了使用 PHPUnit 寫單元測試的基礎,現在要帶你進一步探索 Laravel Test 的魅力。
Thumbnail
我們在過去的文章中討論了使用 PHPUnit 寫單元測試的基礎,現在要帶你進一步探索 Laravel Test 的魅力。
Thumbnail
為什麼要學 PHPUnit? 在上一篇文章裡,我們聊到了「還沒開始單元測試的你一定很忙」,同時也鼓勵大家「一個人就能開始測試」。那麼接下來就要進入更實際的操作層面,帶你走進 PHP 最常見的測試框架 —— PHPUnit。
Thumbnail
為什麼要學 PHPUnit? 在上一篇文章裡,我們聊到了「還沒開始單元測試的你一定很忙」,同時也鼓勵大家「一個人就能開始測試」。那麼接下來就要進入更實際的操作層面,帶你走進 PHP 最常見的測試框架 —— PHPUnit。
Thumbnail
撰寫程式碼時,測試扮演著至關重要的角色,能有效確保程式碼品質與穩定性。本文深入探討單元測試 (Unit Test) 與功能測試 (Feature Test) 的差異、應用場景及實務操作,並以 3A 原則 與 PHPUnit 指令範例,幫助開發者提升程式碼測試效率及可維護性。
Thumbnail
撰寫程式碼時,測試扮演著至關重要的角色,能有效確保程式碼品質與穩定性。本文深入探討單元測試 (Unit Test) 與功能測試 (Feature Test) 的差異、應用場景及實務操作,並以 3A 原則 與 PHPUnit 指令範例,幫助開發者提升程式碼測試效率及可維護性。
Thumbnail
測試對於構建複雜的 Vue 應用至關重要,因為它能防止回歸並鼓勵將應用拆分為可測試的模組。我們介紹了測試的基本術語和推薦的工具,包括單元測試、組件測試和端對端測試。建議越早開始測試,避免隨著時間推移而增加的相依性。單元測試專注於函數和邏輯的正確性,而組件測試則驗證 UI 元素的行為與交互。
Thumbnail
測試對於構建複雜的 Vue 應用至關重要,因為它能防止回歸並鼓勵將應用拆分為可測試的模組。我們介紹了測試的基本術語和推薦的工具,包括單元測試、組件測試和端對端測試。建議越早開始測試,避免隨著時間推移而增加的相依性。單元測試專注於函數和邏輯的正確性,而組件測試則驗證 UI 元素的行為與交互。
Thumbnail
單元測試不僅能發現錯誤,更是提升開發技能的關鍵工具。Laravel 提供強大的測試框架,讓我們可以輕鬆撰寫測試。建立測試資料庫、撰寫測試方法、使用 Factory 生成測試資料,能確保程式碼穩定,並幫助開發者在修改與重構中更有信心。持續撰寫測試能提高程式碼品質,並讓開發過程更有條理與安全感。
Thumbnail
單元測試不僅能發現錯誤,更是提升開發技能的關鍵工具。Laravel 提供強大的測試框架,讓我們可以輕鬆撰寫測試。建立測試資料庫、撰寫測試方法、使用 Factory 生成測試資料,能確保程式碼穩定,並幫助開發者在修改與重構中更有信心。持續撰寫測試能提高程式碼品質,並讓開發過程更有條理與安全感。
Thumbnail
最近在研讀單元測試的藝術這本書,也剛好因為自己對單元測試的撰寫還沒有很游刃有餘XD,但由於我是挑重點看,簡單做個內容讀後感的整理
Thumbnail
最近在研讀單元測試的藝術這本書,也剛好因為自己對單元測試的撰寫還沒有很游刃有餘XD,但由於我是挑重點看,簡單做個內容讀後感的整理
Thumbnail
介紹 通常我們程式寫完之後,要確保程式沒問題我們就會進行測試 在這裡我們將測試分兩大類: 單元測試(Unit Test,UT):對程式碼的最小單位所進行的測試 整合測試(Integration Test):系統/模組之間的測試,通常會接觸到真實系統 在這裡只會簡單介紹一下單元測試的概念 這裡在將單元
Thumbnail
介紹 通常我們程式寫完之後,要確保程式沒問題我們就會進行測試 在這裡我們將測試分兩大類: 單元測試(Unit Test,UT):對程式碼的最小單位所進行的測試 整合測試(Integration Test):系統/模組之間的測試,通常會接觸到真實系統 在這裡只會簡單介紹一下單元測試的概念 這裡在將單元
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News