テスト:はじめに
イントロダクション
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` コマンドを実行してテストを実行します。
環境
テストを実行すると、Laravelは `phpunit.xml` ファイルで定義されている環境変数のために、設定環境 を自動的に `testing` に設定します。Laravelはまた、セッションとキャッシュを `array` ドライバーに自動的に設定するため、テスト中にセッションまたはキャッシュデータが永続化されることはありません。.
必要に応じて、他のテスト環境設定値を自由に定義できます。`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はテストを実行している各並列プロセスに対してテストデータベースの作成と移行を自動的に処理します。テストデータベースには、プロセスごとに一意のプロセストークンが付加されます。たとえば、2つの並列テストプロセスがある場合、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 テストランナーには、アプリケーションの最も遅いテストを一覧表示するための便利なメカニズムも含まれています。`test` コマンドを `--profile` オプション付きで実行すると、最も遅い 10 個のテストのリストが表示され、テストスイートを高速化するためにどのテストを改善できるかを簡単に調べることができます。
php artisan test --profile