mcpField
L
laravel-testing

laravel-testing

github.com/fusengineテスト・品質3486 回インストール2 日前に更新
リポジトリ

laravel-testing について

Pest と PHPUnit を使う Laravel 13 プロジェクト向けのテストスキルです。機能・ユニット・アーキテクチャテストに加え、HTTP やデータベースのアサーション、モック、フェイク、コンソールテスト、シーディング属性を扱います。

主な機能

  1. 01機能・ユニット・アーキテクチャテスト
  2. 02Pest の構文とデータセット
  3. 03HTTP とデータベースのアサーション
  4. 04モックとフレームワークのフェイク
  5. 05Artisan テストとシーディング属性

活用シーン

  1. 01HTTP エンドポイントと JSON API のテスト
  2. 02サービスやポリシーのロジックの分離テスト
  3. 03ファクトリーによるデータベース状態の確認
  4. 04外部サービス、メール、キュー、イベントのフェイク

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fusengine/claude-plugins --skill laravel-testing

インストール後、Claude Code で/laravel-testingを入力して読み込まれたか確認します。

詳細

Laravel 13 のテストを Pest 5 / PHPUnit 13(PHP 8.3 では Pest 4 / PHPUnit 12)で行う方法を扱います。フィーチャーテスト(HTTP、フルスタック)、ユニットテスト(分離されたクラス)、アーキテクチャテスト、Pest の構文(it/test/describe)、データセット、HTTP テスト(リクエスト、JSON アサーション、認証/actingAs、ステータス/リダイレクトのアサーション)、データベーステスト(RefreshDatabase、ファクトリ、DB アサーション)、モック(サービス、スパイ、Mail/Queue/Event フェイク、Http::fake、タイムトラベル)、コンソール/Artisan コマンドのテスト、PHPUnit 属性ベースのシーディング(#[Seed]、#[Seeder])をカバーします。

Laravel テスト

エージェントワークフロー(必須)

いかなる実装の前にも、3 つのエージェントを並列で起動してください。それぞれ name を指定した Agent 呼び出し 1 回です。

  1. fuse-ai-pilot:explore-codebase - 既存のテストパターンを分析
  2. fuse-ai-pilot:research-expert - Context7 経由で Pest/PHPUnit のドキュメントを確認
  3. mcp__context7__query-docs - アサーションとモックのパターンを確認

実装後は、検証のために fuse-ai-pilot:sniper を実行してください。


概要

種類目的場所
フィーチャーHTTP、フルスタックtests/Feature/
ユニット分離されたクラスtests/Unit/
アーキテクチャコードアーキテクチャtests/Arch.php

判断ガイド: テストの種類

What to test?
├── HTTP endpoint → Feature test
├── Service/Policy logic → Unit test
├── Code structure → Arch test
├── External API → Mock with Http::fake()
├── Mail/Queue/Event → Use Fakes
└── Database state → assertDatabaseHas()

判断ガイド: テスト戦略

Coverage strategy?
├── Feature tests (70%) → Critical flows
├── Unit tests (25%) → Business logic
├── E2E tests (5%) → User journeys
└── Arch tests → Structural rules

重要なルール

  1. RefreshDatabase を使用する - データベースの分離のため
  2. ファクトリを使用する - テストデータ用(生の insert は決して使わない)
  3. 外部サービスをモックする - 実際の API を決して呼び出さない
  4. エッジケースをテストする - 空、null、境界値
  5. 並列実行する - 速度のために pest --parallel

リファレンスガイド

Pest の基本
トピックリファレンス参照すべきとき
Pest の構文pest-basics.mdit()、test()、describe()
データセットpest-datasets.mdデータプロバイダー、フック
アーキテクチャpest-arch.mdarch() テスト
HTTP テスト
トピックリファレンス参照すべきとき
リクエストhttp-requests.mdGET、POST、ヘッダー
JSON APIhttp-json.mdAPI アサーション
認証http-auth.mdactingAs、ガード
アサーションhttp-assertions.mdステータス、リダイレクト
データベーステスト
トピックリファレンス参照すべきとき
基本database-basics.mdRefreshDatabase
ファクトリdatabase-factories.mdファクトリのパターン
アサーションdatabase-assertions.mdDB アサーション
モック
トピックリファレンス参照すべきとき
サービスmocking-services.mdMock、スパイ
フェイクmocking-fakes.mdMail、Queue、Event
HTTP と時間mocking-http.mdHttp::fake、travel
その他
トピックリファレンス参照すべきとき
コンソールconsole-tests.mdArtisan テスト
トラブルシューティングtroubleshooting.mdよくあるエラー
テンプレート
テンプレート使用すべきとき
FeatureTest.php.mdHTTP フィーチャーテスト
UnitTest.php.mdサービスのユニットテスト
ArchTest.php.mdアーキテクチャテスト
ApiTest.php.mdREST API テスト
PestConfig.php.mdPest の設定

クイックリファレンス

// Feature test
it('creates a post', function () {
    $user = User::factory()->create();

    $this->actingAs($user)
        ->postJson('/api/posts', ['title' => 'Test'])
        ->assertCreated()
        ->assertJsonPath('data.title', 'Test');

    $this->assertDatabaseHas('posts', ['title' => 'Test']);
});

// With dataset
it('validates emails', function (string $email, bool $valid) {
    // test logic
})->with([
    ['[email protected]', true],
    ['invalid', false],
]);

// Mock facade
Mail::fake();
// ... action ...
Mail::assertSent(OrderShipped::class);

コマンド

# Run all tests
php artisan test

# Pest directly
./vendor/bin/pest

# Parallel execution
./vendor/bin/pest --parallel

# Filter by name
./vendor/bin/pest --filter "user can"

# Coverage
./vendor/bin/pest --coverage --min=80

# Profile slow tests
./vendor/bin/pest --profile

ベストプラクティス

DO
  • RefreshDatabase トレイトを使用する
  • AAA パターン(Arrange-Act-Assert)に従う
  • 内容が分かるテスト名を付ける
  • 1つのテストにつき1つのことをテストする
  • データにはファクトリーを使用する
DON'T
  • テストの依存関係を作成しない
  • 実際の外部 API を呼び出さない
  • 本番データベースを使用しない
  • エッジケースを省略しない

Laravel 13 に関する注意事項

PHPUnit 12/13 + Pest 4/5

Laravel 13 のスケルトンには PHPUnit 12(^12.5)が含まれています。また、フレームワークは PHPUnit 13 にも対応しています。Pest 5(現行版。PHP 8.4+ と PHPUnit 13 が必要で、さらに Laravel ^13.23 が必要な pestphp/pest-plugin-laravel ^5.0 も必要です)を使用するか、アプリで PHP 8.3 を使い続ける場合は Pest 4(PHPUnit 12)を使用してください。PHP 属性が docblock アノテーションに置き換わります。

use PHPUnit\Framework\Attributes\Test;
use Illuminate\Foundation\Testing\Attributes\Seed;
use Illuminate\Foundation\Testing\Attributes\Seeder;

#[Seed]                          // runs DatabaseSeeder
#[Seeder(UserSeeder::class)]     // runs a targeted seeder
final class UserTest extends TestCase
{
    #[Test]
    public function it_creates_user(): void { /* ... */ }
}
Str ファクトリーのリセット

Laravel 13 では、テストのティアダウン時にカスタム Str ファクトリー(UUID/ULID/ランダム文字列)がリセットされます。ファクトリーがメソッド間で維持されることを前提とするテストでは、各テストまたはセットアップフックで設定してください。

#[UnitTest](L13)

テストメソッドに Illuminate\Foundation\Testing\Attributes\UnitTest を付けると、そのテストではアプリケーションの起動がスキップされます。

Pest 3 から 4 への移行
  • pestphp/pest とすべての Pest プラグインを ^4.0 にアップグレードします(PHP 8.3+、PHPUnit 12)
  • スナップショット名が変更されました。./vendor/bin/pest --update-snapshots を実行します
  • pest-plugin-watch と pest-plugin-faker はアーカイブ済みです
Pest 4 から 5 への移行
  • PHP 8.4+ が必要です。pestphp/pest とすべての Pest プラグインを ^5.0 にアップグレードします(PHPUnit 13 ベース)
  • 5 での新機能:--tia(テスト影響分析。ローカルのみ)、公式の PHPStan/Rector プラグイン、Agent および Evals プラグイン、時間均衡型シャーディング

コメント