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

イントロダクション

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

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

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

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

環境

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

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

.env.testing環境ファイル

さらに、プロジェクトのルートに.env.testingファイルを作成することもできます。このファイルは、PHPUnitテストを実行するとき、または--env=testsオプションを指定して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

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

テストを生成したら、PHPUnitを使用する場合と同様にテストメソッドを定義します。テストを実行するには、ターミナルからvendor/bin/phpunitまたはphpartisantestコマンドを実行します。

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    /**
     * 基本的なテスト例
     *
     * @return void
     */
    public function test_basic_test()
    {
        $this->assertTrue(true);
    }
}

Note: テストクラスに独自の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はデフォルトで、単一のプロセス内でテストを順番に実行します。しかし、複数のプロセス間で同時にテストを実行し、テスト時間を大幅に削減できます。これを利用開始するには、最初にアプリケーションの依存パッケージへバージョン^5.3以上のnunomaduro/collisionを確実に含めてください。それから、test Artisanコマンドを実行するときに、--parallelオプションを指定します。

php artisan test --parallel

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

php artisan test --parallel --processes=4

Note: テストをぱられる実行すると、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;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 全アプリケーションサービスの初期起動処理
     *
     * @return void
     */
    public function boot()
    {
        ParallelTesting::setUpProcess(function ($token) {
            // ...
        });

        ParallelTesting::setUpTestCase(function ($token, $testCase) {
            // ...
        });

        // テストデータベースが作成されたときに実行される
        ParallelTesting::setUpTestDatabase(function ($database, $token) {
            Artisan::call('db:seed');
        });

        ParallelTesting::tearDownTestCase(function ($token, $testCase) {
            // ...
        });

        ParallelTesting::tearDownProcess(function ($token) {
            // ...
        });
    }
}

並列テストトークンへのアクセス

アプリケーションのテストコードの他の場所から、現在の並列プロセスの「トークン」にアクセスしたい場合は、tokenメソッドを使用します。このトークンは個々のテストプロセスのための一意な整数の識別子であり、並列テストプロセス間でリソースを分割するために使用できます。例えば、Laravelは各並行テストプロセスで作成するテストデータベースの末尾に、このトークンを自動的に付加します。

$token = ParallelTesting::token();

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュを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)へ移動

その他

?

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