測試:入門
📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本
測試:入門
簡介
Laravel 在建構時就考慮了測試。事實上,支援使用 Pest 和 PHPUnit 進行測試是開箱即用的,並且已經為您的應用程式設定了 phpunit.xml 檔案。框架還附帶了方便的輔助方法,允許您表達性地測試您的應用程式。
預設情況下,應用程式的 tests 目錄包含兩個目錄:Feature 和 Unit。單元測試是專注於程式碼中非常小、隔離部分的測試。事實上,大多數單元測試可能專注於單一方法。「Unit」測試目錄中的測試不會啟動 Laravel 應用程式,因此無法存取應用程式的資料庫或其他框架服務。
功能測試可以測試更大範圍的程式碼,包括多個物件如何彼此互動,甚至是對 JSON 端點的完整 HTTP 請求。一般來說,大多數測試都應該是功能測試。這些類型的測試提供了最大的信心,確保您的系統整體按預期運作。
Feature 和 Unit 測試目錄中都提供了一個 ExampleTest.php 檔案。安裝新的 Laravel 應用程式後,執行 vendor/bin/pest、vendor/bin/phpunit 或 php artisan test 命令來運行您的測試。
環境
運行測試時,Laravel 將自動將配置環境設為 testing,這是因為 phpunit.xml 檔案中定義的環境變數。Laravel 還自動將 Session 和快取配置為 array 驅動程式,以便在測試期間不會持久化 Session 或快取資料。
您可以根據需要自由定義其他測試環境配置值。可以在應用程式的 phpunit.xml 檔案中配置 testing 環境變數,但請在運行測試之前使用 config:clear Artisan 命令清除配置快取!
.env.testing 環境檔案
此外,您可以在專案根目錄中建立一個 .env.testing 檔案。此檔案將在運行 Pest 和 PHPUnit 測試或使用 --env=testing 選項執行 Artisan 命令時取代 .env 檔案。
建立測試
要建立新的測試用例,請使用 make:test Artisan 命令。預設情況下,測試將放在 tests/Feature 目錄中:
php artisan make:test UserTest
如果您想在 tests/Unit 目錄中建立測試,可以在執行 make:test 命令時使用 --unit 選項:
php artisan make:test UserTest --unit
如果您有一個主要依賴 Laravel 測試功能的測試類別,但特定測試方法不需要啟動框架,可以將 #[UnitTest] 屬性套用到該方法,以跳過僅為該測試啟動應用程式。
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\Attributes\UnitTest;
use Tests\TestCase;
class LocationServiceTest extends TestCase
{
public function test_get_coordinates_resolves_address(): void
{
// This test uses Laravel's testing features...
}
#[UnitTest]
public function test_get_state_returns_state_from_abbreviation(): void
{
// This test runs without booting the application...
}
}
[!NOTE] 測試模板可以使用模板發佈來自訂。
測試生成後,您可以像平常一樣使用 Pest 或 PHPUnit 定義測試。要運行測試,請從終端執行 vendor/bin/pest、vendor/bin/phpunit 或 php artisan test 命令:
<?php
test('basic', function () {
expect(true)->toBeTrue();
});
[!WARNING] 如果您在測試類別中定義了自己的
setUp/tearDown方法,請務必在父類別上呼叫相應的parent::setUp()/parent::tearDown()方法。通常,您應該在setUp方法的開始呼叫parent::setUp(),在tearDown方法的結尾呼叫parent::tearDown()。
執行測試
如前所述,編寫測試後,您可以使用 pest 或 phpunit 來運行它們:
./vendor/bin/pest
除了 pest 或 phpunit 命令外,您還可以使用 test Artisan 命令來運行測試。Artisan 測試運行器提供詳細的測試報告,以便於開發和除錯:
php artisan test
可以傳遞給 pest 或 phpunit 命令的任何參數也可以傳遞給 Artisan test 命令:
php artisan test --testsuite=Feature --stop-on-failure
平行執行測試
預設情況下,Laravel 和 Pest / PHPUnit 在單一進程中按順序執行您的測試。但是,您可以透過在多個進程中同時運行測試來大幅減少運行測試所需的時間。首先,您應該將 brianium/paratest Composer 套件安裝為「dev」依賴項。然後,在執行 test Artisan 命令時包含 --parallel 選項:
composer require brianium/paratest --dev
php artisan test --parallel
預設情況下,Laravel 將建立與您機器上可用 CPU 核心數一樣多的進程。但是,您可以使用 --processes 選項調整進程數:
php artisan test --parallel --processes=4
[!WARNING] 平行運行測試時,某些 Pest / PHPUnit 選項(如
--do-not-cache-result)可能不可用。
平行測試與資料庫
只要您已配置了主資料庫連線,Laravel 就會自動為每個運行測試的平行進程建立和遷移測試資料庫。測試資料庫將附加一個進程令牌後綴,該令牌對每個進程都是唯一的。例如,如果您有兩個平行測試進程,Laravel 將建立並使用 your_db_test_1 和 your_db_test_2 測試資料庫。
預設情況下,測試資料庫在呼叫 test Artisan 命令之間持久化,以便它們可以被後續的 test 呼叫再次使用。但是,您可以使用 --recreate-databases 選項重新建立它們:
php artisan test --parallel --recreate-databases
平行測試鉤子
有時,您可能需要準備應用程式測試使用的某些資源,以便它們可以被多個測試進程安全使用。
使用 ParallelTesting facade,您可以指定在進程或測試用例的 setUp 和 tearDown 上執行的程式碼。給定的閉包接收分別包含進程令牌和當前測試用例的 $token 和 $testCase 變數:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;
use PHPUnit\Framework\TestCase;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
ParallelTesting::setUpProcess(function (int $token) {
// ...
});
ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
// ...
});
// Executed when a test database is created...
ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
Artisan::call('db:seed');
});
ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
// ...
});
ParallelTesting::tearDownProcess(function (int $token) {
// ...
});
}
}
存取平行測試令牌
如果您想從應用程式測試程式碼中的任何其他位置存取當前平行進程「令牌」,可以使用 token 方法。此令牌是個別測試進程的唯一字串識別碼,可用於跨平行測試進程分割資源。例如,Laravel 自動將此令牌附加到每個平行測試進程建立的測試資料庫的末尾:
$token = ParallelTesting::token();
報告測試覆蓋率
運行應用程式測試時,您可能想確定您的測試用例是否實際覆蓋了應用程式程式碼,以及運行測試時使用了多少應用程式程式碼。要實現此目的,您可以在呼叫 test 命令時提供 --coverage 選項:
php artisan test --coverage
強制最低覆蓋率閾值
您可以使用 --min 選項為應用程式定義最低測試覆蓋率閾值。如果未達到此閾值,測試套件將失敗:
php artisan test --coverage --min=80.3
分析測試
Artisan 測試運行器還包含一個方便的機制,用於列出應用程式最慢的測試。使用 --profile 選項呼叫 test 命令,將顯示最慢的十個測試的列表,讓您可以輕鬆調查哪些測試可以改進以加快測試套件的速度:
php artisan test --profile
配置快取
運行測試時,Laravel 為每個單獨的測試方法啟動應用程式。如果沒有快取的配置檔,必須在測試開始時載入應用程式中的每個配置檔。要建立一次配置並在單次運行中的所有測試中重複使用,可以使用 Illuminate\Foundation\Testing\WithCachedConfig trait:
<?php
use Illuminate\Foundation\Testing\WithCachedConfig;
pest()->use(WithCachedConfig::class);
// ...