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 など)が強力なため、比較的低いハードルで書き始めることができます。「機能を追加したらテストを書く」を習慣化し、リファクタリングを怖がらない開発環境を維持しましょう。



コメント