Your cart is currently empty!
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 都能幫助你輕鬆實現,讓你專注於開發業務邏輯,而非繁瑣的測試撰寫。