PhpStorm+Docker+PHPUnitでのデータベースを使用したテストについて

気がつけば前回の投稿より数ヶ月空いてしまいました。

今回はタイトルにある通りDocker環境下でPHPUnitを実行した際にデータベースを使用したテストでつまづいた点を備忘録として紹介したいと思います。

構成

2023年5月20日時点での環境を以下の通り示します。

  • PhpStorm 2023.1.2
  • Docker 23.0.5, build bc4487a
  • Docker Compose v2.17.3

コンテナ構成

Dockerコンテナの構成を以下の通り示します。

(docker-compose.ymlについては割愛します)

  • php(Laravelが動作するAPサーバー)
  • nginx(WEBサーバー)
  • mysql_test(テスト用DBサーバー)

今回データベースを使用したテストでつまづいた点と解決方法について

問題点

「php_network_getaddresses: getaddrinfo failed: Name or service not known」のエラーが発生が発生し、PHPUnitでデータベースへ接続できませんでした。

解決方法(試したこと)

PhpStormの設定が悪いのではないかと思い、PhpStormの内容を確認しました。

「PhpStorm」→「Settings…」→「PHP」→「テストフレームワーク」にPHPUnitnの設定があるのでそちらを確認してみることにしました。

するとローカル環境を参照していることに気づきました。(下図参照)

そこで「+」ボタンをクリックし、「リモートインタープリターによるPHPUnit」を選択して設定を追加しました。

インタープリターは「Docker」内のPHPを使用するように設定しました。

この設定でPhpStormからPHPUnitを実行かけてみたところ上述のエラーが発生してしまいました。

それはそのはずで何も考えずに「Docker」を選択してしまったことで、phpコンテナしか参照されずmysql_testコンテナの参照ができていなかったためです。

今回のようにphpコンテナとdbコンテナが別れている場合は、「Docker Compose」を使用するのが正しいです。

この設定でできるはずと思い、PhpStormからPHPUnitを実行かけてみたところまたまた上述のエラーが発生してしまいました。

今度はphpunit側の設定が悪いのではないかとphpunit.xmlを確認しました。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>

        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="DB_CONNECTION" value="mysql"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
    </php>
</phpunit>

phpタグ内の内容についても悪くなく.env.testingもプロジェクトルートに存在していました。

設定は悪くないと判断しテストコード内でデバッグし、envの中身をウォッチしました。

するとenv('DB_HOST') = nullと表示されていました。.env.testingも存在するのにどうして読み込まれていないかが分かりませんでした。

そこでコンテナの再起動やコンテナのビルド等を行なってみましたが症状は変わりませんでした。

php artisan tinker --env=testingを使用してコマンドライン上でenv('DB_HOST')を確認したところこちらもnullが表示されました。

ここで、envファイルのキャッシュを疑い、php artisan config:cacheコマンドを使用してenvの内容を反映させることにしました。

envの内容が反映されているか確認するためtinkerを使用して確認したところenvの内容が反映されていませんでした。

かなり時間がかかりましたが原因はphp artisan config:clearをしていなかったことでした。

設定の反映をする際はphp artisan config:clearphp artisan config:cacheの順で反映するのが良さそうです。

まとめ

PhpStorm+Docker+PHPUnit環境下でデータベース接続する際の設定は以下の通りだということがわかりました。

  • PhpStormのCLI インタープリターの設定は「Docker Compose」を使用する。
  • envファイルの内容を反映させるためにはphp artisan config:clearphp artisan config:cacheの順で実行する。

割と簡単なことでしたが、結構な時間を費やしました。。。

終わりに

弊社にお仕事を依頼したいお客様がいらっしゃいましたら、以下のフォームもしくはメールにてお気軽にお問い合わせ下さい。

お問合せ

システム開発部 森岡(morioka_tatsuaki@computer-tb.co.jp

  • X