【Laravel】Laravel Dusk時に使用される .env ファイル
Laravel Dusk は Laravel で手軽にブラウザテストを行うためのライブラリです。
とても便利なライブラリですが、通常のユニットテストと環境変数ファイルに関する動作が大きく異なっているため注意が必要です。
通常使用される .env
--env
で設定されるパラメータまたは 環境変数 APP_ENV で使用されるファイルが決まり、例えば --env=environment
とした場合には .env.environment が使用されます。
phpunit を実行すると phpunit.xml の設定によって APP_ENV=testing
が自動で設定されるため、 .env.testing が使用されます。
Laravel Dusk で使用される .env
まず Laravel Dusk はユニットテストと異なり2つのプロセスが走ることを理解する必要があります。
- テストを実行するプロセス
- テストでアクセスする対象のプロセス
テストを実行するプロセス
Laravel Dusk は前述のユニットテストとは異なり環境変数などは設定されません。
php artisan dusk
したがってテストを実行するプロセスでは .env が使用されます。ただしこの .env は後述の機能によって生成されたものです。
--env
で明示的にパラメータを指定することで他の .env を使用することが可能です。
php artisan dusk --env=environment
⇒ .env.environment
テスト対象のプロセス
Laravel Dusk によって起動するプロセスでは .env が使用されます。ただしこの .env も後述の機能によって生成されたものです。
.env の生成
Laravel Dusk 起動時に --env
または 環境変数 environment によって .env.dusk.{environment} が .env にコピーされます。
通常は何も指定していない状態(local)のため、.env.dusk.local が .env にコピーされ、それらが共通して『テストを実行するプロセス』と『テスト対象のプロセス』で使用されます。
ただし、テスト対象のプロセスでは起動時に元の .env を読みこみ、その後生成した .env で上書きする動作のため、上書きされないものはそのまま設定が残ります。
この動作によってテストがうまくいかない場合があるため注意が必要です。
例えば通常は mysql を使用していて、テストの時は sqlite を使用する場合を考えます。
# 通常時
DB_CONNECTION=mysql
DB_DATABASE=laravel
# テスト時
DB_CONNECTION=sqlite
sqlite は DB_DATABASE を指定しない場合は database ディレクトリ下に database.sqlite という名前でDBが作成されます。
しかし上の例の場合は .env で DB_DATABASE=laravel が設定されますがテスト時の設定では指定していないため設定が残り、プロジェクトルートに laravel という名前でDBが作成されます。
一方テスト対象のプロセスは既に生成されている .env を読みこむだけなので、DB_DATABASE は設定されていない状態であり、database ディレクトリ下の database.sqlite が使用されます。
したがってテストを実行するプロセスでログイン用のユーザを作成してその情報でログインするテストを行った場合に、テスト対象のプロセスの使用するDBは別であるためログインはもちろん失敗してしまいます。
私の考えるベストプラクティス
- テストを実行するプロセスとテスト対象のプロセスの使用するDBが共通
- テストを実行するプロセスが元の .env の状態に影響を受けない(予期せぬ動作を避ける)
は満たしておいたほうがよいでしょう。
テストを実行するプロセスは local ではないパラメータで実行
元の .env の影響を受けないように --env
でパラメータを明示的に指定します。
ここでは例として dusk とします。
php artisan dusk --env=dusk
すると、テストを実行するプロセスでは 通常使用される .env の通り .env.dusk が使用され、さらに .env の生成 の通り .env.dusk.dusk が .env にコピーされます。
DB設定の共通化
前述のように .env が使用されるため、.env.dusk と .env.dusk.dusk の設定を同じにすることで共通のDBを使用することが可能です。
補足
.env の内容が反映されない
config がキャッシュされているのが影響している可能性が高いです。
Laravel Dusk テスト時は以下のコマンドでキャッシュをクリアしておいたほうがよいです。
php artisan config:clear