Dockerでテスト用PostgreSQLコンテナを作る場合、開発用DBとは別にテスト専用コンテナを用意する方法があります。
docker-compose.yml(テスト用DB追加)
開発用とテスト用を分離した構成例:
postgres: # 開発用PostgreSQL(既存)
image: postgres:18
container_name: laravel_postgres
environment:
POSTGRES_DB: laravel_dev
POSTGRES_USER: laravel_user
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
volumes:
- postgres_dev_data:/var/lib/postgresql
postgres-test: # テスト用PostgreSQL(新規追加)
image: postgres:18
container_name: laravel_postgres_test
environment:
POSTGRES_DB: laravel_test
POSTGRES_USER: test_user
POSTGRES_PASSWORD: test_pass
ports:
- "5433:5432" # 開発用とポート差別化
volumes:
- postgres_test_data:/var/lib/postgresql
volumes:
postgres_dev_data:
postgres_test_data:
.env.testing設定
.encv.testing
textDB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=laravel_test
DB_USERNAME=test_user
DB_PASSWORD=test_pass
phpunit.xml設定
<php>
<env name="APP_ENV" value="testing"/>
<env name="DB_CONNECTION" value="pgsql"/>
<env name="DB_HOST" value="localhost"/>
<env name="DB_PORT" value="5432"/>
<env name="DB_DATABASE" value="laravel_test"/>
<env name="DB_USERNAME" value="test_user"/>
<env name="DB_PASSWORD" value="test_pass"/>
</php>
運用手順
# コンテナ起動(開発用+テスト用)
docker-compose up -d
# テスト用DB確認
docker ps
# appコンテナに入る
docker exec -it laravel_app bash
# マイグレーション(テスト環境)
php artisan migrate --env=testing
# テスト実行
php artisan test
🚨 Docker + Laravel テストDB接続の落とし穴と解決法 🚨
私の場合、appコンテナでDB接続をハードコードしていたので、.env.testingが無視されていました。
services:
app:
environment:
- DB_HOST=postgres
- DB_DATABASE=laravel_dev
# → php artisan test → 開発用DBに接続
テスト実行しても → localhost:5432(開発用DB)に繋がってしまいます。
解決策として、シンプルにappコンテナ内で指定している、environmentを削除すると、.env.testingの中身を見てくれるようになりました。