Obake Engineer Blog

【Laravel】PHPUnit実行時に開発用DBを初期化してしまわないために

2022/09/10

結論

テスト実行前に必ず php artisan config:clear を実行してcacheファイルを削除しておく。
そうしないとphpunit.xmlの設定が適用されずに、cacheに残っている開発用のenv設定が適用され、開発用のDBで RefreshDatabase が起こってしまう。

Version
・PHP 8.0
・Laravel 9.2

失敗した話

Laravel開発において、設定などを変更したり、migrationを実行した際に php artisan optimize も一緒に実行していた。

データ最適化コマンドだからやり得だろうと思っていたが、これが原因でPHPUnit実行時に開発用DBが初期化さてしまっていた。

php artisan optimize

php artisan optimize は以下のコマンドを同時に実行するコマンドである。

php artisan config:cache
php artisan route:cache

このうち php artisan config:cache はconfigディレクトリ配下をキャッシュするコマンドだが、そのキャッシュファイルは.envに書いてある環境変数をベースに作成される。

そして、このキャッシュファイルはPHPUnit設定用ファイルであるphpunit.xmlよりも適用優先度が高くなってしまうため、キャッシュファイルが存在した状態でテストを実行すると、テスト用のDBではなく開発用のDBでテストを実行してしまう。

そのため、テスト実行時に開発用のDBで RefreshDatabase が実行されてしまっていた。

対策

テスト実行前に以下コマンドを実行して、キャッシュされているconfigファイルを削除する。

php artisan config:clear

もしくは、そもそも開発時にcacheファイルを作成しない。 公式にもそう書いてある。

参考

/post-15

【Laravel】PHPUnit実行時に開発用DBを初期化してしまわないために

obake
Obake Engineer Blog