PHPUnitでは環境変数の読み込み順番に注意しよう


はじめに

  • 引き継いだプロダクトのローカル環境がつらみだった
  • Dockerで開発環境を作り直すことにした
  • 旧環境では通っていたPHPUnitテストが失敗する事象が発生

上記問題の原因が環境変数読み込み順に関係するものでした
環境変数の読み込み順を気にしたことなかったので(PHP初心者)備忘録

対象読者

  • docker-composeのenv_fileで環境変数をロードしている
  • PHPUnitのバージョンが6.5以下
  • 環境変数のロード順がわかっていない

原因

PHPUnitではデフォルトとして複数の環境変数の読み込みがあった際、後続の読み込み時に同じkeyの環境変数があっても上書きされないという仕様

  • 元々テストが通っていた時の環境変数の読み込み順

    • リポジトリの直下に.envphpunit.xmlを配置、PHPUnitの環境変数読み込み順として以下のようになっていた
    • 環境変数の読み込み順 phpunit.xml.env
  • Dockerで環境を用意した時の環境変数のロード

    • .envファイルをdocker-composeのenv_fileを利用して読み込むようにしていた
    • コンテナ起動時に`.envの環境変数読み込みが走る
    • 環境変数の読み込み順 .envphpunit.xml

.envの環境変数をテスト時に上書きできなくなり失敗していた

解決方法

PHPUnitを6.5以上にアップデート

$ composer remove phpunit/phpunit --dev
$ composer require phpunit/phpunit:6.5.13 --dev

phpunit.xmlの環境変数のオプション追加

force="true"をつけると環境変数を上書くことができるようになる

phpunit.xml
    <php>
        <env name="APP_ENV" value="testing" force="true"/>
        <env name="CACHE_DRIVER" value="array" force="true"/>
        <env name="SESSION_DRIVER" value="array" force="true"/>
        <env name="QUEUE_DRIVER" value="sync" force="true"/>
        <env name="DB_DATABASE" value="db_test" force="true"/>
    </php>

参考リンク