Laravel 10.x テスト: テストの準備

イントロダクション

Laravelはユニットテストも考慮して構築されています。実際、PHPUnitをサポートしており、最初から含まれています。アプリケーションのためにphpunit.xmlファイルも最初から準備されています。さらにフレームワークはアプリケーションを記述的にテストするために便利なヘルパメソッドも用意しています。

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

機能テストでは、複数のオブジェクトが相互作用する方法や、JSONエンドポイントへの完全なHTTPリクエストなど、コードの広い部分をテストします。一般的に、ほとんどのテストは機能テストである必要があります。これらのタイプのテストは、システム全体が意図したとおりに機能しているという信頼性を一番提供します。

ExampleTest.phpファイルはFeatureUnitの両方のテストディレクトリで提供されます。新しいLaravelアプリケーションをインストールした後なら、vendor/bin/phpunitまたはphp artisan testコマンドを実行してテストを実行できます。

環境

テストを実行すると、Laravelはphpunit.xmlファイルで定義してある設定環境により、設定環境を自動的にtestingに設定します。Laravelはまた、テスト中にセッションとキャッシュをarrayドライバに自動的に設定します。つまり、テスト中のセッションまたはキャッシュデータが保持されることはありません。

必要に応じて、他のテスト環境設定値を自由に定義できます。testing環境変数はアプリケーションのphpunit.xmlファイルで設定していますが、テストを実行する前は必ずconfig:clear Artisanコマンドを使用して設定のキャッシュをクリアしてください。

.env.testing環境ファイル

さらに、プロジェクトのルートに.env.testingファイルを作成することもできます。このファイルは、PHPUnitテストを実行するとき、または--env=testingオプションを指定してArtisanコマンドを実行するときに、.envファイルの代わりに使用されます。

CreatesApplicationトレイト

Laravelには、アプリケーションのベースTestCaseクラスに適用されているCreatesApplicationトレイトがあります。このトレイトは、テストを実行する前に、LaravelアプリケーションをブートストラップするcreateApplicationメソッドを持っています。Laravelの並列テスト機能など、いくつかの機能がこのトレイトへ依存しているため、このtraitを元の場所へ残しておくことは重要です。

テストの作成

新しいテストケースを作成するには、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

Note: stubのリソース公開 を使って、Testスタブをカスタマイズできます。

テストを生成したら、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);
    }
}

Warning!! テストクラスに独自のsetUpメソッドを定義する場合は、親のクラスのparent::setUp()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はデフォルトで、単一のプロセス内でテストを順番に実行します。しかし、複数のプロセス間で同時にテストを実行し、テスト時間を大幅に削減できます。これを利用開始するには、"dev"の依存パッケージとしてbrianium/paratest Composerパッケージを確実にインストールしてください。次に、test Artisanコマンドを実行するときに、--parallelオプションを指定します。

composer require brianium/paratest --dev

php artisan test --parallel

デフォルトで、Laravelはマシンで利用可能なCPUコアの数だけ、プロセスを作成します。しかし、--processesオプションでプロセス数を調整できます。

php artisan test --parallel --processes=4

Warning!! テストをパラレル実行すると、PHPUnitのオプション(-do-not-cafy-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

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる