テストのはじめかた
テスト(プログラムが正しく動くかを確かめるプログラム)の置き場所・作り方・動かし方と、並列実行・カバレッジ・設定キャッシュの使い方を説明します。
テストとは、プログラムが思いどおりに動くかを、プログラム自身に確かめさせるしくみです。手で画面を開いて試す代わりに、ボタン1つ(コマンド1つ)で何度でも確かめられます。Laravel には、Pest と PHPUnit という2つのテスト道具が最初から入っています。テストの設定ファイル phpunit.xml も用意されています。
テストの種類と置き場所#
新しい Laravel のアプリには、tests フォルダの中に Feature と Unit の2つのフォルダがあります。
| 名前 | 説明 |
|---|---|
Unit(ユニットテスト) |
コードのごく小さな部分だけを確かめるテスト。多くは1つのメソッドが対象です。アプリを起動しないので、データベースなどの Laravel の機能は使えません |
Feature(フィーチャーテスト) |
もっと大きな範囲を確かめるテスト。いくつかのオブジェクト(クラスから作った部品)の組み合わせや、JSON を返す窓口への HTTP リクエストまで通して確かめられます |
ヒント
公式ドキュメントでは、ふつうはフィーチャーテストを多く書くよう勧めています。システム全体が思いどおりに動いていることを、いちばん確かに確かめられるからです。
どちらのフォルダにも ExampleTest.php が入っています。新しいアプリを作ったら、まず次のどれかを実行してみましょう。
vendor/bin/pestvendor/bin/phpunitphp 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 に置かれます。
php artisan make:test UserTest
tests/Unit に作りたいときは --unit を付けます。
php artisan make:test UserTest --unit
テストのクラスの多くは Laravel の機能を使うけれど、1つのメソッドだけは Laravel を起動しなくてよい、という場合は、そのメソッドに #[UnitTest] という 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
test('basic', function () {
expect(true)->toBeTrue();
});
PHPUnit で書くとき:
<?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 のとき:
./vendor/bin/pest
PHPUnit のとき:
./vendor/bin/phpunit
もう1つ、test という Artisan コマンドでも動かせます。こちらは結果をくわしく表示してくれるので、開発中の原因探しに便利です。
php artisan test
pest や phpunit に渡せる引数は、test コマンドにも渡せます。
php artisan test --testsuite=Feature --stop-on-failure
並列で動かす#
ふつうは、テストは1つのプロセス(動いているプログラム)の中で順番に動きます。複数のプロセスで同時に動かすと、かかる時間を大きく減らせます。まず brianium/paratest というパッケージを、Composer(PHP の部品を入れる道具)で開発用に入れます。そのあと test コマンドに --parallel を付けます。
composer require brianium/paratest --dev
php artisan test --parallel
プロセスの数は、ふつうはパソコンの CPU のコアの数と同じです。--processes で変えられます。
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 を付けます。
php artisan test --parallel --recreate-databases
並列実行のフック#
テストで使う何かを、複数のプロセスから安全に使えるよう準備したいことがあります。ParallelTesting ファサード(:: で呼べる窓口)を使うと、プロセスやテストケース(テスト1つ1つ)の準備・後始末のときに動くコードを書けます。渡すクロージャ(名前のない関数)は、プロセスのトークンを $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
{
/**
* 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 も、テスト用データベースの名前の終わりにこれを付けています。
$token = ParallelTesting::token();
カバレッジを調べる#
カバレッジとは、テストがアプリのコードのどれだけを実際に動かしたかの割合です。test コマンドに --coverage を付けると調べられます。
php artisan test --coverage
最低ラインを決める#
--min で、カバレッジの最低ラインを決められます。ラインに届かないと、テスト全体が失敗になります。
php artisan test --coverage --min=80.3
遅いテストを調べる#
--profile を付けると、いちばん遅い10個のテストの一覧が出ます。どのテストを直せば速くなるかが分かります。
php artisan test --profile
設定のキャッシュ#
テストを動かすとき、Laravel はテストのメソッド1つごとにアプリを起動します。設定のキャッシュ(まとめて取っておいたファイル)が無いと、そのたびにすべての設定ファイルを読みこみます。WithCachedConfig というトレイト(クラスに部品を足すしくみ)を使うと、設定を1回だけ作って、その実行のあいだ使い回せます。
Pest のとき:
<?php
use Illuminate\Foundation\Testing\WithCachedConfig;
pest()->use(WithCachedConfig::class);
// ...
PHPUnit のとき:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\WithCachedConfig;
use Tests\TestCase;
class ConfigTest extends TestCase
{
use WithCachedConfig;
// ...
}
関連するページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。