はじめに

Laravelはテストを念頭に置いて構築されています。実際、PestおよびPHPUnitによるテストのサポートが標準で含まれており、phpunit.xmlファイルはすでにアプリケーション用に設定されています。このフレームワークには、アプリケーションを表現豊かにテストするための便利なヘルパーメソッドも付属しています。

デフォルトでは、アプリケーションのtestsディレクトリには、FeatureUnitの2つのディレクトリが含まれています。ユニットテストは、コードの非常に小さく孤立した部分に焦点を当てたテストです。実際、ほとんどのユニットテストはおそらく単一のメソッドに焦点を当てています。「Unit」テストディレクトリ内のテストはLaravelアプリケーションを起動せず、したがってアプリケーションのデータベースや他のフレームワークサービスにアクセスすることはできません。

フィーチャーテストは、複数のオブジェクトがどのように相互作用するか、またはJSONエンドポイントへの完全なHTTPリクエストを含む、コードのより大きな部分をテストすることがあります。一般的に、ほとんどのテストはフィーチャーテストであるべきです。このタイプのテストは、システム全体が意図した通りに機能しているという最も高い信頼を提供します。

ExampleTest.phpファイルは、FeatureおよびUnitテストディレクトリの両方に提供されています。新しいLaravelアプリケーションをインストールした後、vendor/bin/pestvendor/bin/phpunit、またはphp artisan testコマンドを実行してテストを実行します。

環境

テストを実行する際、Laravelは自動的に構成環境testingに設定します。これは、phpunit.xmlファイルに定義された環境変数によるものです。Laravelはまた、セッションとキャッシュをarrayドライバーに自動的に設定し、テスト中にセッションやキャッシュデータが保持されないようにします。

必要に応じて、他のテスト環境構成値を定義することができます。testing環境変数は、アプリケーションのphpunit.xmlファイルで構成できますが、テストを実行する前にconfig:clear Artisanコマンドを使用して構成キャッシュをクリアすることを忘れないでください!

.env.testing環境ファイル

さらに、プロジェクトのルートに.env.testingファイルを作成することができます。このファイルは、PestおよびPHPUnitテストを実行する際や、--env=testingオプションを使用してArtisanコマンドを実行する際に、.envファイルの代わりに使用されます。

テストの作成

新しいテストケースを作成するには、make:test Artisanコマンドを使用します。デフォルトでは、テストはtests/Featureディレクトリに配置されます:

  1. php artisan make:test UserTest

テストをtests/Unitディレクトリ内に作成したい場合は、--unitオプションを使用してmake:testコマンドを実行できます:

  1. php artisan make:test UserTest --unit

テストスタブはスタブの公開を使用してカスタマイズできます。

テストが生成されたら、通常通りPestまたはPHPUnitを使用してテストを定義できます。テストを実行するには、ターミナルからvendor/bin/pestvendor/bin/phpunit、またはphp artisan testコマンドを実行します:

  1. <?php
  2. test('basic', function () {
  3. expect(true)->toBeTrue();
  4. });
  1. <?php
  2. namespace Tests\Unit;
  3. use PHPUnit\Framework\TestCase;
  4. class ExampleTest extends TestCase
  5. {
  6. /**
  7. * A basic test example.
  8. */
  9. public function test_basic_test(): void
  10. {
  11. $this->assertTrue(true);
  12. }
  13. }

テストクラス内で独自の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テストランナーは、開発とデバッグを容易にするために詳細なテストレポートを提供します:

  1. php artisan test

pestまたはphpunitコマンドに渡すことができる任意の引数は、Artisan testコマンドにも渡すことができます:

  1. php artisan test --testsuite=Feature --stop-on-failure

テストの並行実行

デフォルトでは、LaravelとPest / PHPUnitは、単一のプロセス内でテストを順次実行します。ただし、複数のプロセスで同時にテストを実行することで、テストの実行にかかる時間を大幅に短縮できます。始めるには、brianium/paratest Composerパッケージを「dev」依存関係としてインストールする必要があります。その後、test Artisanコマンドを実行する際に--parallelオプションを含めます:

  1. composer require brianium/paratest --dev
  2. php artisan test --parallel

デフォルトでは、Laravelはマシン上の利用可能なCPUコアの数だけプロセスを作成します。ただし、--processesオプションを使用してプロセスの数を調整できます:

  1. php artisan test --parallel --processes=4

並行してテストを実行する際には、--do-not-cache-resultのような一部のPest / PHPUnitオプションは利用できない場合があります。

並行テストとデータベース

プライマリデータベース接続が構成されている限り、Laravelは自動的にテストデータベースを作成し、各並行プロセスでテストを実行します。テストデータベースには、プロセスごとにユニークなプロセストークンが接尾辞として付けられます。たとえば、2つの並行テストプロセスがある場合、Laravelはyour_db_test_1およびyour_db_test_2テストデータベースを作成して使用します。

デフォルトでは、テストデータベースはtest Artisanコマンドへの呼び出しの間に保持され、次のtest呼び出しで再利用できます。ただし、--recreate-databasesオプションを使用して再作成することもできます:

  1. php artisan test --parallel --recreate-databases

並行テストフック

時折、アプリケーションのテストで使用される特定のリソースを準備する必要がある場合があります。これにより、複数のテストプロセスで安全に使用できるようになります。

  1. ``````php
  2. <?php
  3. namespace App\Providers;
  4. use Illuminate\Support\Facades\Artisan;
  5. use Illuminate\Support\Facades\ParallelTesting;
  6. use Illuminate\Support\ServiceProvider;
  7. use PHPUnit\Framework\TestCase;
  8. class AppServiceProvider extends ServiceProvider
  9. {
  10. /**
  11. * Bootstrap any application services.
  12. */
  13. public function boot(): void
  14. {
  15. ParallelTesting::setUpProcess(function (int $token) {
  16. // ...
  17. });
  18. ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
  19. // ...
  20. });
  21. // Executed when a test database is created...
  22. ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
  23. Artisan::call('db:seed');
  24. });
  25. ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
  26. // ...
  27. });
  28. ParallelTesting::tearDownProcess(function (int $token) {
  29. // ...
  30. });
  31. }
  32. }
  33. `

並行テストトークンへのアクセス

アプリケーションのテストコードの他の場所から現在の並行プロセス「トークン」にアクセスしたい場合は、tokenメソッドを使用できます。このトークンは、個々のテストプロセスのユニークな文字列識別子であり、並行テストプロセス間でリソースをセグメント化するために使用できます。たとえば、Laravelはこのトークンを各並行テストプロセスによって作成されたテストデータベースの末尾に自動的に追加します:

  1. $token = ParallelTesting::token();

テストカバレッジの報告

この機能にはXdebugまたはPCOVが必要です。

アプリケーションのテストを実行する際、テストケースが実際にアプリケーションコードをカバーしているか、テストを実行する際にどれだけのアプリケーションコードが使用されているかを確認したい場合があります。これを実現するために、--coverageオプションをtestコマンドを呼び出す際に提供できます:

  1. php artisan test --coverage

最小カバレッジ閾値の強制

アプリケーションの最小テストカバレッジ閾値を定義するには、--minオプションを使用できます。この閾値が満たされない場合、テストスイートは失敗します:

  1. php artisan test --coverage --min=80.3

テストのプロファイリング

Artisanテストランナーには、アプリケーションの最も遅いテストをリストする便利なメカニズムも含まれています。--profileオプションを使用してtestコマンドを呼び出すと、最も遅い10のテストのリストが表示され、どのテストを改善してテストスイートを高速化できるかを簡単に調査できます:

  1. php artisan test --profile