使用 Laravel Pest 撰寫測試程式

,

Pest 是一個輕量且具有表現力的 PHP 測試框架,專為簡化測試程式撰寫而設計。它與 Laravel 完美整合,提供了簡潔的語法和強大的功能。本文將深入探討如何在 Laravel 中使用 Pest 撰寫測試程式,並涵蓋每個重要細節。

1. Pest 測試的基本概念

Pest 的目標是簡化測試過程,讓代碼更易於閱讀和維護。與傳統的 PHPUnit 測試相比,Pest 的測試文件結構更為簡潔,並且支持自定義測試功能和掛鉤(Hooks)。

2. 建立 Pest 測試檔案

在 Laravel 中,測試檔案通常存放於 tests/ 目錄下。Pest 測試檔案的建立與 PHPUnit 相似,但 Pest 強調使用簡單的功能測試語法。

你可以使用以下 Artisan 命令來創建一個新的測試檔案:

php artisan make:test ExampleTest --pest

這將在 tests/Feature 資料夾中生成一個 Pest 測試檔案。如果需要單元測試,則使用以下命令:

php artisan make:test ExampleTest --unit --pest

3. 撰寫 Pest 測試

Pest 測試文件通常以 .php 檔案保存,並且使用簡單的函數來進行測試。以下是一個基本的功能測試範例:

test('user can view the home page', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
    $response->assertSee('Laravel');
});

這個測試非常直觀,它檢查用戶是否可以訪問首頁並看到 “Laravel” 字樣。

4. 使用掛鉤(Hooks)

Pest 提供了一些掛鉤方法,讓你可以在測試過程中執行特定的邏輯。例如,你可以使用 beforeEach 在每個測試運行之前執行一些操作:

beforeEach(function () {
    // 每個測試之前執行
    $this->user = User::factory()->create();
});

test('user can log in', function () {
    $response = $this->post('/login', [
        'email' => $this->user->email,
        'password' => 'password',
    ]);

    $response->assertRedirect('/home');
    $this->assertAuthenticatedAs($this->user);
});

在這裡,我們使用 beforeEach 來創建一個用戶,這樣每個測試都可以使用該用戶進行登錄測試。

5. 測試的自定義功能

Pest 允許你定義自定義的測試功能,這些功能可以被多個測試使用。這樣可以避免重複代碼並提升可維護性。

function actingAsAdmin()
{
    $admin = User::factory()->create(['is_admin' => true]);
    $this->actingAs($admin);
}

test('admin can access dashboard', function () {
    actingAsAdmin();

    $response = $this->get('/admin/dashboard');

    $response->assertStatus(200);
});

在這個範例中,我們定義了一個 actingAsAdmin 函數來模擬一個管理員用戶登錄,並在測試中使用它來驗證管理員是否能夠訪問頁面。

6. 測試資料準備

與 PHPUnit 相似,你可以使用 Laravel 的工廠和 Seeder 來準備測試資料。這可以確保每次測試運行時,都能有一致且隔離的資料集。

use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('a user can be created', function () {
    $user = User::factory()->create();

    $this->assertDatabaseHas('users', [
        'email' => $user->email,
    ]);
});

RefreshDatabase trait 會在每次測試後重置資料庫,確保資料一致性。

7. 測試中的斷言

Pest 提供了豐富的斷言方法,可以用來檢查測試結果。常用的斷言包括:

  • assertTrue/assertFalse:檢查布林值是否為真或假。
  • assertEquals:檢查兩個值是否相等。
  • assertCount:檢查集合中的項目數量。
  • assertDatabaseHas/assertDatabaseMissing:檢查資料庫中是否存在或不存在某筆資料。

這些斷言方法可以幫助你驗證程式的各種行為,確保它們符合預期。

8. 測試套件的組織與運行

在撰寫大量測試時,合理組織測試文件和套件至關重要。你可以將測試按功能或模組分組,並使用 Pest 的標籤(Tags)功能來組織和選擇性地運行測試。

test('a user can log out', function () {
    // 測試程式碼
})->group('auth');

test('an admin can delete a user', function () {
    // 測試程式碼
})->group('admin');

運行標籤為 auth 的所有測試:

./vendor/bin/pest --group=auth

這使得你可以更靈活地運行測試,專注於當前開發的模組或功能。

9. 執行測試

運行 Pest 測試非常簡單,你只需要執行以下命令:

./vendor/bin/pest

這將運行 tests 目錄下的所有測試,並顯示測試結果。如果你只想運行特定的測試或標籤,可以使用前述的 --group 參數或指定測試文件。

10. 擴展與整合

Pest 可以與多種工具和框架整合,如 PHPUnit 的各種擴展(Extensions)、Mockery、Laravel Dusk 等。這使得 Pest 不僅輕量且簡潔,還能滿足大多數專案的測試需求。

結論

Pest 為 Laravel 測試帶來了一種全新的體驗,其簡單且具有表現力的語法大大降低了測試的學習曲線。通過本文,你應該已經掌握了如何使用 Pest 撰寫高效的測試程式,並如何利用其功能來提升代碼質量。無論是單元測試還是功能測試,Pest 都能幫助你輕鬆實現,讓你專注於開發業務邏輯,而非繁瑣的測試撰寫。