mcpField
L
laravel-tdd

laravel-tdd

github.com/iserterテスト・品質48378 回インストール27 週間前に更新
リポジトリ

laravel-tdd について

laravel-tddは、Pest PHPとLaravelのテストパターンを用いるLaravel向けTDDスキルです。実装前にテストを作成して失敗を確認し、その後に実装とリファクタリングを進めます。

主な機能

  1. 01RED–GREEN–REFACTORサイクル
  2. 02Pest PHPとLaravelのテストパターン
  3. 03データベース・認可・APIテスト
  4. 04Laravel機能の検証チェックリスト

活用シーン

  1. 01テスト先行でのLaravel機能開発
  2. 02バグ修正やAPIエンドポイントのテスト
  3. 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

コメント