サイトを更新しています。 数日間、レイアウトや翻訳に不具合が出ることがあります。ドキュメントは引き続きご利用いただけます。表示が崩れている場合は、後ほど再読み込みしてください。

ホーム Laravel 10.x テスト:はじめに

テスト:はじめに

10.x 2026年3月7日

#はじめに

Laravel はテストを念頭に設計されています。実際、PHPUnit によるテストサポートは標準で組み込まれており、phpunit.xml ファイルもアプリケーション用にすでに設定されています。さらに、アプリケーションを表現豊かにテストできる便利なヘルパーメソッドも用意されています。

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

Feature テストは、複数のオブジェクトの相互作用や JSON エンドポイントへの完全な HTTP リクエストなど、より大きなコードの範囲をテストします。一般的に、ほとんどのテストは Feature テストであるべきです。これらのテストはシステム全体が意図した通りに動作していることを最も確実に示します。

FeatureUnit の両テストディレクトリには 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_1your_db_test_2 のテストデータベースが作成されます。

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

php artisan test --parallel --recreate-databases

#並列テストのフック

アプリケーションのテストで使うリソースを複数のテストプロセスで安全に使えるように準備する必要がある場合があります。

ParallelTesting ファサードを使うと、プロセスやテストケースの setUptearDown で実行するコードを指定できます。クロージャにはプロセストークン $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();

#テストカバレッジの報告

Внимание

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

アプリケーションのテストを実行する際、テストケースが実際にどの程度コードをカバーしているか、テスト実行時にどれだけのコードが使われているかを知りたい場合があります。そのために、test コマンド実行時に --coverage オプションを指定できます:

php artisan test --coverage

#最小カバレッジ閾値の設定

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

php artisan test --coverage --min=80.3

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

Artisan のテストランナーには、アプリケーションの遅いテストを一覧表示する便利な機能もあります。test コマンドに --profile オプションを付けて実行すると、最も遅い10件のテストが表示され、どのテストを改善すればテストスイートの高速化につながるか簡単に調査できます:

php artisan test --profile