JetBrains IDEでLaravel使うときのPHPUnit設定あれこれ


JetBrains 製 IDE で Laravel を使う際に、PHPUnit の設定で躓きました。
なお、使っているのは IntelliJ IDEA (試用版)ですが、おそらく PhpStorm でも同じだと思います。

大前提

  • Laradock でプロジェクト作成済み
  • バージョン
    • Laravel
      • 5.7.19
    • PHP
      • 7.2.4

テスト実行しても DB 接続できない

前提

  • php artisan migrate でテーブル作成済み
  • テーブルからデータ取得するモデル作成済み

事象

モデルをテストするコードを書いて、IDE から実行すると、以下のメッセージが出ました。

PDOException : SQLSTATE[08006] [7] could not translate host name "postgres" to address: Name or service not known

ちなみに、プロジェクト名/.env は以下のように設定済みです。とくに問題はなさそうです。1

プロジェクト名/.env
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=shopping
DB_USERNAME=default
DB_PASSWORD=secret

ところが、コンテナの中に入って、phpunit tests/ を実行してみると、問題なく動きました。
ここで IDE の設定を確認すると・・・
- Preference -> Language & Frameworks -> PHP -> CLI Interpreters

PHP のバージョンを認識しているので問題なさそうに見えますが、実は、ここで Docker を選択していることが原因でした。

これを以下のように Docker Compose を選択するように修正すると、IDE からも正常にテスト実行することができるようになりました。

副作用?

上記設定を実行したところ、テスト実行するたびに、コンテナが終了するようになりました。

Time: 1.7 seconds, Memory: 14.00MB

OK (4 tests, 4 assertions)
laradock_shop_workspace_1 exited with code 0
Aborting on container exit...

Process finished with exit code 0

IDE からコンテナ起動しようとすると、一旦起動するものの、すぐに終了してしまうので、少し不便です。ターミナルで docker-compose up -d nginx workspace とすると正常に起動するので実害はないかもしれませんが・・・。

検索すると、フォーラム で質問が上がっているのが見つかりました。どうやらテスト実行するたびにコンテナを起動して、コンテナ終了するのが現在の仕様だそうで 。回避策も載っているけど、どれも今ひとつな気が・・・。どなたか、いい方法ご存知でしたら、ご教示くださいませ。2

テスト結果を色付けしたい

躓いたわけではないのですが、意外と忘れがちなのでメモしておきます。

前提

PHPUnit では、デフォルトでは色付け表示されません。しかし、--colors オプションを付けることで色付けされるようになります。これと同じことを IDE でもやりたいと思いました。

設定方法

Laravel で作ったプロジェクトの中を見ると、PHPUnit の設定ファイル phpunit.xml があります。これを見ると、colors="true" とあり、色付け表示がすでに設定済みでした。

プロジェクト名/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">

ということで、IDE で phpunit.xml を読み込むように設定しました。
- Preference -> Language & Frameworks -> PHP -> Test Frameworks
- 「Default configuration file」に phpunit.xml のパスを設定します。

まとめ

IDE の設定って、めんどくさいですね...


  1. 普通は mysql なのでしょうが、普通でないことをしたくて postgres にしました。今思えば止めとけば良かった(苦笑) 

  2. そもそも、おとなしくデフォルトの MySQL のままにしておけば問題ないのかもしれませんね。試してないから分かりませんが。