Laravelのテスト時の環境切り替え

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

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周辺が元に戻らないので、注意が必要ですね。

今回