Skip to content

テスト: はじめに

イントロダクション

Laravelはテストを念頭に置いて構築されています。実際、PestPHPUnitによるテストのサポートはデフォルトで含まれており、アプリケーション用にphpunit.xmlファイルもすでに設定されています。また、フレームワークには、アプリケーションを表現豊かにテストできる便利なヘルパーメソッドも付属しています。

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

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

FeatureUnitテストディレクトリの両方にExampleTest.phpファイルが用意されています。新しいLaravelアプリケーションをインストールした後、vendor/bin/pestvendor/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ディレクトリ内にテストを作成したい場合は、make:testコマンドを実行する際に--unitオプションを使用できます:

php artisan make:test UserTest --unit

Note

テストスタブは、スタブの公開を使用してカスタマイズできます。

テストが生成されたら、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
{
    /**
     * 基本的なテスト例。
     */
    public function test_basic_test(): void
    {
        $this->assertTrue(true);
    }
}

Warning

テストクラス内で独自のsetUp / tearDownメソッドを定義する場合、親クラスのparent::setUp() / parent::tearDown()メソッドをそれぞれ呼び出すようにしてください。通常、独自のsetUpメソッドの先頭でparent::setUp()を、tearDownメソッドの末尾でparent::tearDown()を呼び出すべきです。

テストの実行

前述のように、テストを書いたら、pestまたはphpunitを使用して実行できます:

```shell tab=Pest ./vendor/bin/pest

```shell tab=PHPUnit
./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

Warning

テストを並列実行する場合、一部のPest / PHPUnitオプション(例:--do-not-cache-result)は利用できない場合があります。

並列テストとデータベース

プライマリデータベース接続を設定している場合、Laravelは自動的にテストを実行する各並列プロセスのためにテストデータベースを作成および移行します。テストデータベースには、プロセスごとに一意のプロセストークンが付加されます。たとえば、2つの並列テストプロセスがある場合、Laravelは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();

テストカバレッジのレポート

Warning

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

アプリケーションのテストを実行する際に、テストケースが実際にアプリケーションコードをカバーしているか、どれだけのアプリケーションコードがテスト実行時に使用されているかを確認したい場合があります。これを実現するには、testコマンドを呼び出す際に--coverageオプションを提供します:

php artisan test --coverage

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

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

php artisan test --coverage --min=80.3

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

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

php artisan test --profile

ユーザーノート