LaravelでPHPUnitを実行する時の初期設定

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 testing environment variables may be configured in your application’s phpunit.xml file, but make sure to clear your configuration cache using the config:clear Artisan command before running your tests!

https://laravel.com/docs/9.x/testing

要するに 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を実行してブラウザテストも出来るようにしていきたいですね。

https://rensaba-programer.jp/2022/08/15/レンタルサーバーでselenium-puppeteerを動かす/

参考

Laravel で PHPUnit 実行時に .env.testing を見てくれない?
https://qiita.com/shohei_ot/items/de6e2da7ac0c9741904a

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA