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 ファイルにて行えますので、
そちらに任せて、上記を削除したことで期待通りに動くようになりました。