本文へ移動
Laravel Tips

テストのはじめかた

テスト(プログラムが正しく動くかを確かめるプログラム)の置き場所・作り方・動かし方と、並列実行・カバレッジ・設定キャッシュの使い方を説明します。

テストとは、プログラムが思いどおりに動くかを、プログラム自身に確かめさせるしくみです。手で画面を開いて試す代わりに、ボタン1つ(コマンド1つ)で何度でも確かめられます。Laravel には、Pest と PHPUnit という2つのテスト道具が最初から入っています。テストの設定ファイル phpunit.xml も用意されています。

テストの種類と置き場所#

新しい Laravel のアプリには、tests フォルダの中に Feature と Unit の2つのフォルダがあります。

名前 説明
Unit(ユニットテスト) コードのごく小さな部分だけを確かめるテスト。多くは1つのメソッドが対象です。アプリを起動しないので、データベースなどの Laravel の機能は使えません
Feature(フィーチャーテスト) もっと大きな範囲を確かめるテスト。いくつかのオブジェクト(クラスから作った部品)の組み合わせや、JSON を返す窓口への HTTP リクエストまで通して確かめられます

ヒント

公式ドキュメントでは、ふつうはフィーチャーテストを多く書くよう勧めています。システム全体が思いどおりに動いていることを、いちばん確かに確かめられるからです。

どちらのフォルダにも ExampleTest.php が入っています。新しいアプリを作ったら、まず次のどれかを実行してみましょう。

  • vendor/bin/pest
  • vendor/bin/phpunit
  • php artisan test

テストの環境#

テストを動かすとき、Laravel は phpunit.xml に書かれた環境変数(設定の値)を使って、設定の環境を自動で testing にします。セッションとキャッシュも array ドライバー(その場のメモリにだけ置く方式)になるので、テスト中のデータはどこにも残りません。

必要なら、ほかのテスト用の設定値を phpunit.xml に足せます。足したあとは、テストの前に config:clear という Artisan コマンドで設定のキャッシュを消してください。

.env.testing ファイル#

プロジェクトの一番上に .env.testing を置くと、Pest や PHPUnit でテストを動かすとき、.env の代わりにこのファイルが読まれます。Artisan コマンドに --env=testing を付けて動かしたときも同じです。.env については設定と .envを見てください。

テストを作る#

新しいテストは make:test という Artisan コマンド(php artisan で動かす Laravel のコマンド)で作ります。何も付けなければ tests/Feature に置かれます。

bash
php artisan make:test UserTest

tests/Unit に作りたいときは --unit を付けます。

bash
php artisan make:test UserTest --unit

テストのクラスの多くは Laravel の機能を使うけれど、1つのメソッドだけは Laravel を起動しなくてよい、という場合は、そのメソッドに #[UnitTest] という PHP の属性(クラスやメソッドの前に書く印)を付けます。そのテストだけ、アプリを起動せずに動きます。

php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\Attributes\UnitTest;
use Tests\TestCase;

class LocationServiceTest extends TestCase
{
    public function test_get_coordinates_resolves_address(): void
    {
        // このテストは Laravel のテスト機能を使う
    }

    #[UnitTest]
    public function test_get_state_returns_state_from_abbreviation(): void
    {
        // このテストはアプリを起動せずに動く
    }
}

補足

テストの雛形(ひながた)は、自分用に変えられます。雛形のファイル(スタブ)をアプリの中へ書き出して直す方法です。くわしくは Artisan コマンドを見てください。

作ったあとは、Pest か PHPUnit のふつうの書き方でテストを書きます。公式ドキュメントの例は次のとおりです。

Pest で書くとき:

php
<?php

test('basic', function () {
    expect(true)->toBeTrue();
});

PHPUnit で書くとき:

php
<?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 で動かせます。

Pest のとき:

bash
./vendor/bin/pest

PHPUnit のとき:

bash
./vendor/bin/phpunit

もう1つ、test という Artisan コマンドでも動かせます。こちらは結果をくわしく表示してくれるので、開発中の原因探しに便利です。

bash
php artisan test

