【Laravel】テストコードの基本と実装手順まとめ

Laravel

Laravelでアプリケーションを開発するにあたり、堅牢性を保つための「テスト実装」の基本手順をまとめました。未来の自分に向けた備忘録です。

1. Laravelのテスト環境の基本

Laravelには標準で PHPUnit(または Pest)が組み込まれており、最初からテストを書き始められる環境が整っています。テストの種類は大きく分けて以下の2つです。

  • Feature(機能テスト): HTTPリクエストを送信し、コントローラーやデータベースの動きを含めたシステム全体の挙動を検証する(基本はこちらをメインに書く)。
  • Unit(単体テスト): クラスやメソッドなど、コードの小さな断片が正しく動作するかを個別に検証する。

2. テストの準備(環境構築)

テスト用のデータベースを準備します。本番や開発環境のデータを壊さないよう、テスト実行時はメモリ内データベース(SQLite)や専用のテスト用DBを使用します。

phpunit.xml の設定

プロジェクトルートにある phpunit.xml(または .env.testing)で、テスト時の環境変数を設定します。ここでは高速化のために SQLite のメモリバッファを使用する設定例です。

XML
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>

3. テストファイルの作成

職人コマンド(Artisan)を使ってテストクラスを生成します。

Bash
# Featureテストを作成する場合
php artisan make:test UserRegistrationTest

# Unitテストを作成する場合(--unitフラグをつける)
php artisan make:test UserTest --unit

作成されたファイルは tests/Feature/UserRegistrationTest.php に保存されます。


4. 基本的なテストコードの書き方

以下は、ユーザー登録機能(Featureテスト)の具体的な実装例です。

PHP
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use App\Models\User;

class UserRegistrationTest extends TestCase
{
    // テスト実行ごとにデータベースをリセット・マイグレーションするトレイト
    use RefreshDatabase;

    /**
     * ユーザー登録画面にアクセスできるかテスト
     */
    public function test_registration_screen_can_be_rendered(): void
    {
        // 1. GETリクエストを送信
        $response = $this->get('/register');

        // 2. ステータスコードが200であることを検証
        $response->assertStatus(200);
    }

    /**
     * 新しいユーザーが登録できるかテスト
     */
    public function test_new_users_can_register(): void
    {
        // 1. 送信するデータを用意
        $userData = [
            'name' => 'Test User',
            'email' => '[email protected]',
            'password' => 'password123',
            'password_confirmation' => 'password123',
        ];

        // 2. POSTリクエストを送信
        $response = $this->post('/register', $userData);

        // 3. リダイレクト先を確認(例: ホーム画面へ)
        $response->assertRedirect('/home');

        // 4. データベースにデータが保存されているか検証
        $this->assertDatabaseHas('users', [
            'email' => '[email protected]',
        ]);
    }
}

💡 覚えておくべき重要ポイント

  • use RefreshDatabase; を忘れない:テストごとにデータをクリアして独立性を保つため。
  • テストメソッド名は test_ で始める か、PHPの属性(#[Test])やアノテーション(/ @test */)を付ける。

5. よく使うアサーション(検証)メソッド

テスト結果が正しいか判定するために、以下のメソッドを頻繁に使用します。

メソッド用途
$response->assertStatus(200)レスポンスのHTTPステータスコードを検証
$response->assertRedirect('/url')指定したURLにリダイレクトされたか検証
$this->assertDatabaseHas('table', [...])DBに指定したデータが存在するか検証
$this->assertDatabaseMissing('table', [...])DBに指定したデータが存在しないか検証
$this->getJson('/api/user')APIのJSONレスポンスをテストする場合に使用

6. テストの実行

準備ができたら、以下のコマンドでテストを実行します。

Bash
# すべてのテストを実行
php artisan test

# 特定のファイルだけを実行
php artisan test tests/Feature/UserRegistrationTest.php

# 特定のメソッドだけを実行
php artisan test --filter test_new_users_can_register

まとめ

Laravelのテストは、標準ツールやトレイト(RefreshDatabase など)が強力なため、比較的低いハードルで書き始めることができます。「機能を追加したらテストを書く」を習慣化し、リファクタリングを怖がらない開発環境を維持しましょう。

コメント