Laravelのテスト時の環境切り替え
2024.04.12 09:00
2024.04.11 23:35

Laravelでのテスト時の環境の切り替えに関するメモです。
単体テスト(Unit)と結合テスト(Feature)、E2Eテスト(Browser)の3種類のテストを行うのですが、その時のデータベースの切り替えなどはどうするかなどなどです。
データベースは通常用とテスト用の二つがある想定です。
単体テストと結合テストは.envを使い、phpunitにて実行します。
E2Eテストは.env.dusk.localを使い、Duskにて実行します。
データベースはいずれもテスト用を使用します。
ちなみに環境はlaravel11です。
envファイルは上記でも書いた通り、二つ用意します。
- .env
- .env.dusk.local
まずは.env。
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:XXXXXXXXXXXXXXXXXXXXXXXXX
APP_DEBUG=true
APP_URL=http://localhost:11061
APP_LOCALE=jp
APP_FALLBACK_LOCALE=jp
APP_FAKER_LOCALE=ja_JP
DB_CONNECTION=mariadb
DB_HOST=db
DB_PORT=3306
DB_DATABASE=primary
DB_USERNAME=root
DB_PASSWORD=password
DB_CHARSE=utf8mb4
DB_COLLATION=utf8mb4_bin
DB_TEST_HOST=dbtest
DB_TEST_PORT=3306
DB_TEST_DATABASE=test_primary
DB_TEST_USERNAME=root
DB_TEST_PASSWORD=password
DB_TEST_CHARSE=utf8mb4
DB_TEST_COLLATION=utf8mb4_bin
データベースの設定が通常用とテスト用の二つあります。
普通にアクセスする場合は上のを、テストのときは下に自動的に切り替わります。
つぎにE2E(Dusk)用。
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:XXXXXXXXXXXXXXXXXXXXXXXXX
APP_DEBUG=true
APP_URL=http://web
APP_LOCALE=jp
APP_FALLBACK_LOCALE=jp
APP_FAKER_LOCALE=ja_JP
DOMAIN=localhost:11061
DB_CONNECTION=mariadb
DB_HOST=dbtest
DB_PORT=3306
DB_DATABASE=test_primary
DB_USERNAME=root
DB_PASSWORD=password
DB_CHARSE=utf8mb4
DB_COLLATION=utf8mb4_bin
違いはDBの部分ですね。
通常のDBをテスト用にしています。
実際にDuskでのE2Eテストを走らせると、
「.env」を「.env.backup」にリネームされ、
「.env.dusk.local」をコピーして「.env」になります。
これで実質.env.dusk.localが読み込まれることになるんですね。
テスト時のコマンドはこんな感じ
php ./vendor/bin/phpunit --testsuite Unit
これはphpunit.xmlがプロジェクトルートにある場合です。
phpunit.xmlの中身はこんな感じ。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/11.1/phpunit.xsd" bootstrap="./vendor/autoload.php" colors="true" cacheDirectory=".phpunit.cache">
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">./Unit</directory>
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">./Feature</directory>
</testsuite>
</testsuites>
<php>
<env name="APP_ENV" value="testing" force="true"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="TELESCOPE_ENABLED" value="false"/>
</php>
<source>
<include>
<directory suffix=".php">./app</directory>
</include>
</source>
</phpunit>
違う場所を指定するならこんな感じ
docker-compose exec -T php ./vendor/bin/phpunit -c phpunit.xmlがある場所(ファイル名はいらない) --testsuite Unit
そして、テストが終わったら元の状態に戻してくれます。
なので、処理の途中で強制終了すると、.env周辺が元に戻らないので、注意が必要ですね。
今回