#はじめに
Laravel はテストを念頭に設計されています。実際、PHPUnit によるテストサポートは標準で組み込まれており、phpunit.xml ファイルもアプリケーション用にすでに設定されています。さらに、アプリケーションを表現豊かにテストできる便利なヘルパーメソッドも用意されています。
デフォルトでは、アプリケーションの tests ディレクトリには 2 つのディレクトリが含まれます: Feature と Unit。ユニットテストは、コードの非常に小さく独立した部分に焦点を当てるテストです。実際、ほとんどの場合、ユニットテストは単一のメソッドに焦点を当てます。"Unit" テストディレクトリ内のテストは Laravel アプリケーションを起動しないため、アプリケーションのデータベースやその他のフレームワークサービスにアクセスできません。
Feature テストは、複数のオブジェクトの相互作用や JSON エンドポイントへの完全な HTTP リクエストなど、より大きなコードの範囲をテストします。一般的に、ほとんどのテストは Feature テストであるべきです。これらのテストはシステム全体が意図した通りに動作していることを最も確実に示します。
Feature と Unit の両テストディレクトリには ExampleTest.php ファイルが用意されています。新しい Laravel アプリケーションをインストールした後は、vendor/bin/phpunit または php artisan test コマンドを実行してテストを実行できます。
#環境
テスト実行時、Laravel は phpunit.xml ファイルで定義された環境変数により、自動的に 設定環境 を testing に設定します。また、セッションとキャッシュは array ドライバーに自動設定されるため、テスト中にセッションやキャッシュのデータは永続化されません。
必要に応じて他のテスト環境設定値を自由に定義できます。testing 環境変数はアプリケーションの phpunit.xml ファイルで設定できますが、テスト実行前に必ず config:clear Artisan コマンドで設定キャッシュをクリアしてください。
#.env.testing 環境ファイル
さらに、プロジェクトのルートに .env.testing ファイルを作成できます。このファイルは PHPUnit テスト実行時や --env=testing オプション付きの Artisan コマンド実行時に .env ファイルの代わりに使用されます。
#CreatesApplication トレイト
Laravel はアプリケーションのベース TestCase クラスに適用される CreatesApplication トレイトを含みます。このトレイトはテスト実行前に Laravel アプリケーションを起動する createApplication メソッドを持ちます。Laravel の並列テスト機能など一部の機能が依存しているため、このトレイトは元の場所に残すことが重要です。
#テストの作成
新しいテストケースを作成するには、make:test Artisan コマンドを使います。デフォルトではテストは tests/Feature ディレクトリに作成されます:
php artisan make:test UserTest
tests/Unit ディレクトリにテストを作成したい場合は、make:test コマンド実行時に --unit オプションを指定できます:
php artisan make:test UserTest --unit
Pest PHP のテストを作成したい場合は、make:test コマンドに --pest オプションを指定できます:
php artisan make:test UserTest --pest
php artisan make:test UserTest --unit --pest
テストスタブは スタブの公開 を使ってカスタマイズできます。
テストが生成されたら、通常通り PHPUnit を使ってテストメソッドを定義できます。テストを実行するには、ターミナルから vendor/bin/phpunit または php artisan test コマンドを実行してください:
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的なテスト例です。
*/
public function test_basic_test(): void
{
$this->assertTrue(true);
}
}
テストクラス内で独自に setUp / tearDown メソッドを定義する場合は、必ず親クラスの parent::setUp() / parent::tearDown() を呼び出してください。通常、setUp メソッドの先頭で parent::setUp() を、tearDown メソッドの最後で parent::tearDown() を呼び出します。
#テストの実行
前述の通り、テストを書いたら phpunit を使って実行できます:
./vendor/bin/phpunit
phpunit コマンドに加えて、test Artisan コマンドでもテストを実行できます。Artisan のテストランナーは詳細なテストレポートを提供し、開発やデバッグを容易にします:
php artisan test
phpunit コマンドに渡せる引数はすべて Artisan の test コマンドにも渡せます:
php artisan test --testsuite=Feature --stop-on-failure
#並列テストの実行
デフォルトでは、Laravel と PHPUnit は単一プロセスでテストを順次実行します。しかし、複数プロセスで同時にテストを実行することで、テスト実行時間を大幅に短縮できます。始めるには、brianium/paratest Composer パッケージを開発依存としてインストールしてください。その後、test Artisan コマンドに --parallel オプションを付けて実行します:
composer require brianium/paratest --dev
php artisan test --parallel
デフォルトでは、Laravel はマシンの利用可能な CPU コア数と同じ数のプロセスを作成します。--processes オプションでプロセス数を調整できます:
php artisan test --parallel --processes=4
並列テスト実行時は、--do-not-cache-result など一部の PHPUnit オプションが利用できない場合があります。
#並列テストとデータベース
プライマリデータベース接続を設定していれば、Laravel は並列テストの各プロセス用にテストデータベースを自動で作成・マイグレーションします。テストデータベース名にはプロセストークンが付加され、プロセスごとに一意になります。例えば、2つの並列テストプロセスがある場合、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
{
/**
* アプリケーションサービスの起動処理。
*/
public function boot(): void
{
ParallelTesting::setUpProcess(function (int $token) {
// ...
});
ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
// ...
});
// テストデータベース作成時に実行されます...
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