テスト:利用の開始
イントロダクション
Laravelはテストを念頭に置いて構築されています。実際、PestとPHPUnitによるテストのサポートが最初から含まれており、phpunit.xmlファイルはアプリケーション用にすでに設定済みです。フレームワークには、アプリケーションを表現力豊かにテストできる便利なヘルパメソッドも同梱しています。
デフォルトで、アプリケーションのtestsディレクトリには、FeatureとUnitの2つのディレクトリがあります。ユニットテストは、コードの非常に小さい、分離された部分に焦点を当てたテストです。実際、ほとんどのユニットテストはおそらく単一のメソッドに焦点を当てています。「Unit」テストディレクトリ内のテストはLaravelアプリケーションを起動しないため、アプリケーションのデータベースやその他のフレームワークサービスにアクセスできません。
機能テストは、複数のオブジェクトが互いにどのように相互作用するか、JSONエンドポイントへの完全なHTTPリクエストなど、コードのより広い部分をテストします。一般的に、ほとんどのテストは機能テストであるべきです。これらのタイプのテストは、システム全体が意図したとおりに機能しているという最大の自信をもたらします。
ExampleTest.phpファイルがFeatureとUnitの両方のテストディレクトリに用意されています。新しいLaravelアプリケーションをインストールした後、vendor/bin/pest、vendor/bin/phpunit、またはphp artisan testコマンドを実行してテストを実行します。
環境
テストを実行すると、phpunit.xmlファイルで定義されている環境変数により、Laravelは自動的に設定環境をtestingに設定します。また、Laravelはセッションとキャッシュを自動的にarrayドライバに設定するため、テスト中にセッションやキャッシュのデータは永続化されません。
必要に応じて、他のテスト環境の設定値を自由に定義できます。testing環境変数は、アプリケーションの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
テストスタブはスタブ公開を使用してカスタマイズできます。
テストが生成されたら、通常どおり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パッケージを「dev」依存関係としてインストールする必要があります。次に、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はテストを実行している各並列プロセス用のテストデータベースの作成とマイグレーションを自動的に処理します。テストデータベースには、プロセスごとに一意のプロセストークンが接尾辞として付きます。たとえば、2つの並列テストプロセスがある場合、Laravelはyour_db_test_1とyour_db_test_2のテストデータベースを作成して使用します。
デフォルトでは、テストデータベースはtest Artisanコマンドの呼び出し間で永続化されるため、後続のtestの呼び出しで再利用できます。ただし、--recreate-databasesオプションを使用して再作成できます。
1php artisan test --parallel --recreate-databases
並列テストフック
場合によっては、複数のテストプロセスで安全に使用できるように、アプリケーションのテストで使用する特定のリソースを準備する必要があります。
ParallelTestingファサードを使用して、プロセスまたはテストケースのsetUpとtearDownで実行するコードを指定できます。指定するクロージャは、プロセストークンと現在のテストケースをそれぞれ含む$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コマンドを呼び出すと、最も遅い10個のテストのリストが表示され、テストスイートを高速化するためにどのテストを改善できるかを簡単に調査できます。
1php artisan test --profile