pest や phpunit に渡せる引数は、test コマンドにも渡せます。

bash
php artisan test --testsuite=Feature --stop-on-failure

並列で動かす#

ふつうは、テストは1つのプロセス(動いているプログラム)の中で順番に動きます。複数のプロセスで同時に動かすと、かかる時間を大きく減らせます。まず brianium/paratest というパッケージを、Composer(PHP の部品を入れる道具)で開発用に入れます。そのあと test コマンドに --parallel を付けます。

bash
composer require brianium/paratest --dev

php artisan test --parallel

プロセスの数は、ふつうはパソコンの CPU のコアの数と同じです。--processes で変えられます。

bash
php artisan test --parallel --processes=4

注意

並列で動かすときは、Pest / PHPUnit の一部のオプション(たとえば --do-not-cache-result)が使えないことがあります。

並列実行とデータベース#

主になるデータベースの接続を設定してあれば、Laravel は並列のプロセスごとに、テスト用のデータベースを自動で作り、マイグレーション(データベースの表を作ったり変えたりする手順書)も流します。データベースの名前の終わりには、プロセスごとに違う番号(トークン)が付きます。たとえばプロセスが2つなら、your_db_test_1 と your_db_test_2 が作られて使われます。

テスト用のデータベースは、test コマンドを動かし終えても残り、次の実行で使い回されます。作り直したいときは --recreate-databases を付けます。

bash
php artisan test --parallel --recreate-databases

並列実行のフック#

テストで使う何かを、複数のプロセスから安全に使えるよう準備したいことがあります。ParallelTesting ファサード(:: で呼べる窓口)を使うと、プロセスやテストケース(テスト1つ1つ)の準備・後始末のときに動くコードを書けます。渡すクロージャ(名前のない関数)は、プロセスのトークンを $token、いまのテストを $testCase で受け取ります。

php
<?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) {
            // ...
        });

        // テスト用データベースが作られたときに動く
        ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
            Artisan::call('db:seed');
        });

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

        ParallelTesting::tearDownProcess(function (int $token) {
            // ...
        });
    }
}
フック 説明
setUpProcess プロセスの準備のときに動く
setUpTestCase 各テストケースの準備のときに動く
setUpTestDatabase テスト用データベースが作られたときに動く
tearDownTestCase 各テストケースの後始末のときに動く
tearDownProcess プロセスの後始末のときに動く

並列実行のトークンを取り出す#

テストのコードのどこからでも、いまのプロセスのトークンは token メソッドで取り出せます。トークンは、プロセスごとに違う文字列です。資源(ファイルなど)をプロセスごとに分けるのに使えます。Laravel も、テスト用データベースの名前の終わりにこれを付けています。

php
$token = ParallelTesting::token();

カバレッジを調べる#

注意

この機能には、PHP の拡張機能の Xdebug か PCOV が必要です。

カバレッジとは、テストがアプリのコードのどれだけを実際に動かしたかの割合です。test コマンドに --coverage を付けると調べられます。

bash
php artisan test --coverage

最低ラインを決める#

--min で、カバレッジの最低ラインを決められます。ラインに届かないと、テスト全体が失敗になります。

bash
php artisan test --coverage --min=80.3

遅いテストを調べる#

--profile を付けると、いちばん遅い10個のテストの一覧が出ます。どのテストを直せば速くなるかが分かります。

bash
php artisan test --profile

設定のキャッシュ#

テストを動かすとき、Laravel はテストのメソッド1つごとにアプリを起動します。設定のキャッシュ(まとめて取っておいたファイル)が無いと、そのたびにすべての設定ファイルを読みこみます。WithCachedConfig というトレイト(クラスに部品を足すしくみ)を使うと、設定を1回だけ作って、その実行のあいだ使い回せます。

Pest のとき:

php
<?php

use Illuminate\Foundation\Testing\WithCachedConfig;

pest()->use(WithCachedConfig::class);

// ...

PHPUnit のとき:

php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\WithCachedConfig;
use Tests\TestCase;

class ConfigTest extends TestCase
{
    use WithCachedConfig;

    // ...
}

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