LaravelでPHPUnitを使ったテストをする準備
Laravel にて PHPUnit を実行するために、.env.testing 等は使用せず、
たった3つの手順でテストの実行環境を整える、自分用の備忘録です。
開発およびテスト環境
Docker (Docker Compose) を使用して構築しています。
※環境の準備には以下の記事を参考にさせていただきました。
https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4
テストの準備
開発環境のデータベース設定については、以下の通りです。
- データベース名: laravel
- ユーザー名: laravel
- パスワード: secret
1. テスト用のデータベースを追加
以下の SQLコマンド を実行します。
(ユーザーは、開発環境のものを使い回す想定で、権限を追加するのみです)
CREATE DATABASE IF NOT EXISTS `laravel_testing`;
GRANT ALL ON laravel_testing.* TO 'laravel'@'%';
FLUSH PRIVILEGES;
2. テスト時に使用するデータベース設定を追加
phpunit.xml
へ、以下のように追記をする事で、
テスト時にデータベースを自動的に切り替えてテストしてくれます。
<server name="DB_DATABASE" value="laravel_testing"/>
3. テストのコマンドを実行
テストのコマンドは以下のようなものを使っています。
Makefile などに準備しておくと便利かもです。
test:
./vendor/bin/phpunit -v --coverage-text --colors --stderr
失敗例とその解決方法
Laravel にて、PHPUnit を実行しようとした際に、testing 用のデータベースを
準備しているにも関わらず、開発環境が上書きされてしまう事例に遭遇しました。
(正確には、テスト以降のDBが laravel_testing
を参照してしまう)
解決方法としては、Docker Compose の設定にて
php のコンテナに、以下のように環境変数を設定していたことでした。
- DB_DATABASE=laravel
- DB_USERNAME=laravel
- DB_PASSWORD=secret
Laravel の DB接続設定については、.env
ファイルにて行えますので、
そちらに任せて、上記を削除したことで期待通りに動くようになりました。