Laravel開発時にいつも設定している初期設定です。レンタルサーバー内でLaravelをインストールしてsshしながら開発しているんですが、PHPUnitも実行したいのでその備考録です。(CIも設定しますが手元のソースコードで実行する場合の話)
Laravelは便利なフレームワークの反面、構造上遅くなってしまうのでキャッシュが強力というイメージがあります。ルーティング変更やenvの設定変更やなんやらが最初に理解しづらくてキツかった。
Laravelのインストールをすれば PHPUnit はデフォルトで対応しているものの、phpunit.xml で設定しているenv指定が読まれていないのでおかしいと思っていたら公式で以下の解説がありました
You are free to define other testing environment configuration values as necessary. The
https://laravel.com/docs/9.x/testingtesting
environment variables may be configured in your application’sphpunit.xml
file, but make sure to clear your configuration cache using theconfig:clear
Artisan command before running your tests!
要するに phpunit.xml の設定よりも既存の .env で読まれている内容の方が優先されるので config:clear を実行しろとのこと。
この場合に問題になるのは気軽に phpunit の実行をしてしまうと開発中の画面で表示されているテストデータが消えてしまう場合が考えられます。Laravel Jetstreamなどでユーザー登録機能を作っていた場合には tests/Feature/ 配下にテストファイルが作られており、データベースのリフレッシュが実行されるようになっているので開発画面でのユーザーデータが消えてしまいます。
本来であれば開発中の画面とPHPUnit実行時のデータベースは別で使用されるように設定した方が手戻りなく出来るかと思います。
PHPUnit を実行した場合 (つまり phpunit.xml に記述されている設定)の DB_CONNECTION は sqlite になっていますが、前述の .env の指定が優先されるので毎回 config:clear が必要になる、というのが少し面倒なポイントになっています。
毎回忘れずに実行できる気がしないので自分は以下のコマンドを作成しています。
#!/bin/bash
PHP='/usr/bin/php8.1'
$PHP -r "file_exists('.env.testing') || copy('.env.testing.example', '.env.testing');"
$PHP artisan optimize --env=testing
$PHP artisan migrate --env=testing
$PHP artisan test $@
$PHP artisan optimize
流れとしては .env.testing がなければ作成、 .env.testing を読み込むように optimize してPHPUnit のテスト実行、.env を読み込むようにキャッシュしなおし、をしています。 ( あらかじめ .env.testing.example の作成を忘れずに )
テスト実行時には上記のコマンドを叩けば PHPUnit の実行が出来るので快適です。
終わりに
こちらの記事で chromium-driver が実行できるようになったので、今後はレンタルサーバー内でもLaravelDuskを実行してブラウザテストも出来るようにしていきたいですね。
参考
Laravel で PHPUnit 実行時に .env.testing を見てくれない?
https://qiita.com/shohei_ot/items/de6e2da7ac0c9741904a