LaravelでPHPUnitを使うときにテスト用の`.env`を設定するのにハマったので記事にしました。
環境
Docker 19.03.8
PHP 7.3.16
Laravel 6.18.3
.env.testingの設定方法
本番DBを汚さないようにPHPUnitを実行する時のみテスト用のDBを使うようなことはよくあると思います。
その方法の一つとして.env.testing
を作成し、phpunitにその設定値を読み込ませるやり方があります。
.env.example
をコピーして.env.testing
を作成し、以下の箇所を変更します。
APP_ENV=testing // testingに変更
APP_KEY= // 空にしておく
// 接続したいDBの情報を設定する
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_database
DB_USERNAME=root
DB_PASSWORD=
そうしたらphpunit.xml
を開き、APP_ENV
の値をtestingに変更します。
<php>
<env name="APP_ENV" value="testing" force="true"/>
<env name="DB_CONNECTION" value="mysql"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="MAIL_DRIVER" value="array"/>
<env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/>
</php>
最後に.env.testing
に新規にアプリケーションキーを設定したら完了です。
これをしないと.env
のAPP_KEY
を参照しに行ってしまい、本番用のDBのデータが全部飛ぶので注意しましょう。
php artisan key:generate --env=testing
ハマったポイント
docker-compose.ymlなどで環境変数にAPP_ENV
やDB_DATABASE
などの設定をしている場合、注意しなくてはいけない点があります。
phpunit.xml
で環境変数を上書きする際に、デフォルトだと<server>
タグになっていますが、これを<env>
タグに変更する必要があります。
<php>
<server name="APP_ENV" value="testing" force="true"/>
<server name="DB_CONNECTION" value="mysql"/>
...
</php>
<php>
<env name="APP_ENV" value="testing" force="true"/>
<env name="DB_CONNECTION" value="mysql"/>
...
</php>
<server>
タグと<env>
タグは以下のような違いになっています。
$_SERVER['APP_ENV'] = 'testing'; // <server>
$_ENV['APP_ENV'] = 'testing'; // <env>
今回はdocker-compose.yml
で環境変数としてAPP_ENV
などを定義していたので、さらにそれを上書きする必要がありました。
参考文献
Laravel 7.x テスト: テストの準備
Laravel × Docker でテスト用のデータベースコンテナを使う