はじめに
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は自動的に構成環境を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
ディレクトリに配置されます:
php artisan make:test UserTest
テストをtests/Unit
ディレクトリ内に作成したい場合は、--unit
オプションを使用してmake:test
コマンドを実行できます:
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
並行してテストを実行する際には、--do-not-cache-result
のような一部のPest / PHPUnitオプションは利用できない場合があります。
並行テストとデータベース
プライマリデータベース接続が構成されている限り、Laravelは自動的にテストデータベースを作成し、各並行プロセスでテストを実行します。テストデータベースには、プロセスごとにユニークなプロセストークンが接尾辞として付けられます。たとえば、2つの並行テストプロセスがある場合、Laravelはyour_db_test_1
およびyour_db_test_2
テストデータベースを作成して使用します。
デフォルトでは、テストデータベースはtest
Artisanコマンドへの呼び出しの間に保持され、次のtest
呼び出しで再利用できます。ただし、--recreate-databases
オプションを使用して再作成することもできます:
php artisan test --parallel --recreate-databases
並行テストフック
時折、アプリケーションのテストで使用される特定のリソースを準備する必要がある場合があります。これにより、複数のテストプロセスで安全に使用できるようになります。
``````php
<?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();
テストカバレッジの報告
アプリケーションのテストを実行する際、テストケースが実際にアプリケーションコードをカバーしているか、テストを実行する際にどれだけのアプリケーションコードが使用されているかを確認したい場合があります。これを実現するために、--coverage
オプションをtest
コマンドを呼び出す際に提供できます:
php artisan test --coverage
最小カバレッジ閾値の強制
アプリケーションの最小テストカバレッジ閾値を定義するには、--min
オプションを使用できます。この閾値が満たされない場合、テストスイートは失敗します:
php artisan test --coverage --min=80.3
テストのプロファイリング
Artisanテストランナーには、アプリケーションの最も遅いテストをリストする便利なメカニズムも含まれています。--profile
オプションを使用してtest
コマンドを呼び出すと、最も遅い10のテストのリストが表示され、どのテストを改善してテストスイートを高速化できるかを簡単に調査できます:
php artisan test --profile