laravel-tdd について
laravel-tddは、Pest PHPとLaravelのテストパターンを用いるLaravel向けTDDスキルです。実装前にテストを作成して失敗を確認し、その後に実装とリファクタリングを進めます。
主な機能
- 01RED–GREEN–REFACTORサイクル
- 02Pest PHPとLaravelのテストパターン
- 03データベース・認可・APIテスト
- 04Laravel機能の検証チェックリスト
活用シーン
- 01テスト先行でのLaravel機能開発
- 02バグ修正やAPIエンドポイントのテスト
- 03マイグレーション・検証・認可の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ iserter/ laravel-claude-agents --skill laravel-tddインストール後、Claude Code で/laravel-tddを入力して読み込まれたか確認します。
詳細
Laravel のテスト駆動開発
概要
まずテストを書きます。失敗することを確認します。テストを通すための最小限のコードを書きます。
このスキルでは、Pest PHP、Laravel のテスト機能、フレームワーク固有のパターンを使う Laravel アプリケーション向けに、TDD の原則を取り入れます。
使用するタイミング
Laravel では常に使用します:
- 新機能(コントローラー、モデル、サービス)
- バグ修正
- API エンドポイント
- データベースのマイグレーションとモデル
- フォームのバリデーション
- 認可ポリシー
- キュージョブ
- Artisan コマンド
- ミドルウェア
例外(人間のパートナーに確認してください):
- 使い捨てのプロトタイプ
- 設定ファイル
- ビューのみの変更(ロジックなし)
Laravel の TDD サイクル
RED → Verify RED → GREEN → Verify GREEN → REFACTOR → Repeat
RED - 失敗するテストを書く
Laravel の機能がどのように動作すべきかを示す、最小限のテストを1つ書きます。
フィーチャーテストの例:
<?php
use App\Models\User;
use App\Models\Post;
test('authenticated user can create post', function () {
$user = User::factory()->create();
$this->actingAs($user)
->post('/posts', [
'title' => 'My First Post',
'content' => 'Post content here',
])
->assertRedirect('/posts');
expect(Post::where('title', 'My First Post')->exists())->toBeTrue();
expect(Post::first()->user_id)->toBe($user->id);
});
RED を確認 - 失敗することを確認
php artisan test --filter=authenticated_user_can_create_post
GREEN - 最小限の Laravel コードを書く
テストを通すための最もシンプルな Laravel コードを書きます。
GREEN を確認 - 成功することを確認
php artisan test
REFACTOR - Laravel コードを整理する
GREEN の後にのみ、次の作業を行います:
- 複雑なロジックをサービスとして切り出す
- 認可ポリシーを作成する
- 再利用できるようにクエリスコープを追加する
- 副作用にはイベントを使用する
Laravel 固有のテストパターン
データベースのテスト
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
test('creates post in database', function () {
$user = User::factory()->create();
$this->actingAs($user)
->post('/posts', ['title' => 'Test', 'content' => 'Content']);
$this->assertDatabaseHas('posts', ['title' => 'Test']);
});
認可のテスト
test('user cannot delete others posts', function () {
$user = User::factory()->create();
$post = Post::factory()->create();
$this->actingAs($user)
->delete("/posts/{$post->id}")
->assertForbidden();
});
API のテスト
test('creates post via API', function () {
$user = User::factory()->create();
$this->actingAs($user, 'sanctum')
->postJson('/api/posts', ['title' => 'API Post', 'content' => 'Content'])
->assertCreated();
});
確認チェックリスト
- マイグレーションのテストに合格した
- モデルのリレーションシップをテストした
- コントローラーのアクションをテストした
- バリデーションルールをテストした
- 認可をテストした
- データベースの状態を確認した
- すべてのテストに合格した
- RefreshDatabase を使用した
- ファクトリーを使用した
忘れないでください
Every Laravel feature → Test exists and failed first
Otherwise → Not TDD
コメント
Markdown 対応