概要
- laravel8以降でのテスト実行時の環境変数の読み込まれ方についてまとめておく。
注意
- 一部情報で確証が得られていない物があるので誤りがありましたら何なりとコメントいただけますと幸いです。
laravelでテストクラスのテストメソッドを実行する方法
- laravelでテストを実行する方法は大きく分けて2通り存在する。
-
$ ./vendor/bin/phpunit
コマンドを実行するパターン(以降、「phpunitコマンドでテスト実行」と呼称)と、$ php artisan test
コマンドを実行するパターン(以降、「artisanコマンドでテスト実行」と呼称)である。 - どうやらこの2つの方法ごとに環境変数の読まれ方が若干違うようなのでまとめてみる。
phpunitコマンドでテスト実行
-
laravelのプロジェクトディレクトリで下記のように実行することでテストを実行する。
./vendor/bin/phpunit
-
この方法だとphpunit.xmlに記載されている環境変数が読み込まれ、テストが実行される。
-
そのため、テスト用DBへの接続情報などはphpunit.xmlのenvに記載する必要がある。(下記のvalue=の部分をテスト用DBへの接続情報で埋めてゆく)
phpunit.xml<env name="DB_CONNECTION" value=""/> <env name="DB_HOST" value=""/> <env name="DB_DATABASE" value=""/> <env name="DB_USERNAME" value=""/> <env name="DB_PASSWORD" value=""/>
-
phpunitコマンドでテストを実行するとたとえ.env.testingにテスト用の環境変数情報を記載しても読み込まれない(おそらく)
artisanコマンドでテスト実行
-
下記のartisanコマンドを実行することでテストを実行する事ができる。
php artisan test
-
上記の状態だと特に.envが指定されていないのでデフォルトの.env(各環境で動作するときに使われる.env)の内容が読み込まれてテストが実行される。
-
.env.testingを用意している場合、下記のように
--env=testing
のオプションをつけることで.env.testingの環境変数を使ってテストを実行してくれるっぽい。php artisan test --env=testing
-
.env.testingの情報を使ってテストを実行してほしいならこっちを実行する。
-
ただ、PHPUnitが実行されるときにphpunit.xmlはartisanコマンドを使ったテスト実行でも読み込まれているはずである。phpunit.xmlの記載で上書きされたら嫌なので、.env.testingに記載してartisanコマンドでテスト実行するならphpunit.xmlのテスト用DBの接続情報のタグはコメントアウトするか削除したほうがいいかも。(
<env name="DB_CONNECTION" value=""/>
のまま記載されておくと空文字で環境設定がオーバラップされそう、、!ちょっとこの辺は調査不足です。ごめんなさい。)
まとめ
phpunit.xmlにテスト時の環境変数を記載したい人
-
下記コマンドを使ってテストを実行する。
./vendor/bin/phpunit
-
.env.testingを用意して、情報記載しても別に構わないがphpunitコマンドでテスト実行すると.env.testingは読まれない(はず)
.env.testingにテスト時の環境変数を記載したい人
-
下記コマンドを使ってテストを実行する。
php artisan test --env=testing
-
phpunit.xmlも読まれているはずなのでオーバーラップされたくない環境変数のタグはphpunit.xmlから削除かコメントアウトしておいたほうがいいかも。(ただ、artisanコマンドを使って--env=testingを指定してテスト実行すると.env.testingの環境変数が優先されると何処かで読んだ気もするので、削除やコメントアウトの必要はないかも知れない。)