測試:開始使用
簡介
Laravel 在設計時就已將測試納入考量。事實上,框架開箱即支援使用 Pest 和 PHPUnit 進行測試,並且已為您的應用程式設定好 phpunit.xml
檔案。此外,框架還提供方便的輔助方法,讓您能更具表達性地測試您的應用程式。
預設情況下,您應用程式的 tests
目錄包含兩個子目錄:Feature
和 Unit
。單元測試 (Unit tests) 著重於程式碼中非常小且獨立的部分。實際上,大多數單元測試可能只專注於單一方法。在 "Unit" 測試目錄中的測試不會啟動您的 Laravel 應用程式,因此無法存取您應用程式的資料庫或其他框架服務。
功能測試 (Feature tests) 可以測試程式碼中較大的部分,包括多個物件如何彼此互動,甚至是對 JSON 端點的完整 HTTP 請求。一般而言,您的大部分測試應該是功能測試。這些類型的測試能提供最大的信心,確保您的系統整體運作正常。
在 Feature
和 Unit
測試目錄中都提供了一個 ExampleTest.php
檔案。在安裝新的 Laravel 應用程式後,執行 vendor/bin/pest
、vendor/bin/phpunit
或 php artisan test
命令來執行您的測試。
環境
在執行測試時,由於 phpunit.xml
檔案中定義的環境變數,Laravel 會自動將組態環境設定為 testing
。Laravel 也會自動將 session 和 cache 設定為 array
驅動程式,以便在測試期間不會持久化任何 session 或 cache 資料。
您可以自由地根據需要定義其他測試環境組態值。測試環境變數可以在您應用程式的 phpunit.xml
檔案中設定,但請務必在使用 config:clear
Artisan 命令清除您的組態快取後再執行測試!
`.env.testing` 環境檔案
此外,您可以在專案的根目錄中建立一個 `.env.testing` 檔案。當執行 Pest 和 PHPUnit 測試或使用 `--env=testing` 選項執行 Artisan 命令時,將會使用此檔案來取代 `.env` 檔案。
建立測試
若要建立新的測試案例,請使用 make:test
Artisan 命令。預設情況下,測試將會放置在 tests/Feature
目錄中。
1php artisan make:test UserTest
如果您想在 tests/Unit
目錄中建立測試,您可以在執行 make:test
命令時使用 `--unit` 選項。
1php artisan make:test UserTest --unit
測試骨架 (stub) 可以使用骨架發佈進行自訂。
一旦測試產生後,您可以使用 Pest 或 PHPUnit 以正常方式定義測試。若要執行測試,請從您的終端機執行 vendor/bin/pest
、vendor/bin/phpunit
或 php artisan test
命令。
1<?php2 3test('basic', function () {4 expect(true)->toBeTrue();5});
1<?php 2 3namespace Tests\Unit; 4 5use PHPUnit\Framework\TestCase; 6 7class ExampleTest extends TestCase 8{ 9 /**10 * A basic test example.11 */12 public function test_basic_test(): void13 {14 $this->assertTrue(true);15 }16}
如果您在測試類別中定義了自己的 setUp
/ tearDown
方法,請務必在父類別上呼叫對應的 parent::setUp()
/ parent::tearDown()
方法。一般來說,您應該在自己的 setUp
方法開始時調用 parent::setUp()
,並在 tearDown
方法結束時調用 parent::tearDown()`。
執行測試
如先前所述,一旦您編寫了測試,您可以使用 pest
或 phpunit
執行它們。
1./vendor/bin/pest
1./vendor/bin/phpunit
除了 pest
或 phpunit
命令之外,您也可以使用 test
Artisan 命令來執行您的測試。Artisan 測試執行器提供詳細的測試報告,以簡化開發和除錯。
1php artisan test
任何可以傳遞給 pest
或 phpunit
命令的引數,也可以傳遞給 Artisan test
命令。
1php artisan test --testsuite=Feature --stop-on-failure
平行執行測試
預設情況下,Laravel 和 Pest / PHPUnit 會在單一程序中依序執行您的測試。但是,您可以透過跨多個程序同時執行測試,大幅減少執行測試所需的時間。若要開始使用,您應該將 brianium/paratest
Composer 套件安裝為「開發」相依性。然後,在執行 test
Artisan 命令時加入 `--parallel` 選項。
1composer require brianium/paratest --dev2 3php artisan test --parallel
預設情況下,Laravel 將會建立與您的機器上可用的 CPU 核心數量一樣多的程序。但是,您可以使用 `--processes` 選項來調整程序數量。
1php artisan test --parallel --processes=4
當平行執行測試時,某些 Pest / PHPUnit 選項 (例如 `--do-not-cache-result`) 可能無法使用。
平行測試與資料庫
只要您已設定主要資料庫連線,Laravel 就會自動處理為每個平行執行測試的程序建立和遷移測試資料庫。測試資料庫將會附加一個程序權杖 (token) 作為後綴,每個程序的權杖都是唯一的。例如,如果您有兩個平行測試程序,Laravel 將會建立和使用 your_db_test_1
和 your_db_test_2
測試資料庫。
預設情況下,測試資料庫會在呼叫 test
Artisan 命令之間持續存在,以便後續的 test
調用可以再次使用它們。但是,您可以使用 `--recreate-databases` 選項重新建立它們。
1php artisan test --parallel --recreate-databases
平行測試 Hook (鉤子)
有時,您可能需要準備應用程式測試所使用的某些資源,以便它們可以安全地被多個測試程序使用。
使用 ParallelTesting
facade,您可以指定要在程序或測試案例的 setUp
和 tearDown
時執行的程式碼。給定的閉包 (closure) 會接收 `$token` 和 `$testCase` 變數,分別包含程序權杖和目前的測試案例。
1<?php 2 3namespace App\Providers; 4 5use Illuminate\Support\Facades\Artisan; 6use Illuminate\Support\Facades\ParallelTesting; 7use Illuminate\Support\ServiceProvider; 8use PHPUnit\Framework\TestCase; 9 10class AppServiceProvider extends ServiceProvider11{12 /**13 * Bootstrap any application services.14 */15 public function boot(): void16 {17 ParallelTesting::setUpProcess(function (int $token) {18 // ...19 });20 21 ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {22 // ...23 });24 25 // Executed when a test database is created...26 ParallelTesting::setUpTestDatabase(function (string $database, int $token) {27 Artisan::call('db:seed');28 });29 30 ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {31 // ...32 });33 34 ParallelTesting::tearDownProcess(function (int $token) {35 // ...36 });37 }38}
存取平行測試權杖
如果您想從應用程式測試程式碼中的任何其他位置存取目前的平行程序「權杖」,您可以使用 token
方法。此權杖是個別測試程序的唯一字串識別符,可用於跨平行測試程序區隔資源。例如,Laravel 會自動將此權杖附加到每個平行測試程序所建立的測試資料庫的末尾。
1$token = ParallelTesting::token();
測試覆蓋率報告
當執行應用程式測試時,您可能想確定您的測試案例是否實際上涵蓋了應用程式程式碼,以及在執行測試時使用了多少應用程式程式碼。為了達成此目的,您可以在調用 test
命令時提供 `--coverage` 選項。
1php artisan test --coverage
強制執行最低覆蓋率閾值
您可以使用 `--min` 選項為您的應用程式定義最低測試覆蓋率閾值。如果未達到此閾值,測試套件將會失敗。
1php artisan test --coverage --min=80.3
分析測試效能
Artisan 測試執行器還包含一個方便的機制,可以列出您應用程式中最慢的測試。調用帶有 `--profile` 選項的 test
命令,以顯示您最慢的十個測試的列表,讓您可以輕鬆地調查哪些測試可以改進以加速您的測試套件。
1php artisan test --profile