測試:開始使用
簡介
Laravel 的設計以測試為核心。事實上,對 Pest 和 PHPUnit 的測試支援已內建,並且已為您的應用程式設定好 phpunit.xml 檔案。此框架還提供方便的輔助方法,讓您能夠以表達性方式測試您的應用程式。
預設情況下,您應用程式的 tests 目錄包含兩個目錄:Feature 和 Unit。單元測試是專注於程式碼中非常小且隔離的部分的測試。事實上,大多數單元測試可能都專注於單一方法。「Unit」測試目錄中的測試不會啟動您的 Laravel 應用程式,因此無法存取您應用程式的資料庫或其他框架服務。
功能測試可以測試程式碼的較大部分,包括多個物件如何彼此互動,甚至是對 JSON 端點的完整 HTTP 請求。一般來說,您的大部分測試應該是功能測試。這些類型的測試能夠最大程度地確保整個系統能夠按照預期運作。
ExampleTest.php 檔案在 Feature 和 Unit 測試目錄中皆有提供。在安裝新的 Laravel 應用程式後,執行 vendor/bin/pest、vendor/bin/phpunit 或 php artisan test 命令來執行您的測試。
環境
執行測試時,由於 phpunit.xml 檔案中定義的環境變數,Laravel 會自動將組態環境 設定為 testing。Laravel 也會自動將 session 和快取設定為 array 驅動程式,以便在測試期間不會持久化任何 session 或快取資料。
您可以根據需要自由定義其他測試環境設定值。testing 環境變數可以在您應用程式的 phpunit.xml 檔案中設定,但請務必在使用您的測試之前,使用 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
可以使用樣板發布來自訂測試樣板。
產生測試後,您可以使用 Pest 或 PHPUnit 定義測試,如同您平常會做的那樣。若要執行測試,請從終端機執行 vendor/bin/pest、vendor/bin/phpunit 或 php artisan test 命令
<?php test('basic', function () { expect(true)->toBeTrue();});
<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; class ExampleTest extends TestCase{ /** * A basic test example. */ public function test_basic_test(): void { $this->assertTrue(true); }}
如果您在測試類別中定義自己的 setUp / tearDown 方法,請務必在父類別上呼叫對應的 parent::setUp() / parent::tearDown() 方法。通常,您應該在自己 setUp 方法的開頭呼叫 parent::setUp(),並在 tearDown 方法的結尾呼叫 parent::tearDown()。
執行測試
如先前所述,一旦您撰寫了測試,您可以使用 pest 或 phpunit 來執行它們
./vendor/bin/pest
./vendor/bin/phpunit
除了 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
當並行執行測試時,某些 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 外觀模式,您可以指定在程序或測試案例的 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