Docker で Laravel Dusk を利用する方法 - opensource-workshop/connect-cms GitHub Wiki
docker-compose.yml には E2E テスト用の dusk サービス(Selenium Standalone Chrome)が含まれています。
本番開発用の webapp サービスとは分離されており、通常の docker compose up では起動しないよう profiles で制御しています。
Dusk サービスの起動
# Dusk プロファイルを有効にして起動
docker compose --profile dusk up -d dusk
# webapp と合わせて起動したい場合
docker compose --profile dusk up -d webapp dusk
webapp コンテナには既定で DUSK_DRIVER_URL=http://dusk:4444/wd/hub が設定されているため、Dusk テストを走らせる際は上記コマンドで Selenium を起動しておけばそのまま接続できます。
Dusk サービスの停止
docker compose --profile dusk stop dusk
または本体ごと停止する場合は docker compose down を実行してください。
ブラウザ画面の確認(VNC/noVNC)
- VNC クライアントで接続する場合:
localhost:${DUSK_VNC_PORT:-5900}を指定します(パスワードなし)。 - ブラウザから確認したい場合:
http://localhost:${DUSK_NOVNC_PORT:-7900}にアクセスすると noVNC 画面でブラウザ操作をライブ観察できます。
docker-compose.ymlでは各ポート番号を環境変数で上書き可能です。必要に応じて.envやdocker compose実行時に変更してください。
よくある質問
-
なぜデフォルトで起動しないのか?
Selenium イメージの取得やヘルスチェックに失敗すると webapp の起動まで阻害してしまうためです。必要なときだけ--profile duskを指定することで、通常の開発フローへの影響を避けています。 -
任意のブラウザ設定を追加したい
docker-compose.override.ymlを作成し、duskサービスに追加の環境変数やボリュームを上書きしてください。
特定クラスのブラウザテストを単独実行する手順
- Selenium を起動
docker compose --profile dusk up -d dusk - Dusk 用の環境変数を準備
.env.dusk.localを作成し、必要なDUSK_*設定を記述します(無ければ.env.duskを利用)。 - Dusk 用 Seeder の準備
.env.dusk.localにDUSK_AUTO_MIGRATE=trueと
DUSK_SEEDERS="Database\\Seeders\\DatabaseSeeder,Database\\Seeders\\DuskPagesTableSeeder"を設定します。
これにより Dusk 実行前にmigrate:freshとページシーダーが自動で適用され、実行順依存を解消できます。 - 目的のテストクラスを実行
php artisan dusk --filter=FormsPluginTest
(--filter=にはクラス名やメソッド名のプレフィックスを指定できます。PHPUnit を直接使う場合はvendor/bin/phpunit -c phpunit.dusk.xml --filter=FormsPluginTestでも同様に実行可能です。)
- 画面を映したままデバッグしたい場合
.env.dusk.localのDUSK_HEADLESS=falseを設定し、Selenium コンテナの noVNC (http://localhost:${DUSK_NOVNC_PORT:-7900}) へアクセスしてください。
DUSK_* 環境変数
.env.example には Dusk 実行時に参照される設定値(コメントアウト済み)がまとまっています。
Laravel Dusk は php artisan dusk 実行時に、現在の APP_ENV(例: local)を用いて .env.dusk.{APP_ENV} を探し、見つかった場合はその内容を .env として読み込みます。したがってローカル開発では .env.dusk.local を用意すると、本番・開発用設定を汚さずに Dusk 専用の値を切り分けられます。該当するファイルが無ければフォールバックとして .env.dusk が利用されます。Docker で Selenium を使う場合は必要に応じて .env か .env.dusk.{APP_ENV} にコピーして有効化してください。
| 変数名 | 役割 | 既定値/補足 |
|---|---|---|
DUSK_DRIVER |
使用する WebDriver 名。Selenium コンテナに接続する場合は selenium を指定します。 |
指定なし(ChromeDriver 直接接続時は空のままで問題ありません) |
DUSK_DRIVER_URL |
WebDriver の接続 URL。docker compose --profile dusk で起動した Selenium に合わせて http://dusk:4444/wd/hub を指定します。 |
未設定時は http://localhost:9515(ローカル ChromeDriver) |
DUSK_HEADLESS |
true でヘッドレス実行。UI を見ながらデバッグしたい場合は false にします。 |
true |
DUSK_AUTO_MIGRATE |
true にすると Dusk の初回起動前に php artisan migrate:fresh --force を実行します。テスト専用 DB を初期化したい場合に有効化してください。 |
false |
DUSK_SEEDERS |
DUSK_AUTO_MIGRATE と併用。カンマ区切りで Seeder クラスを指定すると migrate:fresh 後に順番に実行されます。例: Database\\Seeders\\DatabaseSeeder,Database\\Seeders\\DuskPagesTableSeeder |
空文字 |
DUSK_NO_MANUAL_ALL |
true でマニュアル生成をスキップ。スクリーンショットのみ取得したい場合に使用します。 |
未設定 |
DUSK_NO_API_TEST_ALL |
true で Dusk 実行時に API テストを除外します。 |
未設定 |