mcpField
L
laravel-testing

laravel-testing

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

laravel-testing について

laravel-testingは、Laravel開発者向けのテストスキルです。PestとPHPUnitによる機能・ユニット・アーキテクチャテストに加え、HTTP、データベース、モック、Artisanコマンドのテスト方法を扱います。

主な機能

  1. 01機能・ユニット・アーキテクチャテスト
  2. 02Pest構文とデータセット
  3. 03HTTPとJSONのアサーション
  4. 04データベース、ファクトリー、アサーション
  5. 05サービス、イベント、HTTPのモック
  6. 06Artisanコマンドのテスト

活用シーン

  1. 01HTTPエンドポイントと一連の処理の検証
  2. 02サービスやポリシーのロジックのテスト
  3. 03コードのアーキテクチャ規則の確認
  4. 04外部API、メール、キュー、イベントのフェイク

インストール

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

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

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
console-tests.md
database-assertions.md
database-basics.md
database-factories.md
http-assertions.md
http-auth.md
http-json.md
http-requests.md
mocking-fakes.md
mocking-http.md
mocking-services.md
pest-arch.md
pest-basics.md
pest-datasets.md
troubleshooting.md
references/templates/
ApiTest.php.md
ArchTest.php.md
FeatureTest.php.md
PestConfig.php.md
UnitTest.php.md

詳細

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 プラグイン、時間均衡型シャーディング

コメント