mcpField
S
speeding-up-laravel-tests

speeding-up-laravel-tests

github.com/freekmurzeテスト・品質1.0k38 回インストール1 週間前に更新
リポジトリ

speeding-up-laravel-tests について

Laravel 開発者向けに、遅いテストスイートの環境設定、外部処理のフェイク、データベース負荷、プロファイリングを整理したチェックリストです。手間の少ない設定変更から確認できます。

主な機能

  1. 01テスト環境設定の調整
  2. 02外部処理のフェイク
  3. 03データベース準備負荷の軽減
  4. 04遅いテストの分析

活用シーン

  1. 01時間のかかる CI テストの短縮
  2. 02個別テストの遅延原因の調査
  3. 03新規プロジェクト用チェックリストの作成

インストール

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

$npx skills add https://github.com/freekmurze/dotfiles --skill speeding-up-laravel-tests

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

詳細

Laravel のテストを高速化する

Laravel のテストスイートを高速化するための厳選したテクニックです。おおむね記載順に適用してください。環境の修正は、通常、最小限の手間で最大の効果が得られます。

使いどき

  • テストスイートの平均実行時間が、テスト1件あたり数秒を超えている場合。
  • CI の所要時間が伸びており、数分短縮したい場合。
  • 特定のテストが遅く、実際に何をしているのか調べたい場合。
  • 新しいプロジェクトに参加するにあたり、標準的なチェックリストが必要な場合。

環境と設定

  • .env.testing(または phpunit.xml)で BCRYPT_ROUNDS=4 を設定します。 デフォルトは12で、認証テストではハッシュ処理が大きな負荷になります。
  • XDebug を無効にします。 カバレッジが必要な場合を除き、規模の大きい環境では pcov も無効にします。
  • テスト環境ではバックグラウンドパッケージを無効にします。 Pulse、Telescope、Nightwatch など、リクエストやコマンドごとに処理を行うサードパーティ製パッケージが対象です。
  • WithCachedConfig と WithCachedRoutes トレイトを使用して、 テストごとに設定やルートを再解析しないようにします。
  • テストのセットアップで withoutVite()(または withoutMix())を呼び出し、 フレームワークがビルド済みアセットを解決しようとしないようにします。

外部とのやり取りをフェイクする

テスト対象ではない外部サービスとのやり取りは、すべてフェイクしてください。

  • Notification::fake()、Mail::fake()、Bus::fake()、Event::fake()、Queue::fake()。
  • ジョブをディスパッチする HTTP エンドポイント: ジョブの動作を検証するテストでない限り、キューをフェイクします。そうしないと、ジョブがインラインで実行され、ジョブが依存するあらゆるものが読み込まれます。
  • イベントリスナー: 無関係なリスナーが発火して処理を行う場合は、それらを Event::fake() でフェイクします。遅いテスト中に何が発火しているかを調べるには、Laravel のイベントシステムを使用してください。
  • テストスイートで Http::preventingStrayRequests() を使用します。 たった1つの遅い意図しないリクエストでも、すべてのテストに悪影響を及ぼす可能性があります。これは Laravel の HTTP クライアント経由のリクエストのみを検出する点に注意してください。Guzzle/cURL の直接使用は別途調査してください。
  • Sleep::fake(syncWithCarbon: true) を使用して、 リトライやバックオフで実際にスリープしないようにします。PHP の sleep() ではなく、コードで Sleep ヘルパーを使用する必要があります。
  • Exceptions::fake() を使用して、 テスト内から Flare/Sentry/Bugsnag に報告していないことを確認します。

データベース

  • RefreshDatabase の代わりに LazilyRefreshDatabase を使用します。 DB に一度もアクセスしないテストでは、マイグレーションやテーブルの切り詰めにかかるコストを完全に省けます。
  • ファクトリーの使用状況を監査します。 ファクトリーは、テストに必要な数を超えるモデルを簡単に作成してしまうため、よくあるボトルネックです。ネストした create() 呼び出しが余分な行を生成していないか確認してください。
  • $factory->recycle($model) を使用して、 共有する親モデルを一度だけ作成し、ネストしたファクトリー呼び出しに渡します。各ネストしたファクトリーが個別に親モデルを作成するのを防げます。

プロファイリングと診断

  • ./vendor/bin/pest --profile を実行すると、 シャードごとに最も遅いテストが表示されます。まずはここから始めましょう。上位10件に見られるパターンは、スイート全体にも当てはまることがよくあります。
  • https://marmelab.com/phpunit-d3-report/ でテストスイートを可視化できます。 (もともとは PHPUnit 向けです。Pest との互換性を確認してください。)
  • 遅いテストの原因がわからない場合は、イベントリスナーを計測するか、一時的なログを追加して、裏で発生している予期しない処理を見つけてください。

クイックリファレンス

領域対応
ハッシュ処理BCRYPT_ROUNDS=4
デバッガーXDebug を無効化、pcov を無効化
バックグラウンドパッケージPulse、Telescope、Nightwatch を無効化
設定/ルートWithCachedConfig、WithCachedRoutes
アセットwithoutVite() / withoutMix()
外部サービスNotification::fake()、Mail::fake()、Bus::fake()、Event::fake()、Queue::fake()
HTTPHttp::preventingStrayRequests()
スリープSleep::fake(syncWithCarbon: true)
例外Exceptions::fake()
DBLazilyRefreshDatabase
ファクトリー$factory->recycle($model)、ネストした create() を監査
プロファイリングpest --profile

よくある間違い

  • テストでデータベースにアクセスしない場合でも、すべてのテストで RefreshDatabase を有効にする。
  • 実際の sleep() を呼び出したり、本番コードで Carbon を使用したりするため、Sleep::fake() を活用できなくなる。
  • Queue::fake() を追加したまま、ジョブの副作用をアサートする(副作用は発生しません)。
  • テストが失敗した場合に備えて、XDebug を読み込んだ状態でテストスイートを実行する。
  • .env.testing を作成していないため、BCRYPT_ROUNDS をデフォルトのままにする。

コメント