メインコンテンツまでスキップ

テスト: スタートガイド

はじめに

Laravel はテストを意識して構築されています。実際、PestPHPUnit を使用したテストのサポートが最初から含まれており、phpunit.xml ファイルがアプリケーションにすでに設定されています。フレームワークには、アプリケーションを表現的にテストするための便利なヘルパーメソッドも含まれています。

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

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

ExampleTest.php ファイルは、FeatureUnit テストディレクトリの両方に提供されています。新しい Laravel アプリケーションをインストールした後は、vendor/bin/pestvendor/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
注記

stub publishing を使用してテストスタブをカスタマイズすることができます。

テストが生成されたら、通常通り Pest または PHPUnit を使用してテストを定義できます。テストを実行するには、ターミナルから vendor/bin/pestvendor/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がプライマリデータベース接続を構成している限り、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();

テストカバレッジの報告

警告

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

アプリケーションのテストを実行する際に、テストケースが実際にアプリケーションコードをカバーしているかどうか、およびテストを実行する際にどれだけのアプリケーションコードが使用されているかを確認したい場合は、test コマンドを呼び出す際に --coverage オプションを指定できます:

php artisan test --coverage

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

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

php artisan test --coverage --min=80.3

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

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

php artisan test --profile